【STM32】HAL库-系统滴答定时器SysTick

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的时钟树
【STM32】HAL库-系统滴答定时器SysTick_第1张图片
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

【STM32】HAL库-系统滴答定时器SysTick_第2张图片

SysTick控制及状态寄存器

【STM32】HAL库-系统滴答定时器SysTick_第3张图片

SysTick重装载数值寄存器

24位的倒计数器
在这里插入图片描述

SysTick当前数值寄存器

【STM32】HAL库-系统滴答定时器SysTick_第4张图片

SysTick校准数值寄存器

【STM32】HAL库-系统滴答定时器SysTick_第5张图片

系统滴答定时器中断优先级设置

通过系统异常优先级寄存器来设置系统滴答定时器的优先级
在设置优先级之前得确定优先级分组,几位是抢占式优先级,几位是子优先级。
【STM32】HAL库-系统滴答定时器SysTick_第6张图片
系统异常优先级寄存器在C文件中的代码
core_cm3.h
【STM32】HAL库-系统滴答定时器SysTick_第7张图片

直接操作寄存器配置系统滴答定时器demo

采用STM32F103C8T6单片机,KeilMDK5.32版本

时钟配置如下图
【STM32】HAL库-系统滴答定时器SysTick_第8张图片
选用外部时钟源(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配置
【STM32】HAL库-系统滴答定时器SysTick_第9张图片
【STM32】HAL库-系统滴答定时器SysTick_第10张图片

【STM32】HAL库-系统滴答定时器SysTick_第11张图片

主要代码
【STM32】HAL库-系统滴答定时器SysTick_第12张图片
先看序号1
函数HAL_Init()调用HAL_InitTick()来配置系统滴答定时器,

HAL_Init()
【STM32】HAL库-系统滴答定时器SysTick_第13张图片
HAL_InitTick()调用HAL_SYSTICK_Config()配置系统滴答定时器,和设置系统滴答定时器的优先级(优先级为15)。

HAL_InitTick()
【STM32】HAL库-系统滴答定时器SysTick_第14张图片
HAL_SYSTICK_Config()调用SysTick_Config()来进行配送系统滴答定时器

SysTick_Config()
【STM32】HAL库-系统滴答定时器SysTick_第15张图片
SysTick_Config()根据参数ticks来设置重载值,清除当前计数值,选择FCLK(72MHz)作为时钟源,设置中断优先级为15,并使能系统滴答定时器。

注意:此时FCLK还不是72MHz,因为STM32的时钟树相关的寄存器还未被设置。

序号2
SystemClock_Config()调用了HAL_RCC_ClockConfig()
HAL_RCC_ClockConfig()配置STM32的时钟树,将FCLK的频率设置为72MHz,再次调用HAL_InitTick()配置系统滴答定时器

此时才是真正的配置好了系统滴答定时器

HAL_RCC_ClockConfig()
【STM32】HAL库-系统滴答定时器SysTick_第16张图片
工程文件下载链接

你可能感兴趣的:(STM32,stm32,单片机,c语言)