📄 stm8_tsl_rc_timerdriver.ls
字号:
1 ; C Compiler for STM8 (COSMIC Software)
2 ; Generator V4.2.8 - 03 Dec 2008
3 ; Optimizer V4.2.8 - 03 Dec 2008
39 bsct
40 0000 _TSL_Tick_Base:
41 0000 00 dc.b 0
42 0001 _TSL_Tick_10ms:
43 0001 00 dc.b 0
44 0002 _TSL_Tick_100ms:
45 0002 00 dc.b 0
46 0003 _TSL_TickCount_ECS_10ms:
47 0003 00 dc.b 0
48 0004 _TSL_Tick_User:
49 0004 00 dc.b 0
84 ; 58 void TSL_Timer_Init(void)
84 ; 59 {
86 switch .text
87 0000 _TSL_Timer_Init:
91 ; 61 TSL_Tick_100ms = 0;
93 0000 3f02 clr _TSL_Tick_100ms
94 ; 62 TSL_Tick_10ms = 0;
96 0002 3f01 clr _TSL_Tick_10ms
97 ; 63 TSL_Tick_Base = 0;
99 0004 3f00 clr _TSL_Tick_Base
100 ; 64 TSL_TickCount_ECS_10ms = 0;
102 0006 3f03 clr _TSL_TickCount_ECS_10ms
103 ; 65 TSL_Tick_Flags.whole = 0;
105 0008 3f00 clr _TSL_Tick_Flags
106 ; 67 TIM4->SR1 = 0; // clear overflow flag
108 000a 725f5342 clr 21314
109 ; 69 if ( CLK->CKDIVR == 0x00 ) // Max CPU freq = 16 MHz
111 000e 725d50c6 tnz 20678
112 0012 2606 jrne L53
113 ; 71 TIM4->PSCR = 6; // Prescaler to divide Fcpu by 64: 4 us clock.
115 0014 35065345 mov 21317,#6
117 0018 2004 jra L73
118 001a L53:
119 ; 75 TIM4->PSCR = 7; // Prescaler to divide Fcpu by 128: x.xx us clock.
121 001a 35075345 mov 21317,#7
122 001e L73:
123 ; 78 TIM4->ARR = 124; // 125 * 4 us = 500 us.
125 001e 357c5346 mov 21318,#124
126 ; 79 TIM4->IER = 0x01; // Enable interrupt
128 0022 35015341 mov 21313,#1
129 ; 80 TIM4->CR1 = 0x01; // Start timer
131 0026 35015340 mov 21312,#1
132 ; 82 }
135 002a 81 ret
161 ; 95 void TSL_Timer_Check_1sec_Tick(void)
161 ; 96 {
162 switch .text
163 002b _TSL_Timer_Check_1sec_Tick:
167 ; 97 if ( TSL_Tick_100ms >= 10 )
169 002b b602 ld a,_TSL_Tick_100ms
170 002d a00a sub a,#10
171 002f 2506 jrult L15
172 ; 99 TSL_Tick_100ms -= 10;
174 0031 b702 ld _TSL_Tick_100ms,a
175 ; 100 TSL_Tick_Flags.b.DTO_1sec = 1; // Tick Flag for Max On Duration set every second.
177 0033 72100000 bset _TSL_Tick_Flags,#0
178 0037 L15:
179 ; 102 }
182 0037 81 ret
209 ; 115 void TSL_Timer_Check_100ms_Tick(void)
209 ; 116 {
210 switch .text
211 0038 _TSL_Timer_Check_100ms_Tick:
215 ; 117 if ( TSL_Tick_10ms >= 10 )
217 0038 b601 ld a,_TSL_Tick_10ms
218 003a a00a sub a,#10
219 003c 2506 jrult L36
220 ; 119 TSL_Tick_10ms -= 10;
222 003e b701 ld _TSL_Tick_10ms,a
223 ; 120 TSL_Tick_100ms++;
225 0040 3c02 inc _TSL_Tick_100ms
226 ; 121 TSL_Timer_Check_1sec_Tick();
228 0042 ade7 call _TSL_Timer_Check_1sec_Tick
230 0044 L36:
231 ; 123 }
234 0044 81 ret
262 ; 136 void TSL_Timer_Check_10ms_Tick(void)
262 ; 137 {
263 switch .text
264 0045 _TSL_Timer_Check_10ms_Tick:
268 ; 138 if ( TSL_Tick_Base >= TICK_FACTOR_10MS )
270 0045 b600 ld a,_TSL_Tick_Base
271 0047 a014 sub a,#20
272 0049 2508 jrult L57
273 ; 140 TSL_Tick_Base -= TICK_FACTOR_10MS;
275 004b b700 ld _TSL_Tick_Base,a
276 ; 141 TSL_Tick_10ms++;
278 004d 3c01 inc _TSL_Tick_10ms
279 ; 142 TSL_TickCount_ECS_10ms++; // Tick Flag for Drift increment every 10 ms.
281 004f 3c03 inc _TSL_TickCount_ECS_10ms
282 ; 143 TSL_Timer_Check_100ms_Tick();
284 0051 ade5 call _TSL_Timer_Check_100ms_Tick
286 0053 L57:
287 ; 145 }
290 0053 81 ret
317 ; 159 @interrupt void TSL_Timer_ISR(void)
317 ; 160 {
318 switch .text
319 0054 _TSL_Timer_ISR:
321 0054 3b0002 push c_x+2
322 0057 be00 ldw x,c_x
323 0059 89 pushw x
324 005a 3b0002 push c_y+2
325 005d be00 ldw x,c_y
328 ; 162 TIM4->SR1 = 0; // clear overflow flag
330 005f 725f5342 clr 21314
331 0063 89 pushw x
332 ; 164 TSL_Tick_Base++;
334 0064 3c00 inc _TSL_Tick_Base
335 ; 165 TSL_Timer_Check_10ms_Tick();
337 0066 addd call _TSL_Timer_Check_10ms_Tick
339 ; 167 if (TSL_Tick_Flags.b.User_Start_100ms) /* Application request */
341 0068 720300000c btjf _TSL_Tick_Flags,#1,L701
342 ; 169 TSL_Tick_Flags.b.User_Start_100ms = 0;
344 006d 72130000 bres _TSL_Tick_Flags,#1
345 ; 170 TSL_Tick_Flags.b.User_Flag_100ms = 0;
347 0071 72150000 bres _TSL_Tick_Flags,#2
348 ; 171 TSL_Tick_User = (TICK_FACTOR_10MS * 10);
350 0075 35c80004 mov _TSL_Tick_User,#200
351 0079 L701:
352 ; 174 if (TSL_Tick_User > 0)
354 0079 b604 ld a,_TSL_Tick_User
355 007b 2708 jreq L111
356 ; 176 TSL_Tick_User--;
358 007d 3a04 dec _TSL_Tick_User
359 ; 177 if (TSL_Tick_User == 0)
361 007f 2604 jrne L111
362 ; 179 TSL_Tick_Flags.b.User_Flag_100ms = 1; /* Give information to Application */
364 0081 72140000 bset _TSL_Tick_Flags,#2
365 0085 L111:
366 ; 183 }
369 0085 85 popw x
370 0086 bf00 ldw c_y,x
371 0088 320002 pop c_y+2
372 008b 85 popw x
373 008c bf00 ldw c_x,x
374 008e 320002 pop c_x+2
375 0091 80 iret
413 ; 196 void TSL_Timer_Adjust(u16 Delay)
413 ; 197 {
414 switch .text
415 0092 _TSL_Timer_Adjust:
417 0092 89 pushw x
418 00000000 OFST: set 0
421 ; 199 disableInterrupts();
424 0093 9b sim
426 0094 1e01 ldw x,(OFST+1,sp)
427 0096 L331:
428 ; 203 if (Delay > TICK_FACTOR_10MS) /* delay > 10ms */
430 0096 a30015 cpw x,#21
431 0099 250b jrult L141
432 ; 205 TSL_Tick_Base += TICK_FACTOR_10MS;
434 009b b600 ld a,_TSL_Tick_Base
435 009d ab14 add a,#20
436 009f b700 ld _TSL_Tick_Base,a
437 ; 206 Delay -= TICK_FACTOR_10MS;
439 00a1 1d0014 subw x,#20
440 ; 207 TSL_Timer_Check_10ms_Tick();
443 00a4 2003 jra L531
444 00a6 L141:
445 ; 211 TSL_Tick_Base++;
447 00a6 3c00 inc _TSL_Tick_Base
448 ; 212 Delay--;
450 00a8 5a decw x
451 ; 213 TSL_Timer_Check_10ms_Tick();
454 00a9 L531:
455 00a9 1f01 ldw (OFST+1,sp),x
457 00ab ad98 call _TSL_Timer_Check_10ms_Tick
458 ; 216 while ( Delay );
460 00ad 1e01 ldw x,(OFST+1,sp)
461 00af 26e5 jrne L331
462 ; 218 enableInterrupts();
465 00b1 9a rim
467 ; 220 }
471 00b2 85 popw x
472 00b3 81 ret
654 xdef _TSL_Tick_User
655 xdef _TSL_Timer_Check_10ms_Tick
656 xdef _TSL_Timer_Check_100ms_Tick
657 xdef _TSL_Timer_Check_1sec_Tick
658 xdef _TSL_Timer_Adjust
659 xdef _TSL_Timer_ISR
660 xdef _TSL_Timer_Init
661 switch .ubsct
662 0000 _TSL_Tick_Flags:
663 0000 00 ds.b 1
664 xdef _TSL_Tick_Flags
665 xdef _TSL_TickCount_ECS_10ms
666 xdef _TSL_Tick_100ms
667 xdef _TSL_Tick_10ms
668 xdef _TSL_Tick_Base
669 xref.b c_x
670 xref.b c_y
690 end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -