STM32F4X Systick系统滴答定时器
Systick定时器
在以Crotex-M4为架构的MCU中,都会有一个Systick内核定时器,这个定时器的作用可以给系统一个心跳时钟,通常用在MCU的延时和作为RTOS的心跳时钟等。
Systick使用
Systick时钟源
在Crotex-M4中,Systick的时钟源选择有两种,一个是经过8分频的AHB时钟,一个是使用内核时钟,有关这两个时钟源可以在STM32F4X数据手册中进行查看。
Systick寄存器
Systick的寄存器有4个,具体的寄存器是说明可以在《Crotex-M4权威指南》里面可以查看。
其中最重要寄存器是控制寄存器和重装载寄存器。控制寄存器是设置Systick的时钟源和是否触发异常。重装载寄存器是设置重装载值,也就是计多少个数就触发一次异常。
Systick频率计算
Systick定时器的频率计算跟普通定时器的频率计算是一样的。我们假设Systick的时钟源频率为168MHZ。上面说过Systick的时钟源有两种选择,我们这里选以HCLK为时钟源,也就是时钟源就是168MHZ。如果我们需要得到一个1us的频率,可以按照下面的方法进行配置。
我们需要把控制寄存器的bit2设置成1,把重装载寄存器的值设置为168 ,这样就可以实现1us触发一次异常。
Tout = (1 / 168000000) * 168 = 1us
Systick例程
c
#include "stm32f4xx.h"
static int system_tick_cnt = 0;
void system_tick_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_ClocksTypeDef RCC_Clocks ;
RCC_GetClocksFreq(&RCC_Clocks); // 得到HCLK时钟频率
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); // Systick时钟源为HCLK
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000000); // 重装载值设置为168
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
//system_tick_cnt++;
system_tick_cnt--;
}
void delay_us(u32 us)
{
system_tick_cnt = us;
while(system_tick_cnt != 0);
}
void delay_ms(u32 ms)
{
while(ms)
{
delay_us(1000);
ms--;
}
}
int main(void)
{
int i;
NVIC_PriorityGroupConfig(2);
system_tick_init(); // 初始化Systick时钟
bsp_usart_init(115200);
while(1){
delay_ms(1000); // 每隔1秒打印一次
printf("hello\r\n");
}
}