【动手学STM32G4】(1)STM32G431之导入和创建项目
【动手学STM32G4】(2)STM32G431之外部中断
【动手学STM32G4】(3)STM32G431之定时器
【动手学STM32G4】(3)STM32G431之定时器
-
- [1. 项目简介](#1. 项目简介)
-
- [1.1 定时器实验项目](#1.1 定时器实验项目)
- [1.2 软硬件准备](#1.2 软硬件准备)
- [2. 工作原理](#2. 工作原理)
- [3. CubeMX 工程创建与配置](#3. CubeMX 工程创建与配置)
-
- [3.1 新建工程与基础设置](#3.1 新建工程与基础设置)
- [3.2 TIM 配置](#3.2 TIM 配置)
- [3.3 GPIO 配置](#3.3 GPIO 配置)
- [3.4 时钟配置](#3.4 时钟配置)
- [3.5 工程配置](#3.5 工程配置)
- [3.6 生成工程代码](#3.6 生成工程代码)
- [4. 使用 STM32CubeIDE 编写和调试 TIM 程序](#4. 使用 STM32CubeIDE 编写和调试 TIM 程序)
- [5. 小结](#5. 小结)
1. 项目简介
1.1 定时器实验项目
在本项目中,我们将使用STM32G431RB的TIM1定时器实现一个精确的定时功能。
- 配置 TIM1 每1ms产生一次中断;
- 在中断服务函数中计数,每500次(即500ms)翻转一次 PA9 引脚电平;
- 最终在 PA9 引脚上产生周期为1秒(频率1Hz)的方波信号。
1.2 软硬件准备
硬件资源:
- NUCLEO-G431RB 开发板
- USB 数据线(Micro USB → USB-A):用于开发板供电、程序下载和串口通信。
- 示波器(可选):用于观察输出波形。
软件资源:
STM32CubeMX, STM32CubeIDE,VOFA+ 串口调试工具
硬件连接:
- Nucleo-G431RB 开发板通过其USB端口(Micro-USB)连接到PC。
2. 工作原理
STM32G4系列的定时器功能强大,TIM1是高级控制定时器,具有以下特性:
- 16位自动重载计数器
- 支持向上、向下、中央对齐计数模式
- 4个独立通道,支持输入捕获、输出比较、PWM生成
- 互补输出带死区插入,适合电机控制
- 支持编码器接口和霍尔传感器接口
定时器频率计算公式:
- 定时器频率 = 定时器时钟源 / (预分频器 + 1)
- 中断周期 = (自动重载值 + 1) / 定时器频率
为了产生一个 1ms 的中断周期,则定时器的参数计算如下:
bash
定时器时钟频率 ftimclock = 160MHz
预分频器 PSC = 159
自动重载值 ARR = 999
定时器频率 ftimer = 160MHz/(159+1) = 1 MHz
中断周期 Tint = (999+1)/1MHz = 1ms
3. CubeMX 工程创建与配置
3.1 新建工程与基础设置
- 新建工程
启动 STM32CubeMX,点击 "Start New Project" (或Ctrl-N快捷键)新建工程,进入 New Project 界面。
- 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。
- 选择开发板为 NUCLEO-G431RB 开发板。
- 点击右上角 "Start Project" 创建项目。

- 基础设置:
选择"引脚配置(Pinout & Configuration)",
(1)选择 "System Core -- SYS" 设置调试器类型,将 Debug 模式设为 "Serial Wire"。
(2)选择 "System Core -- SYS" 设置基础时钟源(Timebase Source),可以选择默认设置 "SysTick"。

(3)选择 "System Core -- RCC" 配置时钟模式,设置高速、低速时钟为外部晶振,将 High Speed Clock (HSE) 设为 "Crystal/Ceramic Resonator"。

3.2 TIM 配置
- 启用并配置TIM1 :
(1)选择 "引脚配置(Pinout & Configuration)",从左侧下拉列表中选择 "Timers -- TIM1 -- TIM1 Mode and Configuration " ,将时钟源配置为内部时钟 "Clock Source: Internal Clock"。
(2)系统时钟频率设置为 160MHz(具体设置见下节),配置 TIM 工作模式和参数如下。
bash
Counter Settings
Prescaler(PSC-16 bits value): 159
Counter Mode: Up
Counter Period(AutoReload Register-16 bits value): 999
(3)使能 NVIC 中断:
勾选 "TIM1 update interrupt and TIM16 global interrupt"。

3.3 GPIO 配置
配置 GPIO 用于 LED 指示或按键触发。例如,将 PA5 配置为 GPIO_OUT(LD2),PA9 配置为 GPIO_OUT,将 PC13 配置为 GPIO_EXTI13(UserBTN)。

3.4 时钟配置
在 Clock Configuration 视图进行时钟配置。如下图所示,APB2 定时器时钟为160MHz(TIM1挂载在APB2总线上)。

3.5 工程配置
点击工具栏 "Project Manager" 进入工程配置界面,如下图所示。
(1)在 Project Name 输入项目名称 "STM32G431_TIM01"。
(2)在 Toolchain/IDE 选择 IDE 工具为 "STM32CubeIDE"(也可以根据需要选择其它 IDE 工具 )。

(3)在 "Project Manager" 继续向下拉,"在 MCU and Firmware Package" 栏中,取消选中 "Use latest available version",根据所安装的 G4 固件版本,选择 "STM32Cube FW_G4 V1.5.0";
(4)如果固件包不是安装在默认路径,则要取消选中 "Use Default Firmware Location",通过 Browse 选择固件包的安装路径。

(5)切换到 "Code Generator",勾选生成选项:"Generate peripheral initialization as a pair of '.c/.h' files per peripheral"。
3.6 生成工程代码
点击右上角 "GENERATE CODE" ,将自动生成带 .ioc 的工程文件 "STM32G431_TIM01.ioc"
加载完毕后,弹出代码生成提示窗口,点击" OPEN PROJECT",进入 STM32CubeIDE。

可以在 main.c 中看到 CubeMX 自动生成的初始化函数调用:
c
#include "main.h"
#include "tim.h"
#include "gpio.h"
后续我们将在这些初始化的基础上,编写用户代码。
4. 使用 STM32CubeIDE 编写和调试 TIM 程序
-
在 STM32CubeIDE 打开代码文件 main.c。
代码生成后,已经自动进入 STM32CubeIDE,并打开创建的 STM32G431_TIM01 项目。在 "Core\Src" 目录中,已经生成了 tim.c 和 main.c 等基础程序。
-
从 "Core\Src" 目录打开文件 main.c,如下图所示。
在用户代码区添加代码 "HAL_TIM_Base_Start_IT(&htim1)",开启 TIM1定时器。
完整 main.c 程序如下:
c
int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config(); // 160MHz
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init(); // 1ms interrupt for TIM1
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1); // start TIM1
/* USER CODE END 2 */
/* Infinite loop */
while (1)
{
}
}

- 在stm32g4xx_it.c文件中实现中断服务函数。
在 TIM1_UP_TIM16_IRQHandler() 函数中增加计数和翻转程序如下:
c
/**
* @brief This function handles TIM1 update interrupt and TIM16 global interrupt.
*/
uint16_t TimeCounter;
void TIM1_UP_TIM16_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */
TimeCounter++;
if(TimeCounter>=500)
{
TimeCounter=0;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
/* USER CODE END TIM1_UP_TIM16_IRQn 1 */
}

- 程序编辑、编译与调试
- 硬件连接
- 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
- 软件调试
- 点击工具栏中 "Build Debug" 按键对程序代码进行编译。
- 点击工具栏中 "Debug" 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
- 点击工具栏中 "Resume" 按键 或 F8 快捷键,运行程序。
bash
**** Incremental Build of configuration Debug for project STM32G431_TIM01 ****
make -j20 all
...
Finished building target: STM32G431_TIM01.elf
arm-none-eabi-size STM32G431_TIM01.elf
arm-none-eabi-objdump -h -S STM32G431_TIM01.elf > "STM32G431_TIM01.list"
text data bss dec hex filename
8952 12 1652 10616 2978 STM32G431_TIM01.elf
Finished building: default.size.stdout
Finished building: STM32G431_TIM01.list
Build Finished. 0 errors, 0 warnings. (took 501ms)
运行程序,使用示波器分析仪测量PA9引脚,输出波形如下图所示:
- 高电平持续时间:500ms,低电平持续时间:500ms;
- 信号周期:1000ms(1Hz)。

5. 小结
通过本项目,我们学习了:
- 定时器基本原理:预分频器和自动重载值的计算方法;
- CubeMX配置:如何图形化配置定时器中断;
- 中断编程:使用HAL库的中断回调机制。
版权声明:
【动手学电机驱动】是 youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/156653776)
Copyright@youcans 2026
Crated:2026-01