恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
【STM32C5教程】(5)定时器周期中断实验
首页
资讯中心
/
【STM32C5教程】(5)定时器周期中断实验
【STM32C5教程】(5)定时器周期中断实验
发布时间:2026/10/14 21:19:38
欢迎关注 youcansxidian【嵌入式软件AI编程】专栏【STM32C5教程】2STM32CubeMX2 安装与STM32C5闪灯【STM32C5教程】4GPIO 外部中断实验【STM32C5教程】5定时器周期中断实验【STM32C5教程】6定时器 PWM 输出实验1. 项目简介1.1 实验目标本实验在 NUCLEO-C542RC 开发板上使用 STM32C542RCT6 的 TIM6 基本定时器产生周期中断在中断回调中翻转板载 LEDPA5状态实现 LED 每 500 ms 切换一次掌握 STM32C5 系列定时器周期中断的配置与使用方法。功能需求使用 TIM6 产生周期中断不使用软件延时每次更新事件触发一次中断每 500 ms在中断回调中翻转 LD1PA5LED 每 500 ms 切换一次开发板和 MCU 型号NUCLEO-C542RC 开发板搭载 STM32C542RCT6 MCU。1.2 实验条件硬件NUCLEO-C542RC 开发板支持数据传输的 USB Type-C 线用于连接 ST-LINK 接口软件STM32CubeMX2用于引脚、时钟配置与代码生成VS Code STM32Cube 插件用于编译、烧录、调试2. 硬件说明2.1 NUCLEO-C542RC 开发板NUCLEO-C542RC 是 ST 基于 STM32C542RCT6 推出的 Nucleo-64 开发板。主要特性MCUSTM32C542RCT6Arm Cortex-M33 内核最高主频 144 MHz256 KB Flash64 KB RAM调试器板载 STLINK-V3EC支持大容量存储、虚拟串口和调试端口三种功能用户 LEDLD1连接 PA5用户按键B1连接 PC13复位按键B2扩展接口Arduino Uno V3 和 ST morpho 连接器本实验使用板载的 LD1 和 B1无需额外外设。2.2 引脚说明引脚别名功能方向有效电平PA5LD1板载用户 LEDGPIO 输出高电平点亮PA5LD1配置为推挽输出输出高电平时 LED 点亮输出低电平时 LED 熄灭。复位后初始状态为低电平LED 熄灭。3. STM32CubeMX2 工程配置3.1 新建工程本实验采用 MCU 方式创建工程即以芯片型号 STM32C542RC 为起点而非开发板方式。进入 MCU 选择界面启动 STM32CubeMX2在首页点击 MCU进入芯片型号选择列表。搜索并选中芯片在 MCU name 输入框中输入 STM32C542RC或完整型号 STM32C542RCT6从筛选出的列表中选择对应型号。填写项目信息输入项目名称 TIM_IT_500ms 和项目保存路径。项目名称避免使用特殊字符路径建议使用纯英文目录。3.2 基础配置工程创建后软件自动进入 Pinout 视图。时钟配置本工程系统时钟配置为144 MHzAPB1 分频系数为 1TIM6 输入时钟为144 MHz。3.3 GPIO 配置PA5 输出在 Pinout 视图中找到PA5引脚。右键点击 PA5选择Assign signal→GPIO。再次右键点击 PA5选择Configure GPIO进入 GPIO 详细配置界面。将 PA5 的Mode设置为Output。保持默认参数Output level 为 LowOutput mode 为 Push PullPull-up/Pull-down 为 No pull-up and no pull-downMaximum output speed 为 Low。在User Label输入框中填入LD1。设置别名后CubeMX2 会自动生成宏定义LD1_PORT和LD1_PIN。3.4 TIM6 配置1启用 TIM6在左侧外设列表中找到Timers→TIM6点击展开将Clock Source设置为Internal Clock内部时钟。2配置定时参数在 TIM6 的Parameter Settings中设置参数值说明Prescaler (PSC)14399144 MHz ÷ 14400 10 kHzCounter ModeUp向上计数Counter Period (ARR)499910 kHz ÷ 5000 2 Hzauto-reload preloadEnable建议启用自动重装载预装载3.5 项目配置点击Project Settings进入工程设置页面。在IDE Format下拉选项中选择CMake。在CMake Toolchain下拉选项中选择GCC。确认配置无误后点击Generate Code。CubeMX2 会执行配置检查如果没有错误开始在指定路径下生成 CMake 工程文件。生成完成后项目路径下会出现标准 CMake 工程结构包含Core/、Drivers/、CMakeLists.txt等。4. 编程实现4.1 实现思路采用“TIM6 周期中断 回调中翻转 LED”的方案TIM6 计数到 ARR4999溢出 │ ▼ 置位更新标志 UIF 触发 TIM6 全局中断NVIC │ ▼ TIM6_IRQHandler() // CubeMX 生成无需修改 │ ▼ HAL_TIM_IRQHandler() // 清中断标志 │ ▼ HAL_TIM_UpdateCallback() // 用户重写的回调 │ ▼ HAL_GPIO_TogglePin() // 翻转 LD1与软件延时的区别使用HAL_Delay()延时会让 CPU 空转等待期间无法响应其他事件使用 TIM6 硬件定时中断定时精度由硬件保证CPU 不阻塞。必须手动启动定时器CubeMX2 生成的初始化代码只配置了 TIM6 的寄存器不会自动启动定时器和使能中断。必须在main()中调用HAL_TIM_Start_IT()才能真正开始周期性中断。各步骤使用的 HAL 函数步骤HAL 函数作用启动定时器中断HAL_TIM_Start_IT()使能更新中断并启动计数获取 TIM6 句柄mx_tim6_gethandle()返回 CubeMX 生成的 TIM6 句柄翻转 LEDHAL_GPIO_TogglePin(LD1_PORT, LD1_PIN)切换 PA5 输出电平4.2 关键代码在 VS Code 中打开生成的 CMake 工程找到Core/Src/main.c添加以下代码。1主函数intmain(void){if(mx_system_init()!SYSTEM_OK){return(-1);}else{/* * Start the periodic interrupt generation of TIM6. * TIM6 is configured to generate an update event every 500 ms, * the LD1 (PA5) LED is toggled in the HAL_TIM_UpdateCallback(). */if(HAL_TIM_Start_IT(mx_tim6_gethandle())!HAL_OK){return(-1);}while(1){}}}2TIM6 更新中断回调函数/** * brief: TIM6 update interrupt callback (period elapsed). * Called by the HAL in IRQ context each time TIM6 reaches its period * (every 500 ms). Toggle the on-board LED LD1 on PA5. * param: htim Pointer to the TIM handle. */voidHAL_TIM_UpdateCallback(hal_tim_handle_t*htim){HAL_GPIO_TogglePin(LD1_PORT,LD1_PIN);}代码说明LD1_PORT、LD1_PIN 两个宏由 CubeMX2 生成在 generated/hal/mx_gpio_default.h通过main.h 链入在 main.c 中可直接使用。mx_tim6_gethandle() 返回 CubeMX2 生成的 TIM6 句柄。HAL_TIM_Start_IT() 启动 TIM6 并使能更新中断。这一步必须手动调用否则定时器不会开始计数中断永远不会产生。HAL_TIM_UpdateCallback() 是 HAL 库中已经声明好的回调入口HAL 库中有一个空的默认实现。用户在自己的源文件中重写这个同名函数中断发生时 HAL 就会自动调用它无需修改驱动源码。回调在中断上下文中执行应保持简短。这里只有一条翻转语句非常合适。参数 htim 在本实验中没有使用保留它是为了与回调签名一致。5. 编译烧录与运行测试5.1 编译与烧录打开工程用 VS Code 打开 CubeMX2 生成的 CMake 工程文件夹如 TIM_IT_500ms_cmake。编译点击 VS Code 底部状态栏的Build按钮或使用命令面板执行 CMake 构建。编译完成后终端应输出Build finished with exit code 0无 error。连接开发板用支持数据传输的 USB Type-C 线连接 NUCLEO-C542RC 的 ST-LINK USB 口CN1。确认设备识别打开设备管理器在“端口 (COM 和 LPT)”下应能看到STLink COMx。烧录点击 VS Code 中的运行按钮将固件下载到开发板。5.2 运行与测试烧录完成后程序自动开始运行。观察板载 LED LD1 的闪烁情况测试 1初始状态复位开发板按下黑色复位按键 B2观察 LD1。复位后程序开始运行TIM6 立即启动LD1 开始以 500 ms 间隔翻转。测试 2闪烁周期观察 LD1 的闪烁节奏亮 500 ms → 灭 500 ms → 亮 500 ms → ……闪烁周期为 1 秒亮灭各 500 ms。可用手机秒表计时核对。测试结果☑ 编译通过无错误☑ 烧录成功☑ 上电后 LD1 每 500 ms 翻转一次闪烁周期为 1 s☑ 闪烁间隔均匀、稳定功能正常。6. 小结本实验通过 TIM6 定时器周期中断实现了板载 LED 的周期性闪烁掌握了 STM32C5 系列定时器中断的配置与使用方法。核心逻辑可以概括为“TIM6 硬件计数 → 溢出产生更新中断 → 回调翻转 LED”。有两点需要注意第一定时器中断必须手动启动。 CubeMX2 生成的初始化代码只完成寄存器配置不会自动开始计数。必须在 main() 中调用 HAL_TIM_Start_IT()中断才会周期性产生。第二中断回调应保持简短。 回调在中断上下文中执行耗时操作会影响系统响应其他中断。本实验只有一条翻转语句非常合适。如果需要改变闪烁周期只需在 CubeMX2 中修改 TIM6 的 Prescaler 和 Counter Period重新生成代码即可main.c 无需改动。版权声明欢迎关注 youcansxidian【嵌入式软件AI编程】专栏转发必须注明原文链接【STM32C5教程】5定时器周期中断实验Copyright by ai4mcuqq.com 2026Crated2026-10