STM32—系统定时器

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)) );
	}

延时完成后需要关闭定时器

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

最后,在main函数中调用这个延时函数并传递 一个形参即可。

你可能感兴趣的:(stm32,嵌入式硬件,单片机)