如何使用STM32定时器生成一秒钟的中断?

1.简介

应用程序通常需要一个周期性中断,该中断用作触发任务、添加延迟、跟踪经过的时间等的时基。虽然本文展示了如何配置STM32定时器以每秒生成一个中断,但很容易更改其他周期性速率的一些参数。
 

2.先决条件

H硬件

  • 核苷酸-G070RB
  • Micro USB电缆用于从主机为Nucleo板供电,并将代码加载到STM32中。
     

软件

  • STM32管
 

3.理论

在本文中,我们将使用一个通用的STM32定时器来每秒生成一个中断。我们本可以使用Systick或RTC(实时时钟),但在本文中,我们将在STM32G0微控制器中使用一个简单的计时器,即计时器3(TIM3)。TIM3是STM32微控制器中嵌入的众多定时器之一。

TIM3包含许多组件,如以下框图所示。虽然定时器支持许多功能和特性,但只需要一个子集就可以生成周期性的1秒中断。本例使用并配置了定时器块的以下组件:
  • 输入时钟(计时器的时钟源):此时钟称为内部时钟(CK_INT),来自RCC(重置和时钟控制)块,并根据外围时钟(APB)进行预缩放,后者根据AHB时钟进行预缩放。
  • 预分频器输入时钟CK_PSC来自触发器控制器,与输入时钟相同
  • PSC预分频器将其输入时钟CK_PSC分频,并将其输出为CK_CNT
  • CK_CNT是CNT计数器的输入时钟,用于使其递增
  • 自动重新加载寄存器(ARR)加载有计数器递增到的值。当达到该值时,将生成更新中断,清除计数器并重新开始计数。加载到ARR中的值决定了定时器中断的周期性速率。


在本部分中,我们将回顾配置TIM3以每秒生成中断所需的各种计算。
首先,TIM3输入时钟(TIM3CLK)被设置为APB1时钟(PCLK1),
APB1预分频器将被设置为1。
因此TIM3CLK=PCLK1
且PCLK1=HCLK
=>TIM3CLK=HCLK=系统核心时钟
在本例中,我们将以STM32G0的最大速度(64 MHz)运行它。
因此SystemCoreCClock设置为64 MHz。
为了获得10 KHz的TIM3计数器时钟,预分频器的计算如下:
预分频器=(TIM3CLK/TIM3计数器时钟)-1
预分频器=(SystemCoreClock/10KHz)-1=(64MHz/10KHz)-1=6400-1=6399
作为周期的TIM3 ARR(自动重新加载寄存器)值等于10000-1,
更新速率=TIM3计数器时钟/(周期+1)=1 Hz。这会导致每1秒发生一次中断。
当计数器值达到自动重新加载寄存器值时,产生TIM更新中断,并且在处理程序例程中,引脚PA5(连接到板NUCLEO-G007RB上的LED4)被切换。
既然我们已经计算了必要的配置值,那么让我们完成生成代码的步骤,以便计时器每秒触发一次中断。

 

4.步骤

  1.  打开STM32CubIDE
  2. 使用NUCLEO-G007RB板创建新项目

 
  1. 为项目命名

 
  1. 使用默认设置初始化所有外围设备

 
  1. 设置系统时钟频率
我们将把HCLK设置为最大64 MHz:
将APB预编码器设置为1将导致APB外围时钟(PCLK)也设置为64 MHz。


 
  1. 选择TIM3
请注意,虽然您可以使用任何计时器,但TIM3在本例中使用。

您可以在STM32CubeIDE的引脚输出和配置选项卡中的“定时器”下找到TIM3。
  1. 选择内部时钟作为TIM3的时钟源:
在TIM3模式和配置中,选择内部时钟作为时钟源。
  1. 配置TIM3
在参数设置中,我们将输入之前在理论部分中计算的值。
我们将为预分频器设置6399
并使用10000作为计数器周期
  1. 启用TIM3全局中断

  1. 生成代码
保存项目,也将生成代码。
  1. 添加代码以切换LED
在main.c中,在主函数(t)中添加以下代码他的代码用于在中断模式下启动定时器TIM3):
  /*用户代码开始2*/
  如果(HAL_TIM_Base_Start_IT(&htim3)=暂停(_OK))
{
    /*启动错误*/
错误处理程序();
}
  /*用户代码端2*/
在stm32g0xx_it.c中,添加以下代码in TIM3_IRQ处理器(定时器3中断服务请求),它将切换LED:
  /*用户代码开始TIM3_IRQn 1*/
HAL_GPIO_切换引脚(LED_GREEN_GPIO_Port,LED_GREEN_引脚);
  /*用户代码结束TIM3_IRQn 1*/
 
  1. 构建项目,进入调试模式并运行代码
项目生成后,进入调试会话,然后单击“继续”图标运行代码。

当代码运行时,绿色LED按配置每秒切换一次。
 

5.链接

STM32G070产品介绍

Arm®Cortex®-M0+32位MCU、128 KB闪存、36 KB RAM、4个USART、定时器、ADC、DAC、通信I/F、1.7-3。。。。

STM32G070参考手册

STM32G0x0基于Arm®的高级32位MCU-参考手册

STM32管

STM32CubeIDE-STM32集成开发环境-STMicroelectronics

核-G070RB以下为:

NUCLEO-G007RB-STM32Nucleo-64开发板,带STM32G007RB MCU,支持Arduino和ST morp。。。