【动手学STM32G4】(3)STM32G431之定时器

【动手学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 软硬件准备

硬件资源:

  1. NUCLEO-G431RB 开发板
  2. USB 数据线(Micro USB → USB-A):用于开发板供电、程序下载和串口通信。
  3. 示波器(可选):用于观察输出波形。

软件资源:

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 新建工程与基础设置

  1. 新建工程
    启动 STM32CubeMX,点击 "Start New Project" (或Ctrl-N快捷键)新建工程,进入 New Project 界面。
  • 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。
  • 选择开发板为 NUCLEO-G431RB 开发板。
  • 点击右上角 "Start Project" 创建项目。
  1. 基础设置:
    选择"引脚配置(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 配置

  1. 启用并配置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 程序

  1. 在 STM32CubeIDE 打开代码文件 main.c。

    代码生成后,已经自动进入 STM32CubeIDE,并打开创建的 STM32G431_TIM01 项目。在 "Core\Src" 目录中,已经生成了 tim.c 和 main.c 等基础程序。

  2. 从 "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)
  {
  }
}
  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 */
}
  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

相关推荐
悠哉悠哉愿意1 天前
【嵌入式学习笔记】AD/DA
笔记·单片机·嵌入式硬件·学习
松涛和鸣1 天前
DAY47 FrameBuffer
c语言·数据库·单片机·sqlite·html
阿凉07021 天前
新版本JLink安装目录中缺失JLinkDevices.xml添加方法
xml·嵌入式硬件
范纹杉想快点毕业1 天前
《嵌入式通信与数据管理:从状态机到环形队列的完整实战指南》
单片机·嵌入式硬件
硬汉嵌入式1 天前
ST最新推出的CMSIS-Driver,一套驱动完成对所有STM32系列的驱动支持
stm32·st·cmsis-driver
点灯小铭1 天前
基于单片机的硫化氢、氨气、甲烷、一氧化碳气体多种有害气体检测与声光报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
小李做物联网1 天前
【单片机毕设】c24基于单片机stm32蓝牙温室大棚物联网毕业设计
stm32·单片机·嵌入式硬件·物联网
电子工程师成长日记-C511 天前
51单片机厨房环境参数监测(温湿度、烟雾、燃气、CO、甲醛)
单片机·嵌入式硬件·51单片机
9稳1 天前
基于PLC的垃圾车自动收集装置控制系统设计
开发语言·网络·数据库·嵌入式硬件·plc