关于Cortex-M内核的精准定时
一、关于SysTick?
SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex-M内核的微处理器、微控制器都可以由这个定时器获得精准的时间间隔。
二、使用步骤
1.引入内核头文件core_mx.h
代码如下:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
return (1UL); /* Reload value impossible */
}
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0UL); /* Function successful */
}
2.精确毫秒延时的办法
代码如下:
/**
Function: SysTick_Init
Brief : 1ms systick
Param : none
Author : q进击的涛涛
Return : none
*/
void SysTick_Init(void)
{
//1000:1ms,1000000:1us
if( SysTick_Config(SystemCoreClock / 1000) ) //1ms中断一次
{
/** Capture error */
while(1);
}
}
__IO uint32_t SysBaseTime = 0;
/**
Function: SysBaseTime_Handler
Brief : 系统运行时间
Param : none
Author : q进击的涛涛
Return : none
*/
void SysBaseTime_Handler(void)
{
SysBaseTime++;
}
/**
Function: SysBaseTime_Reset
Brief : 系统时间复位
Param : none
Author : q进击的涛涛
Return : none
*/
void SysBaseTime_Reset(void)
{
SysBaseTime = 0;
}
/**
Function: Get_SysBaseTime
Brief : 获取系统时间
Param : none
Author : q进击的涛涛
Return : SysBaseTime
*/
uint32_t Get_SysBaseTime(void)
{
return SysBaseTime;
}
/**
Function: DelayMS
Brief : 延时nms毫秒
Param : nms:毫秒延时
Author : q进击的涛涛
Return : none
*/
void DelayMS(uint32_t nms)
{
uint32_t cur_time = Get_SysBaseTime();
uint32_t wait = nms;
if( wait < 0xFFFFFFFFU )
wait++;
while(Get_SysBaseTime() - cur_time < wait);
}
总结
以上就是Sys Tick精确毫秒定时的方法。