问题引入:江科大提供的延时微秒函数正是用滴答定时器实现的。为了搞清楚原理,以STM32F103C8T6为例,撰写了本博客。
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
滴答定时器是内核外设,编程资料为【STM32F10xxx Cortex-M3编程手册】。
可以知道,滴答定时器是32位递减计数器。
下面是对上述代码的解析
(1)为什么定时器的重装载值是72*xus:系统滴答定时器用的是系统主频72Mhz,这意味着(1/72000000s)也就是(1/72)us跳动一次,如果我们想要计时15us,那么需要跳动1080次,那就是(15us/(1/72)us)
(2)对VAL任何值的写入都会将字段清除为0,即从LOAD值开始依次往下递减。
(3)根据CTRL设置滴答定时器的时钟源,启动、关闭定时器,判断定时器是否溢出。