|
看到有人写延时函数, 个人认为那样总有些问题,于是自己写个一个, 请大家帮忙看看有什么问题,在什么极端情况下会出问题, 中断优先级必须最高,否则在优先级更高的函数里就失效了,最后的gettickcount是系统运行的毫秒数, 这个最好在main函数里面先调用Delay_Init6 v" n h; k' h #define __DELAY_C #include "delay.h" u64 tickcou=0xffffffffff000000; u16 fac_us; u16 fac_ms; u8 initok=0;* r" B7 ]+ W. m- Z void Delay_Init(void)/ g4 E9 v& L7 l: R2 ? s5 z { SysTick_Config(0xFFFFFF); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // HCLK/8* U( A9 T+ y M1 { fac_us=SystemCoreClock/8000000; 6 x) E& {$ I8 L, @) R fac_ms=SystemCoreClock/8000; SysTick->VAL=0x00; NVIC_SetPriority(SysTick_IRQn, 0);# f) K3 o* a3 O5 B' G* Z. Q& F initok=1;- V9 l9 F8 L1 x) X7 i8 O8 [8 W' f } void SysTick_Handler(void)0 {6 d" e0 m) X* c {) @7 q" P& L2 ~. }7 g tickcou=tickcou-(1 << 24);$ E7 ]( S! L7 z3 R& z# W: P } void delay_ms(u16 nms) : v& h+ n2 Y m3 e4 v { u64 tar;- Q, {) W# m/ I1 w* r if(initok==0)Delay_Init(); tar=tickcou+(SysTick->VAL)-(nms*fac_ms); while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter(); }1 ?$ p0 B; R# t: |; d0 Y; s void delay_us(u16 nus) {. [2 Y, }* _7 G& N u64 tar; if(initok==0)Delay_Init(); tar=tickcou+(SysTick->VAL)-(nus*fac_us); while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter(); ! N# w' o+ c* o } u64 gettickcount(void)6 K2 P4 y* Z/ P {1 o/ Z) {! v5 e2 u u64 temptick;' f Y# N! Z8 ]5 ?' Z) Z if(initok==0)Delay_Init();, O! d1 N2 u8 V/ k" S0 \ temptick=(0xffffffffffffffff -tickcou+(SysTick->VAL))/fac_ms; return temptick;' f+ K3 f$ u" U0 c& @6 D9 ~9 v8 _ } /*************½áÊø***************/6 K4 K: ]4 t/ S C9 B : A7 ^! N% N" ?9 G( n |
微信公众号
手机版
{+ I' C: ^- l0 b! b- u, Y. C
u64 temptick;
if(initok==0)Delay_Init();
temptick=(0xffffffffffffffff -tickcou-(SysTick->VAL))/fac_ms;
return temptick;$ p: R; [! M, K% ]$ t3 s
}抱歉,是-(SysTick->VAL)