如何使用STM32定时器生成1秒中断
如何使用STM32定时器生成一秒钟的中断?1.引言应用程序通常需要一个周期性中断,该中断用作触发任务、添加延迟、跟踪经过的时间等的时基。。。
如何使用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.步骤
- 打开STM32CubIDE
- 使用NUCLEO-G007RB板创建新项目

- 为项目命名

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

- 设置系统时钟频率
我们将把HCLK设置为最大64 MHz:

将APB预编码器设置为1将导致APB外围时钟(PCLK)也设置为64 MHz。

- 选择TIM3
请注意,虽然您可以使用任何计时器,但TIM3在本例中使用。
您可以在STM32CubeIDE的引脚输出和配置选项卡中的“定时器”下找到TIM3。

- 选择内部时钟作为TIM3的时钟源:
在TIM3模式和配置中,选择内部时钟作为时钟源。

- 配置TIM3
在参数设置中,我们将输入之前在理论部分中计算的值。
我们将为预分频器设置6399
并使用10000作为计数器周期

- 启用TIM3全局中断

- 生成代码
保存项目,也将生成代码。
- 添加代码以切换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*/
- 构建项目,进入调试模式并运行代码

项目生成后,进入调试会话,然后单击“继续”图标运行代码。


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