代码:
9 \- N$ L2 d5 o0 D" m% U- void TIMER16_IRQHandler(void)) J) r1 P7 R! E) O& O5 q8 W
- {
4 i5 Y+ Y' v# ~5 L& o! i - if(SET == timer_interrupt_flag_get(TIMER16, TIMER_INT_UP)){
- }9 k9 @) r" ^+ L4 k
5 S/ ?: g* |! i7 f- /* clear channel 0 interrupt bit */
% n% h% @0 p1 R) n; h, E - timer_interrupt_flag_clear(TIMER16, TIMER_INT_UP);$ {3 T# N8 t9 K7 N* m# Y0 ]4 F# T
/ `' G" M' ~5 B P/ | p4 P, E- /* toggle selected led */
5 r5 R6 N, K0 e/ t' _ - g_bsl.tick_1ms++;8 s2 h- D' h' c1 @- z
- }( w# u; O; w' v a2 |
- }
+ p0 |7 I' }2 ]8 A - 8 z- J/ D/ v# _7 x" t, k
- uint32_t get_timer_tick(void)+ ]3 K$ F- x, i7 V: e( j
- {7 z8 C$ S' b$ m. Z* I/ P% K; x
- return g_bsl.tick_1ms;4 C$ D& o) _0 q! w& J
- }
( b, }' l% z0 B p - 2 H5 V1 {% d* R4 `9 L7 v
- void delay_1ms(uint32_t xms)4 ^4 \ X6 H# R& ^7 ^5 w
- {4 o$ ~1 Z) e* Q3 R2 c" Z- | @
- volatile uint32_t tick,diff=xms;
3 t1 r/ b- _6 Q M$ w$ d- G
/ w; Z+ c' `' T) ~+ U* e+ d* q- SET_TICK(tick);( A: ^$ N1 H0 d
- /*while(GET_DIFF_TICK(tick) < diff){}*/
# v* v H' G! {) U" F; X. q
' q1 }9 J! v2 g" |; Y+ w- while(xms){
! @/ C6 P7 }4 Q( g/ F+ O - diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;- P9 } x' r5 R, }
- while(diff < 1){
" {, s/ ^8 B- q6 W3 w# ? - diff = (0x100000+get_timer_tick()-tick)&0xFFFFF ;
/ U* N5 H: I& C6 @9 o- R - }, R( n: Y2 b6 _5 U2 g3 ]
- SET_TICK(tick);
9 J# _ O7 l' Y9 L6 h# c - xms--;$ m2 _" z0 _& A4 n" J! N2 W
- }
* f; h9 m$ ^8 U" u) P/ Y - }
复制代码 这个函数就是延时多少毫秒,这个毫秒计数器通过一个毫秒中断一直增加。- p# ?& u6 v# `
这个是5.0编译器的结果,杠杠的:
2 L4 v$ H* U1 j+ B, E
0 K4 l+ @2 n b+ z* @7 s; J/ c
这个是6.0的结果,不加volatile直接给你优化了,等级为Oz,循环一直出不去,我没辙了,大家救救我吧:
0 v6 V: i9 r. o2 { R4 o/ x) Z" j9 [7 |. k. F8 e! A3 j
|
如何改进代码呢?求教!
hal_delay原理跟这个一样,我这个还有溢出处理。
你的回答是正确的!高手。