目录
一、SysTick系统滴答定时器
1、SysTick简介
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
2、SysTick寄存器介绍
SysTick—系统定时器有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。以下是SysTick四个寄存器介绍,图片参考系统滴答定时器_花开半朵ོ的博客-CSDN博客_系统滴答定时器
二、SysTick应用实验
1、SysTick定时时间计算
LOAD寄存器中的reload值就是systick滴答的次数,从重载到倒计时结束的时间
t=reload*(1/clk),当AHB作为clk时,clk=72M,t=72*(1/72M)=1us,也即通过调整reload值来设定计数时间t。
2、中断优先级配置
优先级配置要区分内核外设和普通外设的优先级配置,内核外设优先级如SysTick优先级配置是在SCB的SHPRX寄存器,普通外设优先级如上一篇按键中断使用的EXTI,是在NVIC的IPRX寄存器配置。
注释:
(1)这里容易混淆优先级分组和优先级配置。上一篇按键中断实验中,优先级的分组是在SCB的AIRCR寄存器进行配置;而主次优先级配置是在NVIC的IP寄存器配置。
(2)内核外设的优先级没有分组,只有0-15的十六个优先级,通过寄存器中的四个位控制,而普通外设的优先级在分组后,这四位有抢占优先级和子优先级的区分,因此在比较这两个优先级的时候,需要人为将内核外设的优先级自行分组来比较,若相同则比较硬件编号优先级。
3、编程流程
(1)创建及库包含
同上一篇,在USER文件夹中创建systick文件夹,保证一个外设一个文件夹以便管理,在bsp_systick.h文件中宏定义#ifndef防止重复包含,因为systick不同于前面的普通外设,普通外设的函数都在stm32f10x.h文件中声明,而内核外设在core_cm3.h文件中声明,因此需要include这个core_cm3.h,而后在bsp_systick.c中include这个bsp_systick.h。
(2)编写延时函数
在core_cm3.h中,已经有systick的配置函数,此函数对SysTick的寄存器进行配置,函数的参数是reload值,根据上述公式,若要1ms的systick计数,则赋72000,若需要0.5s的延时,则用for循环500次,内循环用while,while退出的条件就是systick完成一次计数后ctrl寄存器第16位置1,也即1ms。如此外循环退出时就延时了500ms。延时函数的最后需要停止使能systick。
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0; i<ms; i++)
{
while( !((SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
参考
[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档