新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2019-4-17
- 在线时间
- 6 小时
|
滴答定时器系统时间戳和延时实现:
static volatile u32 s_ulSysClock = 0;
static u32 systickMsCnt;
#if 1 //中断实现
void SysTimerInit(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
SCB->SHP[11] = ((u8)15 << 4); //配置中断优先级
SysTick->LOAD=0x00FFFFFF; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk ; //开始倒数,使能中断请求
systickMsCnt = SystemCoreClock/8000;
}
u32 SysGetTimer(void)
{
u32 retval;
__disable_irq();
retval = s_ulSysClock + (0x00FFFFFF - SysTick->VAL)/systickMsCnt;
__enable_irq();
return retval;
}
#else //查询实现
void SysTimerInit(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
SCB->SHP[11] = ((u8)15 << 4); //配置中断优先级
SysTick->LOAD=0x00FFFFFF; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开始倒数
systickMsCnt = SystemCoreClock/8000;
}
u32 SysGetTimer(void)
{
u32 retval;
__disable_irq();
if(SysTick->CTRL&(1<<16))
{
s_ulSysClock += 0x00FFFFFF/systickMsCnt;
printf("SysTick->CTRL = 1\n");
//SysTick->CTRL &= ~(1<<16);
}
retval = s_ulSysClock + (0x00FFFFFF - SysTick->VAL)/systickMsCnt;
__enable_irq();
return retval;
}
#endif
void SysTimerReload(void)
{
s_ulSysClock += 0x00FFFFFF/systickMsCnt;
}
void delay_ms(u16 nms)
{
volatile u32 start = SysGetTimer();
while((SysGetTimer() - start) <= (nms)){;}
}
void SysTick_Handler(void)
{
SysTimerReload();
}
|
|