代码:- M; ?! O; H$ n& b1 D8 F& J: L
- void TIMER16_IRQHandler(void)3 u8 s& Z+ j( g. O' m! n
- {
( z' j! H1 h% f7 o4 [" x - if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){4 ^8 k0 ?8 P# r% p, V
- 2 b+ J* ^* ^8 \0 a' X' l0 |) f
- /* clear channel 0 interrupt bit */
' n' U" w) T- Y( H - timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);
+ Q- ]0 x" @* [6 [' i% p
4 }; b u3 v5 M5 a9 Z- /* toggle selected led */
% \0 l' y" e4 n/ {( ` j - g_bsl.tick_1ms++;, J. w+ e- k8 A% Q6 w. S! B3 C
- }$ J6 Y$ K1 V7 [6 k2 D, i
- }. h5 Q3 z2 x3 e6 Z
- 6 Z5 E- e6 |; y$ N9 Y% u! G5 Q; x
- uint32_t get_timer_tick(void)
9 K8 |! U7 Q9 g3 g0 ~: N - {
5 S& f" x0 o7 Q - return g_bsl.tick_1ms;7 |2 ], c9 f4 c
- }; _" B6 r5 \ K7 h* L% ~" A; E
- , R5 M: i. `3 ^" O/ M% i+ A
- void delay_1ms(uint32_t xms)0 o+ `! s) a# H, n' a
- {6 G6 Z" o/ S; x6 N/ @5 e
- volatile uint32_t tick,diff=xms;$ ^# n7 O- l$ }' C) B9 [
- 2 [5 D" l3 p1 O; m$ N! u3 x
- SET_TICK(tick);/ a5 A$ n, \ O
- /*while(GET_DIFF_TICK(tick) < diff){}*/- R2 C/ f) }1 k4 r
8 \& {0 H1 ?4 f- while(xms){8 y& j6 x9 h2 x& u- r t2 x
- diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;: O$ K* D4 D/ G2 j
- while(diff < 1){
0 F8 I" K6 }' _) `8 j - diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;
* ~6 z. q& O1 I" k R& Z( Q - }" A3 i& O, c9 T4 J# B
- SET_TICK(tick);- A; B" H2 M7 v
- xms--;
7 [4 k3 Y" h8 L0 s - }
9 i7 M5 c: z, ^! { - }
复制代码 这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。) }* o; K1 M8 j& L% H6 E
这个是5.0编译器的结果,杠杠的:
' s0 M+ z3 Y* k4 f
$ \8 |5 [% r- y9 e' r' Q这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:
# p( ^- o6 K3 |+ W m) z; ?8 W c, n, U( ?% J- _2 j$ Y+ G) K! _
|
如何改进代码呢?求教!
hal_delay原理跟这个一样,我这个还有溢出处理。
你的回答是正确的!高手。