📄 at91.lst
字号:
\ 00000070 001080E5 STR R1,[R0, #+0]
208 __TC_RCC0 = AT91_MCK / 32 / 1000; // Set RC (compare register), 1 ms interval.
\ 00000074 44009FE5 LDR R0,??AT91InitTimer_0+0xC ;; 0xfffffffffffe001c
\ 00000078 401EA0E3 MOV R1,#+1024
\ 0000007C 001080E5 STR R1,[R0, #+0]
209 __TC_CCRC0 = 1; // Enable the clock.
\ 00000080 FF04A0E3 MOV R0,#-16777216
\ 00000084 FE0880E3 ORR R0,R0,#0xFE0000
\ 00000088 0110A0E3 MOV R1,#+1
\ 0000008C 001080E5 STR R1,[R0, #+0]
210 __TC_CCRC0 = 5; // Software trigger.
\ 00000090 FF04A0E3 MOV R0,#-16777216
\ 00000094 FE0880E3 ORR R0,R0,#0xFE0000
\ 00000098 0510A0E3 MOV R1,#+5
\ 0000009C 001080E5 STR R1,[R0, #+0]
211 __TC_CCRC0 = 1; // Clear trigger.
\ 000000A0 FF04A0E3 MOV R0,#-16777216
\ 000000A4 FE0880E3 ORR R0,R0,#0xFE0000
\ 000000A8 0110A0E3 MOV R1,#+1
\ 000000AC 001080E5 STR R1,[R0, #+0]
212 }
\ 000000B0 1EFF2FE1 BX LR ;; return
\ ??AT91InitTimer_0:
\ 000000B4 2800FEFF DC32 0xfffffffffffe0028
\ 000000B8 ........ DC32 heartbeat_irq
\ 000000BC 0400FEFF DC32 0xfffffffffffe0004
\ 000000C0 1C00FEFF DC32 0xfffffffffffe001c
213
\ In segment CODE, align 4, keep-with-next
214 void AT91StartTimer()
215 {
216 #if AT91_EB40 || AT91_EB40A
217 __AIC_ICCR = 0x10; // Clears timer/counter 0 interrupt.
\ AT91StartTimer:
\ 00000000 D700E0E3 MVN R0,#+215
\ 00000004 E00EC0E3 BIC R0,R0,#0xE00
\ 00000008 1010A0E3 MOV R1,#+16
\ 0000000C 001080E5 STR R1,[R0, #+0]
218 #else
219 __AIC_ICCR = 0x40; // Clears timer/counter 0 interrupt.
220 #endif
221 __TC_SRC0; // Read timer/counter 0 status register to clear flags.
\ 00000010 ........ LDR R0,??DataTable5 ;; 0xfffffffffffe0020
\ 00000014 000090E5 LDR R0,[R0, #+0]
222 __TC_IERC0_bit.cpcs = 1; // Interrupt on RC compare.
\ 00000018 10109FE5 LDR R1,??AT91StartTimer_0 ;; 0xfffffffffffe0024
\ 0000001C 0C209FE5 LDR R2,??AT91StartTimer_0 ;; 0xfffffffffffe0024
\ 00000020 002092E5 LDR R2,[R2, #+0]
\ 00000024 102092E3 ORRS R2,R2,#0x10
\ 00000028 002081E5 STR R2,[R1, #+0]
223 }
\ 0000002C 1EFF2FE1 BX LR ;; return
\ ??AT91StartTimer_0:
\ 00000030 2400FEFF DC32 0xfffffffffffe0024
224
225
226 //
227 // Serial communication functions.
228 //
229
\ In segment CODE, align 4, keep-with-next
230 void AT91UartInit()
231 {
232 // Don't use the serial port when run in Angel mode.
233 #if !ANGEL
234 #if AT91_EB40 || AT91_EB40A
235 __PIO_PDR = 0x000c000; // Disable PIO control of P14/TXD and P15/RXD.
\ AT91UartInit:
\ 00000000 FB00E0E3 MVN R0,#+251
\ 00000004 FF0CC0E3 BIC R0,R0,#0xFF00
\ 00000008 C01CA0E3 MOV R1,#+49152
\ 0000000C 001080E5 STR R1,[R0, #+0]
236 #endif
237 #if AT91_EB42
238 __PIO_PDR = 0x000000c0; // Disable PIO control of PA6/TXD0 and PA7/RXD0.
239 #endif
240 #if AT91_EB55 || AT91_EB63
241 __PIO_PDR = 0x00018000; // Disable PIO control of PA15/TXD0 and PA16/RXD0.
242 #endif
243
244 __US_MR = 0x000008c0; // Normal mode, 1 stop bit, no parity, async mode, 8 bits, MCK.
\ 00000010 D0009FE5 LDR R0,??AT91UartInit_0 ;; 0xfffffffffffd0004
\ 00000014 8C1EA0E3 MOV R1,#+2240
\ 00000018 001080E5 STR R1,[R0, #+0]
245 __US_IDR = 0xffffffff; // Disable all USART interrupts.
\ 0000001C C8009FE5 LDR R0,??AT91UartInit_0+0x4 ;; 0xfffffffffffd000c
\ 00000020 0010E0E3 MVN R1,#+0
\ 00000024 001080E5 STR R1,[R0, #+0]
246 __US_IER = 1; // Interrupt on RXRDY.
\ 00000028 C0009FE5 LDR R0,??AT91UartInit_0+0x8 ;; 0xfffffffffffd0008
\ 0000002C 0110A0E3 MOV R1,#+1
\ 00000030 001080E5 STR R1,[R0, #+0]
247 __US_TTGR = 5; // Transmit time guard in number of bit periods.
\ 00000034 B8009FE5 LDR R0,??AT91UartInit_0+0xC ;; 0xfffffffffffd0028
\ 00000038 0510A0E3 MOV R1,#+5
\ 0000003C 001080E5 STR R1,[R0, #+0]
248 __US_BRGR = AT91_MCK / BAUD_RATE / 16; // Set baud rate.
\ 00000040 B0009FE5 LDR R0,??AT91UartInit_0+0x10 ;; 0xfffffffffffd0020
\ 00000044 3510A0E3 MOV R1,#+53
\ 00000048 001080E5 STR R1,[R0, #+0]
249
250 __AIC_SVR2 = (unsigned long)&usart0_rxrdy_interrupt; // Usart 0 interrupt vector.
\ 0000004C 7700E0E3 MVN R0,#+119
\ 00000050 F00EC0E3 BIC R0,R0,#0xF00
\ 00000054 A0109FE5 LDR R1,??AT91UartInit_0+0x14 ;; usart0_rxrdy_interrupt
\ 00000058 001080E5 STR R1,[R0, #+0]
251 __AIC_SMR2 = 0x63; // SRCTYPE=1, PRIOR=3. USART 0 interrupt positive edge-triggered at prio 3.
\ 0000005C F700E0E3 MVN R0,#+247
\ 00000060 F00EC0E3 BIC R0,R0,#0xF00
\ 00000064 6310A0E3 MOV R1,#+99
\ 00000068 001080E5 STR R1,[R0, #+0]
252 __AIC_ICCR_bit.us0irq = 1; // Clears timer/counter 0 interrupt.
\ 0000006C D700E0E3 MVN R0,#+215
\ 00000070 E00EC0E3 BIC R0,R0,#0xE00
\ 00000074 D710E0E3 MVN R1,#+215
\ 00000078 E01EC1E3 BIC R1,R1,#0xE00
\ 0000007C 001091E5 LDR R1,[R1, #+0]
\ 00000080 041091E3 ORRS R1,R1,#0x4
\ 00000084 001080E5 STR R1,[R0, #+0]
253 __AIC_IECR_bit.us0irq = 1; // Enable timer/counter 0 interrupt.
\ 00000088 DF00E0E3 MVN R0,#+223
\ 0000008C E00EC0E3 BIC R0,R0,#0xE00
\ 00000090 DF10E0E3 MVN R1,#+223
\ 00000094 E01EC1E3 BIC R1,R1,#0xE00
\ 00000098 001091E5 LDR R1,[R1, #+0]
\ 0000009C 041091E3 ORRS R1,R1,#0x4
\ 000000A0 001080E5 STR R1,[R0, #+0]
254
255 __AIC_ICCR = 1 << US0IRQ; // Clears usart 0 interrupt.
\ 000000A4 D700E0E3 MVN R0,#+215
\ 000000A8 E00EC0E3 BIC R0,R0,#0xE00
\ 000000AC 0410A0E3 MOV R1,#+4
\ 000000B0 001080E5 STR R1,[R0, #+0]
256
257 __US_CR = 0x000000a0; // Disable receiver, disable transmitter.
\ 000000B4 FF04A0E3 MOV R0,#-16777216
\ 000000B8 FD0880E3 ORR R0,R0,#0xFD0000
\ 000000BC A010A0E3 MOV R1,#+160
\ 000000C0 001080E5 STR R1,[R0, #+0]
258 __US_CR = 0x0000010c; // Reset status bits, reset rx/tx.
\ 000000C4 FF04A0E3 MOV R0,#-16777216
\ 000000C8 FD0880E3 ORR R0,R0,#0xFD0000
\ 000000CC 431FA0E3 MOV R1,#+268
\ 000000D0 001080E5 STR R1,[R0, #+0]
259 __US_CR = 0x00000050; // Enable receiver, enable transmitter.
\ 000000D4 FF04A0E3 MOV R0,#-16777216
\ 000000D8 FD0880E3 ORR R0,R0,#0xFD0000
\ 000000DC 5010A0E3 MOV R1,#+80
\ 000000E0 001080E5 STR R1,[R0, #+0]
260 #endif // ANGEL
261 }
\ 000000E4 1EFF2FE1 BX LR ;; return
\ ??AT91UartInit_0:
\ 000000E8 0400FDFF DC32 0xfffffffffffd0004
\ 000000EC 0C00FDFF DC32 0xfffffffffffd000c
\ 000000F0 0800FDFF DC32 0xfffffffffffd0008
\ 000000F4 2800FDFF DC32 0xfffffffffffd0028
\ 000000F8 2000FDFF DC32 0xfffffffffffd0020
\ 000000FC ........ DC32 usart0_rxrdy_interrupt
262
263
\ In segment CODE, align 4, keep-with-next
264 int AT91UartGetchar()
265 {
266 // Don't use the serial port when run in Angel mode.
267 #if ANGEL
268 return '?';
269 #else
270 return __US_RHR;
\ AT91UartGetchar:
\ 00000000 04009FE5 LDR R0,??AT91UartGetchar_0 ;; 0xfffffffffffd0018
\ 00000004 000090E5 LDR R0,[R0, #+0]
\ 00000008 1EFF2FE1 BX LR ;; return
\ ??AT91UartGetchar_0:
\ 0000000C 1800FDFF DC32 0xfffffffffffd0018
271 #endif // ANGEL
272 }
273
274
\ In segment CODE, align 4, keep-with-next
275 void AT91UartPutchar(int ch)
276 {
277 // Don't use the serial port when run in Angel mode.
278 #if !ANGEL
279 unsigned char status;
280
281 do {
282 status = __US_CSR;
\ AT91UartPutchar:
\ ??AT91UartPutchar_0:
\ 00000000 14109FE5 LDR R1,??AT91UartPutchar_1 ;; 0xfffffffffffd0014
\ 00000004 001091E5 LDR R1,[R1, #+0]
283 } while ((status & 0x02) == 0); // Wait for TXRDY
\ 00000008 020011E3 TST R1,#0x2
\ 0000000C FBFFFF0A BEQ ??AT91UartPutchar_0
284
285 __US_THR = ch;
\ 00000010 08109FE5 LDR R1,??AT91UartPutchar_1+0x4 ;; 0xfffffffffffd001c
\ 00000014 000081E5 STR R0,[R1, #+0]
286 #endif // ANGEL
287 }
\ 00000018 1EFF2FE1 BX LR ;; return
\ ??AT91UartPutchar_1:
\ 0000001C 1400FDFF DC32 0xfffffffffffd0014
\ 00000020 1C00FDFF DC32 0xfffffffffffd001c
288
289
290 //
291 // Parallel I/O functions.
292 //
293
\ In segment CODE, align 4, keep-with-next
294 unsigned int AT91GetButtons()
295 {
296 unsigned long pa; // Port A value.
297 unsigned long pb; // Port B value.
298 unsigned int sw1; // SW1 button.
299 unsigned int sw2; // SW2 button.
300 unsigned int sw3; // SW3 button.
301 unsigned int sw4; // SW4 button.
302 unsigned int mask; // Bit mask of buttons.
303
304 #if AT91_EB40
305 // SW3 - P12, SW4 - P5, SW6 - P9
306 pa = pb = ~__PIO_PDSRB; // Switch on P5, P9, P12
\ AT91GetButtons:
\ 00000000 C300E0E3 MVN R0,#+195
\ 00000004 FF0CC0E3 BIC R0,R0,#0xFF00
\ 00000008 000090E5 LDR R0,[R0, #+0]
\ 0000000C 0010F0E1 MVNS R1,R0
\ 00000010 0100B0E1 MOVS R0,R1
307 sw2 = !!(pb & 0x00000020); // p5
\ 00000014 200010E3 TST R0,#0x20
\ 00000018 0100000A BEQ ??AT91GetButtons_0
\ 0000001C 0120A0E3 MOV R2,#+1
\ 00000020 000000EA B ??AT91GetButtons_1
\ ??AT91GetButtons_0:
\ 00000024 0020A0E3 MOV R2,#+0
308 sw3 = !!(pb & 0x00000200); // p9
\ ??AT91GetButtons_1:
\ 00000028 800F10E3 TST R0,#0x200
\ 0000002C 0100000A BEQ ??AT91GetButtons_2
\ 00000030 0130A0E3 MOV R3,#+1
\ 00000034 000000EA B ??AT91GetButtons_3
\ ??AT91GetButtons_2:
\ 00000038 0030A0E3 MOV R3,#+0
309 sw1 = !!(pa & 0x00001000); // p12
\ ??AT91GetButtons_3:
\ 0000003C 400D11E3 TST R1,#0x1000
\ 00000040 0100000A BEQ ??AT91GetButtons_4
\ 00000044 0100A0E3 MOV R0,#+1
\ 00000048 000000EA B ??AT91GetButtons_5
\ ??AT91GetButtons_4:
\ 0000004C 0000A0E3 MOV R0,#+0
310 sw4 = 1;
\ ??AT91GetButtons_5:
\ 00000050 0110A0E3 MOV R1,#+1
311 #endif
312
313 #if AT91_EB40A
314 // SW1 - P12, SW2 - P9, SW3 - P1, SW4 - P2
315 pa = pb = ~__PIO_PDSRB; // Switch on P5, P9, P12
316 sw3 = !!(pa & 0x00000002); // p1
317 sw4 = !!(pb & 0x00000004); // p2
318 sw2 = !!(pb & 0x00000200); // p9
319 sw1 = !!(pa & 0x00001000); // p12
320 #endif
321
322 #if AT91_EB42
323 // As seen from card edge: SW4 - PB21, SW3 - PB6, SW2 - PA0, SW1 - PB7
324 pa = ~__PIO_PDSR; // Switch on PA0
325 pb = ~__PIO_PDSRB; // Switch on PB6, PB7, PB21
326 sw2 = !!(pa & 0x00000001); // pa0
327 sw3 = !!(pb & 0x00000040); // pb6
328 sw1 = !!(pb & 0x00000080); // pb7
329 sw4 = !!(pb & 0x00200000); // pb21
330 #endif
331
332 #if AT91_EB55
333 // As seen from card edge: SW4 - PB19, SW3 - PB17, SW2 - PA9, SW1 - PB20
334 pa = ~__PIO_PDSR; // Switch on PA9
335 pb = ~__PIO_PDSRB; // Switch on PB17, PB19, PB20
336 sw2 = !!(pa & 0x00000200); // pa9
337 sw3 = !!(pb & 0x00020000); // pb17
338 sw4 = !!(pb & 0x00080000); // pb19
339 sw1 = !!(pb & 0x00100000); // pb20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -