📄 timer.lst
字号:
##############################################################################
# #
# IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 12/Dec/2008 17:14:27 #
# Copyright 1999-2005 IAR Systems. All rights reserved. #
# #
# Cpu mode = arm #
# Endian = little #
# Stack alignment = 4 #
# Source file = E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\Common\src\time #
# r.c #
# Command line = E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\Common\src\time #
# r.c -lCN E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\RAM_De #
# bug\List\ -o E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\RA #
# M_Debug\Obj\ -z2 --no_cse --no_unroll --no_inline #
# --no_code_motion --no_tbaa --no_clustering #
# --no_scheduling --debug --cpu_mode arm --endian #
# little --cpu ARM7TDMI-S --stack_align 4 -e --fpu #
# None --dlib_config "C:\Program Files\IAR #
# Systems\Embedded Workbench 4.0 #
# Evaluation\arm\LIB\dl4tpannl8n.h" -I #
# E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\include\ -I #
# E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\ucos-ii\include #
# \ -I "C:\Program Files\IAR Systems\Embedded #
# Workbench 4.0 Evaluation\arm\INC\" #
# List file = E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\RAM_Debug\List\ #
# timer.lst #
# Object file = E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\RAM_Debug\Obj\t #
# imer.r79 #
# #
# #
##############################################################################
E:\IAR_2478\IAR_2478\26uCOS\Src\uCOS\Common\src\timer.c
1 /*****************************************************************************
2 * timer.c: Timer C file for NXP LPC23xx/24xx Family Microprocessors
3 *
4 * Copyright(C) 2006, NXP Semiconductor
5 * All rights reserved.
6 *
7 * History
8 * 2006.09.01 ver 1.00 Prelimnary version, first Release
9 *
10 ******************************************************************************/
11 #include "LPC2468.h" /* LPC23xx/24xx Peripheral Registers */
12 #include "type.h"
13 #include "irq.h"
14 #include "target.h"
15 #include "timer.h"
16
\ In segment DATA_Z, align 4, align-sorted
17 volatile DWORD timer0_counter = 0;
\ timer0_counter:
\ 00000000 DS8 4
\ In segment DATA_Z, align 4, align-sorted
18 volatile DWORD timer1_counter = 0;
\ timer1_counter:
\ 00000000 DS8 4
19
20 /*****************************************************************************
21 ** Function name: delayMs
22 **
23 ** Descriptions: Start the timer delay in milo seconds
24 ** until elapsed
25 **
26 ** parameters: timer number, Delay value in milo second
27 **
28 ** Returned value: None
29 **
30 *****************************************************************************/
\ In segment CODE, align 4, keep-with-next
31 void delayMs(BYTE timer_num, DWORD delayInMs)
32 {
33 if ( timer_num == 0 )
\ delayMs:
\ 00000000 000050E3 CMP R0,#+0
\ 00000004 1E00001A BNE ??delayMs_0
34 {
35 /*
36 * setup timer #0 for delay
37 */
38 T0TCR = 0x02; /* 复位定时器 */
\ 00000008 4E22A0E3 MOV R2,#-536870908
\ 0000000C 402C82E3 ORR R2,R2,#0x4000
\ 00000010 0230A0E3 MOV R3,#+2
\ 00000014 003082E5 STR R3,[R2, #+0]
39 T0PR = 0x00; /* 预分频设置: TC每PCLK加1 */
\ 00000018 CE22A0E3 MOV R2,#-536870900
\ 0000001C 402C82E3 ORR R2,R2,#0x4000
\ 00000020 0030A0E3 MOV R3,#+0
\ 00000024 003082E5 STR R3,[R2, #+0]
40 T0MR0 = delayInMs*(Fpclk/1000) - 1; // 计数值
\ 00000028 ........ LDR R2,??DataTable9 ;; 0xffffffffe0004018
\ 0000002C 8030A0E3 MOV R3,#+128
\ 00000030 703C83E3 ORR R3,R3,#0x7000
\ 00000034 93011CE0 MULS R12,R3,R1
\ 00000038 01305CE2 SUBS R3,R12,#+1
\ 0000003C 003082E5 STR R3,[R2, #+0]
41 T0IR = 0xff; /* 中断复位 */
\ 00000040 E024A0E3 MOV R2,#-536870912
\ 00000044 402C82E3 ORR R2,R2,#0x4000
\ 00000048 FF30A0E3 MOV R3,#+255
\ 0000004C 003082E5 STR R3,[R2, #+0]
42 T0MCR = 0x04; /* 发生匹配时停止计数 */
\ 00000050 ........ LDR R2,??DataTable10 ;; 0xffffffffe0004014
\ 00000054 0430A0E3 MOV R3,#+4
\ 00000058 003082E5 STR R3,[R2, #+0]
43 T0TCR = 0x01; /* 启动定时器 */
\ 0000005C 4E22A0E3 MOV R2,#-536870908
\ 00000060 402C82E3 ORR R2,R2,#0x4000
\ 00000064 0130A0E3 MOV R3,#+1
\ 00000068 003082E5 STR R3,[R2, #+0]
44
45 /* wait until delay time has elapsed */
46 while (T0TCR & 0x01); // 当发生匹配,计数器停止,TCR最低位置0,循环结束
\ ??delayMs_1:
\ 0000006C 4E22A0E3 MOV R2,#-536870908
\ 00000070 402C82E3 ORR R2,R2,#0x4000
\ 00000074 002092E5 LDR R2,[R2, #+0]
\ 00000078 010012E3 TST R2,#0x1
\ 0000007C FAFFFF1A BNE ??delayMs_1
\ 00000080 1F0000EA B ??delayMs_2
47 }
48 else if ( timer_num == 1 )
\ ??delayMs_0:
\ 00000084 010050E3 CMP R0,#+1
\ 00000088 1D00001A BNE ??delayMs_2
49 {
50 /*
51 * setup timer #1 for delay
52 */
53 T1TCR = 0x02; /* reset timer */
\ 0000008C 4E22A0E3 MOV R2,#-536870908
\ 00000090 802C82E3 ORR R2,R2,#0x8000
\ 00000094 0230A0E3 MOV R3,#+2
\ 00000098 003082E5 STR R3,[R2, #+0]
54 T1PR = 0x00; /* set prescaler to zero */
\ 0000009C CE22A0E3 MOV R2,#-536870900
\ 000000A0 802C82E3 ORR R2,R2,#0x8000
\ 000000A4 0030A0E3 MOV R3,#+0
\ 000000A8 003082E5 STR R3,[R2, #+0]
55 T1MR0 = delayInMs*(Fpclk/1000) - 1;
\ 000000AC ........ LDR R2,??DataTable12 ;; 0xffffffffe0008018
\ 000000B0 8030A0E3 MOV R3,#+128
\ 000000B4 703C83E3 ORR R3,R3,#0x7000
\ 000000B8 93011CE0 MULS R12,R3,R1
\ 000000BC 01305CE2 SUBS R3,R12,#+1
\ 000000C0 003082E5 STR R3,[R2, #+0]
56 T1IR = 0xff; /* reset all interrrupts */
\ 000000C4 E024A0E3 MOV R2,#-536870912
\ 000000C8 802C82E3 ORR R2,R2,#0x8000
\ 000000CC FF30A0E3 MOV R3,#+255
\ 000000D0 003082E5 STR R3,[R2, #+0]
57 T1MCR = 0x04; /* stop timer on match */
\ 000000D4 ........ LDR R2,??DataTable13 ;; 0xffffffffe0008014
\ 000000D8 0430A0E3 MOV R3,#+4
\ 000000DC 003082E5 STR R3,[R2, #+0]
58 T1TCR = 0x01; /* start timer */
\ 000000E0 4E22A0E3 MOV R2,#-536870908
\ 000000E4 802C82E3 ORR R2,R2,#0x8000
\ 000000E8 0130A0E3 MOV R3,#+1
\ 000000EC 003082E5 STR R3,[R2, #+0]
59
60 /* wait until delay time has elapsed */
61 while (T1TCR & 0x01);
\ ??delayMs_3:
\ 000000F0 4E22A0E3 MOV R2,#-536870908
\ 000000F4 802C82E3 ORR R2,R2,#0x8000
\ 000000F8 002092E5 LDR R2,[R2, #+0]
\ 000000FC 010012E3 TST R2,#0x1
\ 00000100 FAFFFF1A BNE ??delayMs_3
62 }
63 return;
\ ??delayMs_2:
\ 00000104 0EF0A0E1 MOV PC,LR ;; return
64 }
65
66 /******************************************************************************
67 ** Function name: Timer0Handler
68 **
69 ** Descriptions: Timer/Counter 0 interrupt handler
70 ** executes each 10ms @ 60 MHz CPU Clock
71 **
72 ** parameters: None
73 ** Returned value: None
74 **
75 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
76 __irq __arm void Timer0Handler (void)
77 {
\ Timer0Handler:
\ 00000000 04E04EE2 SUB LR,LR,#+4
\ 00000004 03502DE9 PUSH {R0,R1,R12,LR}
78 T0IR = 1; /* clear interrupt flag */
\ 00000008 E004A0E3 MOV R0,#-536870912
\ 0000000C 400C80E3 ORR R0,R0,#0x4000
\ 00000010 0110A0E3 MOV R1,#+1
\ 00000014 001080E5 STR R1,[R0, #+0]
79 __enable_interrupt(); /* handles nested interrupt */
\ 00000018 ........ _BLF ??EnI_a,??rA??EnI_a
80
81 timer0_counter++;
\ 0000001C ........ LDR R0,??DataTable8 ;; timer0_counter
\ 00000020 ........ LDR R1,??DataTable8 ;; timer0_counter
\ 00000024 001091E5 LDR R1,[R1, #+0]
\ 00000028 011091E2 ADDS R1,R1,#+1
\ 0000002C 001080E5 STR R1,[R0, #+0]
82
83 __disable_interrupt();
\ 00000030 ........ _BLF ??DiI_a,??rA??DiI_a
84
85 VICVectAddr = 0; /* Acknowledge Interrupt */
\ 00000034 FF00E0E3 MVN R0,#+255
\ 00000038 0010A0E3 MOV R1,#+0
\ 0000003C 001080E5 STR R1,[R0, #+0]
86 }
\ 00000040 0390FDE8 LDM SP!,{R0,R1,R12,PC}^ ;; return
87
88 /******************************************************************************
89 ** Function name: Timer1Handler
90 **
91 ** Descriptions: Timer/Counter 1 interrupt handler
92 ** executes each 10ms @ 60 MHz CPU Clock
93 **
94 ** parameters: None
95 ** Returned value: None
96 **
97 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
98 __irq __arm void Timer1Handler (void)
99 {
\ Timer1Handler:
\ 00000000 04E04EE2 SUB LR,LR,#+4
\ 00000004 03502DE9 PUSH {R0,R1,R12,LR}
100 T1IR = 1; /* clear interrupt flag */
\ 00000008 E004A0E3 MOV R0,#-536870912
\ 0000000C 800C80E3 ORR R0,R0,#0x8000
\ 00000010 0110A0E3 MOV R1,#+1
\ 00000014 001080E5 STR R1,[R0, #+0]
101 __enable_interrupt(); /* handles nested interrupt */
\ 00000018 ........ _BLF ??EnI_a,??rA??EnI_a
102
103 timer1_counter++;
\ 0000001C ........ LDR R0,??DataTable11 ;; timer1_counter
\ 00000020 ........ LDR R1,??DataTable11 ;; timer1_counter
\ 00000024 001091E5 LDR R1,[R1, #+0]
\ 00000028 011091E2 ADDS R1,R1,#+1
\ 0000002C 001080E5 STR R1,[R0, #+0]
104
105 __disable_interrupt();
\ 00000030 ........ _BLF ??DiI_a,??rA??DiI_a
106
107 VICVectAddr = 0; /* Acknowledge Interrupt */
\ 00000034 FF00E0E3 MVN R0,#+255
\ 00000038 0010A0E3 MOV R1,#+0
\ 0000003C 001080E5 STR R1,[R0, #+0]
108 }
\ 00000040 0390FDE8 LDM SP!,{R0,R1,R12,PC}^ ;; return
109
110 /******************************************************************************
111 ** Function name: enable_timer
112 **
113 ** Descriptions: Enable timer
114 **
115 ** parameters: timer number: 0 or 1
116 ** Returned value: None
117 **
118 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
119 void enable_timer( BYTE timer_num )
120 {
121 if ( timer_num == 0 )
\ enable_timer:
\ 00000000 000050E3 CMP R0,#+0
\ 00000004 0400001A BNE ??enable_timer_0
122 {
123 T0TCR = 1; // 计数器使能
\ 00000008 4E12A0E3 MOV R1,#-536870908
\ 0000000C 401C81E3 ORR R1,R1,#0x4000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -