代码:4 f) P! ]' m/ k, F+ C- b% S% Q
- void TIMER16_IRQHandler(void)
# s; U# ]' O3 t& @' B+ n' @ - {1 u# r1 L9 U: `$ `- o+ ?6 [5 j o+ {
- if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){1 U5 R( x1 |# {# L/ u% Q) J7 R' u
- " @, p# j$ q6 O# s9 c
- /* clear channel 0 interrupt bit */0 D3 j' A( H. B5 t; b# ^; D8 }3 L
- timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);( A: [; y7 P" X, M
- $ D" `- ~# s: o
- /* toggle selected led */7 ^8 b/ c3 u* R- j; G3 }
- g_bsl.tick_1ms++;
# j; W' p) a8 E. ~! e; _ - }& f5 e$ C% c+ ~7 e' C; m, {1 L
- }( R/ }2 M1 @- x: ~
0 o' q6 ^0 Q* D: y& P, ^7 R% v- uint32_t get_timer_tick(void)- O$ S" l- s8 @9 a, s& E
- {0 L/ v# O- J5 \- Y
- return g_bsl.tick_1ms;
) F, f; T0 Q% G - }
7 `- N, I- a4 V4 @+ [5 \
( w6 }+ M' k& f2 v1 p, q- void delay_1ms(uint32_t xms)
7 B8 F6 x! s% r: V% }8 y1 m. ]% S - {. h0 U& e3 O Q' W* L
- volatile uint32_t tick,diff=xms;
% y' w% F! ]- \. ? - ) Y: n" L$ ~6 }% D% q# [0 M/ j3 ]
- SET_TICK(tick);) R* H) \- o2 B9 S, J
- /*while(GET_DIFF_TICK(tick) < diff){}*/( `+ m( V( a: @' {8 ?; q5 K4 V
- 5 I6 Y8 |3 T4 h5 o7 H1 {4 ^1 h
- while(xms){ `3 _5 v" N2 k$ @6 P. i' i; P& t* P
- diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;
7 B3 m! I2 T8 F. ` - while(diff < 1){
* f: Z) g+ y. U3 ]3 [ - diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;1 m& M3 e. ^ C- _5 f( P& v
- }
3 W* u2 \+ E/ m# g: _4 O - SET_TICK(tick);
2 r! l! r( r: c) Y6 w - xms--;
9 d8 b6 {+ L6 b7 s- y# t8 T6 u2 D4 R# G - }/ @0 J1 {3 O) H6 S5 D% \
- }
复制代码 这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。. g: m8 `* G# b0 k1 F7 K2 C3 Q9 E2 o
这个是5.0编译器的结果,杠杠的:* V! _# @9 a, Y- G+ k2 O; R. O
0 c" M1 _& W9 c这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:. j b8 `. Z) V) \% S/ e9 X
% E4 Z! E1 S/ r$ h
|
如何改进代码呢?求教!
hal_delay原理跟这个一样,我这个还有溢出处理。
你的回答是正确的!高手。