STM32系统嘀嗒Systick定时器

STM32系统嘀嗒Systick定时器

基本概念

定时器是STM32中常用的外设,一般定时器的基本功能就是定时,而在Cortex M3/M4内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Systick),它是属于CM4内核的一个外设,内嵌在NVIC中,所有基于Cortex-M3/M4内核的MCU中都包含这个Systick定时器,所以在不同的硬件中移植起来非常方便。

由于Systick定时器属于CM4内核,所以大家在STM32F4中文参考手册中是找不到关于Systick定时器的相关信息,大家可以在CM3权威指南或者Cortex M3/M4权威指南中找到。

基本应用

(1) 裸机开发:编写专门的延时函数,实现微秒、毫秒级别的延时,如作为闹钟或者延时。
(2) 操作系统:可以为RTOS实时操作系统的任务调度提供时钟节拍,RTOS的架构是并行的。

时钟分析

如果打算利用Systick定时器进行定时,则必须清楚Systick定时器的时钟频率,而定时器是挂载在总线下,而不同的总线的频率是不同的,而总线的频率是由时钟提供,而时钟的提供者又各不相同,所以必须要提前了解时钟源的区别。

时钟选择

通过M3内核文档可以知道Systick定时器有2个时钟源,一个是内部时钟(FCLK),一个是外部时钟(STCLK)
可以知道,Systick定时器的内部时钟的频率是168MHZ,外部时钟的频率是168MHZ/8 = 21MHZ 。

(1) 内部时钟

如果选择使用内部时钟(168MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成168000000个脉冲,意味着 1us可以生成168个脉冲,所以计数周期等于1/168us。

(2) 外部时钟

如果选择使用外部时钟(21MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成21000000个脉冲,意味着 1us可以生成21个脉冲,所以计数周期等于1/21us。

原理分析

如图

控制方式

//延时微秒 注意:Systick是24bit的递减计数器  约等于798915us,所以参数不可以超过这个值
void delay_us(u32 nus)
{
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nus * 21) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 // 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 // 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 // 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器

}

//延时毫秒 注意:Systick是24bit的递减计数器  约等于798ms,所以参数不可以超过这个值
void delay_ms(u32 nms)
{
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
	SysTick->LOAD = (nms * 21*1000) - 1;// 指的是计数次数,定时时间 = 计数次数 * 计数周期
	SysTick->VAL  = 0; 						 			// 清除当前数值寄存器的值
	SysTick->CTRL = 1; 						 			// 开启了定时器,并且定时器的时钟源选择了21MHZ--> 计数周期 = 1/21us
	while ((SysTick->CTRL & 0x00010000)==0);//等待延时时间到达
	SysTick->CTRL = 0; 						 			// 向控制状态寄存器中写入0,目的关闭系统嘀嗒定时器
}


操作逻辑

寄存器操作


参考李明轩老师第7天的笔记
posted @ 2024-07-10 14:21  shishusheng  阅读(88)  评论(1编辑  收藏  举报