
看到有人写延时函数, 个人认为那样总有些问题,于是自己写个一个, 请大家帮忙看看有什么问题,在什么极端情况下会出问题, 中断优先级必须最高,否则在优先级更高的函数里就失效了,最后的gettickcount是系统运行的毫秒数, 这个最好在main函数里面先调用Delay_Init #define __DELAY_C #include "delay.h" u64 tickcou=0xffffffffff000000; u16 fac_us; u16 fac_ms; u8 initok=0; void Delay_Init(void) { SysTick_Config(0xFFFFFF); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // HCLK/8 fac_us=SystemCoreClock/8000000; fac_ms=SystemCoreClock/8000; SysTick->VAL=0x00; NVIC_SetPriority(SysTick_IRQn, 0); initok=1; } void SysTick_Handler(void) { tickcou=tickcou-(1 << 24); } void delay_ms(u16 nms) { u64 tar; if(initok==0)Delay_Init(); tar=tickcou+(SysTick->VAL)-(nms*fac_ms); while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter(); } void delay_us(u16 nus) { u64 tar; if(initok==0)Delay_Init(); tar=tickcou+(SysTick->VAL)-(nus*fac_us); while(tar<tickcou+(SysTick->VAL))IWDG_ReloadCounter(); } u64 gettickcount(void) { u64 temptick; if(initok==0)Delay_Init(); temptick=(0xffffffffffffffff -tickcou+(SysTick->VAL))/fac_ms; return temptick; } /*************½áÊø***************/ |
{
u64 temptick;
if(initok==0)Delay_Init();
temptick=(0xffffffffffffffff -tickcou-(SysTick->VAL))/fac_ms;
return temptick;
}抱歉,是-(SysTick->VAL)