一、滴答定时器简述
1,滴答定时器是24位的系统定时器,属于系统内核的定时器,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。和外设部分的定时器模块不一样;
2,滴答定时器的模型
逻辑:STK_CLK提供时钟,输入给到递减计数器中,收到一个时钟后,则计数值减少1,当减少到0时刻,则置一次标志位,并且数值调整到重装值;
3,计数值计算逻辑
一个计数循环t = 重装数值reload * ( 1/配置时钟clk )
即配置时钟(72M或者9M)后,配置对应的重装值,就可以计算出完成一次计数循环的时间;
4,几个重要的寄存器描述:
①COUNTFALG:当计数值到达0时刻,读取一次,硬件上会自动清0;
②CLKSOURCE:时钟源,可以是72M或者9M
③ENABLE:使能计数器
④RELOAD:重装计数器的值
二、滴答定时器系统源码解析及建立一个毫秒的延时模块
1,源码解析
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 检测数据是否溢出,重装能小于2^24 */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* LOAD寄存器存放重装值 */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 配置优先级,为15,最低中断优先级 */
SysTick->VAL = 0; /* 设置初始值 */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* 时钟源、使能中断、使能开启*/
return (0); /* Function successful */
}
2,建立一个ms延时模块
void mysystick_config(uint32_t ms)
{
uint32_t i=0;
//系统滴答定时器函数,配置1ms产生一次异常中断
SysTick_Config(72000);
for(i=0;i<ms;i++)//
{
//在COUNTFLAG=1时刻,读取后COUNTFLAG会自动置为0
while(((SysTick->CTRL)&(1<<16))==0);
}
//关闭滴答定时器使能
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}