📄 timer.lst
字号:
\ 00000010 0120A0E3 MOV R2,#+1
\ 00000014 002081E5 STR R2,[R1, #+0]
\ 00000018 030000EA B ??enable_timer_1
124 }
125 else
126 {
127 T1TCR = 1;
\ ??enable_timer_0:
\ 0000001C 4E12A0E3 MOV R1,#-536870908
\ 00000020 801C81E3 ORR R1,R1,#0x8000
\ 00000024 0120A0E3 MOV R2,#+1
\ 00000028 002081E5 STR R2,[R1, #+0]
128 }
129 return;
\ ??enable_timer_1:
\ 0000002C 0EF0A0E1 MOV PC,LR ;; return
130 }
131
132 /******************************************************************************
133 ** Function name: disable_timer
134 **
135 ** Descriptions: Disable timer
136 **
137 ** parameters: timer number: 0 or 1
138 ** Returned value: None
139 **
140 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
141 void disable_timer( BYTE timer_num )
142 {
143 if ( timer_num == 0 )
\ disable_timer:
\ 00000000 000050E3 CMP R0,#+0
\ 00000004 0400001A BNE ??disable_timer_0
144 {
145 T0TCR = 0; // 计数器禁止
\ 00000008 4E12A0E3 MOV R1,#-536870908
\ 0000000C 401C81E3 ORR R1,R1,#0x4000
\ 00000010 0020A0E3 MOV R2,#+0
\ 00000014 002081E5 STR R2,[R1, #+0]
\ 00000018 030000EA B ??disable_timer_1
146 }
147 else
148 {
149 T1TCR = 0;
\ ??disable_timer_0:
\ 0000001C 4E12A0E3 MOV R1,#-536870908
\ 00000020 801C81E3 ORR R1,R1,#0x8000
\ 00000024 0020A0E3 MOV R2,#+0
\ 00000028 002081E5 STR R2,[R1, #+0]
150 }
151 return;
\ ??disable_timer_1:
\ 0000002C 0EF0A0E1 MOV PC,LR ;; return
152 }
153
154 /******************************************************************************
155 ** Function name: reset_timer
156 **
157 ** Descriptions: Reset timer
158 **
159 ** parameters: timer number: 0 or 1
160 ** Returned value: None
161 **
162 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
163 void reset_timer( BYTE timer_num )
164 {
165 DWORD regVal;
166
167 if ( timer_num == 0 )
\ reset_timer:
\ 00000000 000050E3 CMP R0,#+0
\ 00000004 0800001A BNE ??reset_timer_0
168 {
169 regVal = T0TCR;
\ 00000008 4E22A0E3 MOV R2,#-536870908
\ 0000000C 402C82E3 ORR R2,R2,#0x4000
\ 00000010 002092E5 LDR R2,[R2, #+0]
\ 00000014 0210B0E1 MOVS R1,R2
170 regVal |= 0x02;
\ 00000018 021091E3 ORRS R1,R1,#0x2
171 T0TCR = regVal;
\ 0000001C 4E22A0E3 MOV R2,#-536870908
\ 00000020 402C82E3 ORR R2,R2,#0x4000
\ 00000024 001082E5 STR R1,[R2, #+0]
\ 00000028 070000EA B ??reset_timer_1
172 }
173 else
174 {
175 regVal = T1TCR;
\ ??reset_timer_0:
\ 0000002C 4E22A0E3 MOV R2,#-536870908
\ 00000030 802C82E3 ORR R2,R2,#0x8000
\ 00000034 002092E5 LDR R2,[R2, #+0]
\ 00000038 0210B0E1 MOVS R1,R2
176 regVal |= 0x02; // 复位。计数器和预分频计数器清0
\ 0000003C 021091E3 ORRS R1,R1,#0x2
177 T1TCR = regVal;
\ 00000040 4E22A0E3 MOV R2,#-536870908
\ 00000044 802C82E3 ORR R2,R2,#0x8000
\ 00000048 001082E5 STR R1,[R2, #+0]
178 }
179 return;
\ ??reset_timer_1:
\ 0000004C 0EF0A0E1 MOV PC,LR ;; return
180 }
181
182 /******************************************************************************
183 ** Function name: init_timer
184 **
185 ** Descriptions: Initialize timer, set timer interval, reset timer,
186 ** install timer interrupt handler
187 **
188 ** parameters: timer number and timer interval
189 ** Returned value: true or false, if the interrupt handler can't be
190 ** installed, return false.
191 **
192 ******************************************************************************/
\ In segment CODE, align 4, keep-with-next
193 DWORD init_timer ( BYTE timer_num, DWORD TimerInterval )
194 {
\ init_timer:
\ 00000000 30402DE9 PUSH {R4,R5,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
195 if ( timer_num == 0 )
\ 0000000C 000054E3 CMP R4,#+0
\ 00000010 1200001A BNE ??init_timer_0
196 {
197 timer0_counter = 0;
\ 00000014 ........ LDR R0,??DataTable8 ;; timer0_counter
\ 00000018 0010A0E3 MOV R1,#+0
\ 0000001C 001080E5 STR R1,[R0, #+0]
198 T0MR0 = TimerInterval - 1; // 设置计时初值,计数pclk脉冲个数
\ 00000020 ........ LDR R0,??DataTable9 ;; 0xffffffffe0004018
\ 00000024 011055E2 SUBS R1,R5,#+1
\ 00000028 001080E5 STR R1,[R0, #+0]
199 T0MCR = 3; // 计数器的值与MR值匹配时的动作:发生中断、TC复位
\ 0000002C ........ LDR R0,??DataTable10 ;; 0xffffffffe0004014
\ 00000030 0310A0E3 MOV R1,#+3
\ 00000034 001080E5 STR R1,[R0, #+0]
200 if ( install_irq( TIMER0_INT, (void *)Timer0Handler, HIGHEST_PRIORITY ) == FALSE )
\ 00000038 0120A0E3 MOV R2,#+1
\ 0000003C 74109FE5 LDR R1,??init_timer_1 ;; Timer0Handler
\ 00000040 0400A0E3 MOV R0,#+4
\ 00000044 ........ _BLF install_irq,??install_irq??rA
\ 00000048 000050E3 CMP R0,#+0
\ 0000004C 0100001A BNE ??init_timer_2
201 {
202 return (FALSE);
\ 00000050 0000A0E3 MOV R0,#+0
\ 00000054 160000EA B ??init_timer_3
203 }
204 else
205 {
206 return (TRUE);
\ ??init_timer_2:
\ 00000058 0100A0E3 MOV R0,#+1
\ 0000005C 140000EA B ??init_timer_3
207 }
208 }
209 else if ( timer_num == 1 )
\ ??init_timer_0:
\ 00000060 010054E3 CMP R4,#+1
\ 00000064 1100001A BNE ??init_timer_4
210 {
211 timer1_counter = 0;
\ 00000068 ........ LDR R0,??DataTable11 ;; timer1_counter
\ 0000006C 0010A0E3 MOV R1,#+0
\ 00000070 001080E5 STR R1,[R0, #+0]
212 T1MR0 = TimerInterval;
\ 00000074 ........ LDR R0,??DataTable12 ;; 0xffffffffe0008018
\ 00000078 005080E5 STR R5,[R0, #+0]
213 T1MCR = 3; /* Interrupt and Reset on MR1 */
\ 0000007C ........ LDR R0,??DataTable13 ;; 0xffffffffe0008014
\ 00000080 0310A0E3 MOV R1,#+3
\ 00000084 001080E5 STR R1,[R0, #+0]
214 if ( install_irq( TIMER1_INT, (void *)Timer1Handler, HIGHEST_PRIORITY ) == FALSE )
\ 00000088 0120A0E3 MOV R2,#+1
\ 0000008C 28109FE5 LDR R1,??init_timer_1+0x4 ;; Timer1Handler
\ 00000090 0500A0E3 MOV R0,#+5
\ 00000094 ........ _BLF install_irq,??install_irq??rA
\ 00000098 000050E3 CMP R0,#+0
\ 0000009C 0100001A BNE ??init_timer_5
215 {
216 return (FALSE);
\ 000000A0 0000A0E3 MOV R0,#+0
\ 000000A4 020000EA B ??init_timer_3
217 }
218 else
219 {
220 return (TRUE);
\ ??init_timer_5:
\ 000000A8 0100A0E3 MOV R0,#+1
\ 000000AC 000000EA B ??init_timer_3
221 }
222 }
223 return (FALSE);
\ ??init_timer_4:
\ 000000B0 0000A0E3 MOV R0,#+0
\ ??init_timer_3:
\ 000000B4 3080BDE8 POP {R4,R5,PC} ;; return
\ ??init_timer_1:
\ 000000B8 ........ DC32 Timer0Handler
\ 000000BC ........ DC32 Timer1Handler
224 }
\ In segment CODE, align 4, keep-with-next
\ ??DataTable8:
\ 00000000 ........ DC32 timer0_counter
\ In segment CODE, align 4, keep-with-next
\ ??DataTable9:
\ 00000000 184000E0 DC32 0xffffffffe0004018
\ In segment CODE, align 4, keep-with-next
\ ??DataTable10:
\ 00000000 144000E0 DC32 0xffffffffe0004014
\ In segment CODE, align 4, keep-with-next
\ ??DataTable11:
\ 00000000 ........ DC32 timer1_counter
\ In segment CODE, align 4, keep-with-next
\ ??DataTable12:
\ 00000000 188000E0 DC32 0xffffffffe0008018
\ In segment CODE, align 4, keep-with-next
\ ??DataTable13:
\ 00000000 148000E0 DC32 0xffffffffe0008014
225
226 /******************************************************************************
227 ** End Of File
228 ******************************************************************************/
Maximum stack usage in bytes:
Function CSTACK
-------- ------
Timer0Handler 16
Timer1Handler 16
delayMs 0
disable_timer 0
enable_timer 0
init_timer 12
reset_timer 0
Segment part sizes:
Function/Label Bytes
-------------- -----
timer0_counter 4
timer1_counter 4
delayMs 264
Timer0Handler 68
Timer1Handler 68
enable_timer 48
disable_timer 48
reset_timer 80
init_timer 192
??DataTable8 4
??DataTable9 4
??DataTable10 4
??DataTable11 4
??DataTable12 4
??DataTable13 4
Others 48
828 bytes in segment CODE
8 bytes in segment DATA_Z
12 bytes in segment INITTAB
792 bytes of CODE memory (+ 48 bytes shared)
8 bytes of DATA memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -