SysTick定时器被捆绑在NVIC中,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。
系统滴答定时器有4个寄存器
CTRL | SysTick控制及状态寄存器(地址:0xE000_E010) |
---|---|
LOAD | SysTick重装载数值寄存器(地址:0xE000_E014) |
VAL | SysTick当前数值寄存器(地址:0xE000_E018) |
CALIB | SysTick校准数值寄存器(地址:0xE000_E01C) |
时钟源
该定时器的时钟源可以是
- 内部时钟(FCLK,CM3上的自由运行时钟)
- 外部时钟( CM3处理器上的STCLK信号)
通过SysTick控制及状态寄存器的第2位来确定
STM32的时钟树
RCC通过AHB时钟(HCLK)8分频或者不分频作为Cortex系统定时器(SysTick)的外部时钟。CLKSOURCE = 0
FCLK是Cortex™-M3的自由运行时钟。详情见ARM的Cortex™-M3技术参考手册。CLKSOURCE = 1
由下图代码可知,库函数默认选择FCLK时钟作为SysTick的时钟源
/* SysTick end of count event each 1ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); //Systick定时周期为1ms
SysTick控制及状态寄存器
SysTick重装载数值寄存器
24位的倒计数器
SysTick当前数值寄存器
SysTick校准数值寄存器
系统滴答定时器中断优先级设置
通过系统异常优先级寄存器来设置系统滴答定时器的优先级
在设置优先级之前得确定优先级分组,几位是抢占式优先级,几位是子优先级。
系统异常优先级寄存器在C文件中的代码core_cm3.h
直接操作寄存器配置系统滴答定时器demo
采用STM32F103C8T6单片机,KeilMDK5.32版本
时钟配置如下图
选用外部时钟源(STCLK)即Cortex System timer 频率为9MHz
作为系统滴答定时器的时钟源
系统滴答定时器定时时间为1ms,也就是1KHz,根据时钟源频率 9MHz/1KHz = 9000;
即系统滴答定时器重载值为9000-1=8999。
SysTick->LOAD = 8999; /* 设置重载值 */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* 设置中断优先级 15(最低优先级) */
SysTick->VAL = 0UL; /* 当前计数值 */
SysTick->CTRL |= 0 << 2; /* 选择外部时钟源 */
SCB->SHP[11] = 0xF0; /* 设置抢占式优先级为15 */
SysTick->CTRL |= 1 << 1; /* SysTick倒数计数到0时产生SysTick异常(中断)请求 */
SysTick->CTRL |= 1 << 0; /* 使能SysTick */
HAL库配置系统滴答定时器demo
采用STM32F103C8T6单片机,KeilMDK5.32版本
HAL库默认采用FCLK作为系统滴答定时器的时钟源72MHz
定时的时间为1ms,也就是1KHz,重载值为72000-1=71999
优先级为15
PC13控制LED灯,LED的亮灭指示程序运行状态
STM32CubeMX配置
主要代码
先看序号1
函数HAL_Init()
调用HAL_InitTick()
来配置系统滴答定时器,
HAL_Init()HAL_InitTick()
调用HAL_SYSTICK_Config()
配置系统滴答定时器,和设置系统滴答定时器的优先级(优先级为15)。
HAL_InitTick()HAL_SYSTICK_Config()
调用SysTick_Config()
来进行配送系统滴答定时器
SysTick_Config()SysTick_Config()
根据参数ticks来设置重载值,清除当前计数值,选择FCLK(72MHz)作为时钟源,设置中断优先级为15,并使能系统滴答定时器。
注意:此时FCLK还不是72MHz,因为STM32的时钟树相关的寄存器还未被设置。
序号2SystemClock_Config()
调用了HAL_RCC_ClockConfig()
。HAL_RCC_ClockConfig()
配置STM32的时钟树,将FCLK的频率设置为72MHz,再次调用HAL_InitTick()
配置系统滴答定时器
此时才是真正的配置好了系统滴答定时器文章来源:https://www.toymoban.com/news/detail-400212.html
HAL_RCC_ClockConfig()
工程文件下载链接文章来源地址https://www.toymoban.com/news/detail-400212.html
到了这里,关于【STM32】HAL库-系统滴答定时器SysTick的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!