1.SysTick简介
SysTick是一种系统定时器,可以用于实现操作系统、任务调度、时钟管理等功能。它通常集成在微控制器中,并且是硬件实现的,具有高精度和可靠性。
在ARM Cortex-M处理器中,SysTick定时器可以配置为计数器模式或外部时钟模式。在计数器模式下,SysTick定时器使用内部时钟作为时基,可以产生中断,以实现系统的定时功能和任务调度。在外部时钟模式下,SysTick定时器使用外部时钟信号作为时基,可以用于协调外部设备的时序和同步。
SysTick定时器通常具有以下特点:
1. 高精度:SysTick定时器通常可以提供高精度的计时功能,以满足实时应用的要求。
2. 灵活性:SysTick定时器可以通过软件配置来适应不同的应用场景和需求。
3. 可编程性:SysTick定时器可以通过编程来实现各种定时功能,例如系统节拍、超时检测、延时等。
2.SysTick使用方法
STM32系列微控制器中的SysTick定时器可以用于实现系统的定时功能和任务调度。以下是使用SysTick的基本步骤:
1. 启用SysTick定时器
首先需要启用SysTick定时器,通过设置SysTick控制和状态寄存器(STK_CTRL)的ENABLE位为1来完成。可以使用以下代码片段实现:
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
2. 配置SysTick时钟源
SysTick定时器可以使用内部时钟(CPU时钟)或外部时钟作为时基。通过设置SysTick控制和状态寄存器的CLKSOURCE位来选择时钟源。例如,要使用CPU时钟作为时基,可以使用以下代码片段:
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
3. 配置定时周期
SysTick定时器以一个固定的频率递减计数,当计数达到零时会触发中断。可以通过设置SysTick重载值寄存器(STK_LOAD)来配置定时周期。例如,要设置定时周期为1毫秒,可以使用以下代码片段(假设使用的时钟频率为72MHz):
SysTick->LOAD = 72000-1; // 72MHz / 1000Hz - 1
4. 启用中断
如果需要在定时周期结束时触发中断,可以设置SysTick控制和状态寄存器的TICKINT位为1。例如,要启用中断,可以使用以下代码片段:
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
5. 中断处理
在定时周期结束时,SysTick定时器会触发中断。可以编写中断处理函数来执行相应的操作。例如,在Cortex-M系列处理器中,可以使用以下方式定义SysTick中断处理函数:
void SysTick_Handler(void)
{
// 在这里执行需要定时的任务
}
6. 启动定时器
最后,通过设置SysTick控制和状态寄存器的ENABLE位为1来启动定时器。例如,可以使用以下代码片段:
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
通过以上步骤,就可以使用SysTick定时器实现系统的定时功能和任务调度了。需要根据具体的需求进行配置和使用,例如调整定时周期、启用/禁用中断等。请注意,具体的寄存器名称和位定义可能因STM32系列型号而有所差异,请查阅相关的参考手册获取准确的信息。
3.SysTick定时器实例
由于SysTick定时器是内核里面的外设,所以需要包含头文件“core_cm3.h”。
1. SysTick_Config
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//reload寄存器位24bit,最大值为2^24
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//配置reload寄存器的初始值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//配置中断优先级为1<<4-1 =15,优先级为最低
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//配置counter计数器的值
SysTick->VAL = 0;
//分别配置systick的时钟为72M,使能中断,使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
SysTick_Config()需要传进去一个形参,这个形参是要被写入重装载寄存器LOAD里面。
2.SysTick定时是时间计算
t = reload * (1/clk)
clk = 72M时 t = (72)*(1/72M) = 1us
clk = 72M时 t = (72000)*(1/72M) = 1ms
3. 编写延时函数
首先调用 SysTick_Config()函数,传入参数72就是1us,72000就是1ms。
SysTick_Config(72);
然后使用一个for循环计数,执行一次for循环就代表1us,for循环里面再用一个while循环,通过CTRL是否置1来 判断是都计时1us。
for(i = 0;i < us; i++)
{
while( ! ((SysTick->CTRL) & (1 << 16)) );
}
延时完成后需要关闭定时器文章来源:https://www.toymoban.com/news/detail-832247.html
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
最后,在main函数中调用这个延时函数并传递 一个形参即可。文章来源地址https://www.toymoban.com/news/detail-832247.html
到了这里,关于STM32—系统定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!