STM32呼吸灯实验手册(TIM定时器)

一、实验目标

  1. 使用TIM定时器的PWM模式控制LED亮度
  2. 实现LED渐亮渐灭的呼吸灯效果
  3. 掌握HAL库的TIM配置方法

二、硬件准备

  • 开发板:STM32F103C8T6
  • LED模块:LED串联220Ω电阻两组
  • USB-TTL调试器
  • 硬件连接

三、软件配置(STM32CubeMX)

  • 打开STM32CubeMX
  • 选择MCU型号:STM32F103C8T6
  • 设置SYS调试接口:Serial Wire(SWD)
  • 设置TIM参数

对照参数设置

按设置生成的波形

  • 设置RCC参数
  • 生成项目

四、代码编写

在生成代码的mian函数中编写如下代码

复制代码
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL1);//启动PWM正常输出
HAL_TIMEx_PWM_Start(&htim1,TIM_CHANNEL1);//启动PWM互补输出

while(1){//修改
float t = HAL_GetTick() * 0.001;//获取当前时间
    float duty = 0.5 * sin(2*3.14*t) + 0.5;//计算占空比
    uint16_t arr = __HAL_TIM_GET_AUTORELOAD(&htim1);//获取ARR寄存器的值
    uint16_t ccr = duty * (arr + 1);//计算CRR寄存器的值
    __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,ccr);//将计算结果写入CCR
}

五、代码解析

关键函数说明


HAL_TIM_PWM_Start

复制代码
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

功能作用

此函数用于启动定时器(TIM)的指定通道输出PWM信号。其核心操作包括:

  • 使能定时器的计数器(TIMx->CR1 |= TIM_CR1_CEN
  • 启用指定通道的PWM输出(配置通道的CCxE位,如TIMx->CCER |= TIM_CCER_CC1E

参数解析

参数 类型 说明
htim TIM_HandleTypeDef* 指向TIM外设的句柄(包含定时器配置信息,如预分频、计数模式等)
Channel uint32_t 指定PWM输出的通道号(TIM_CHANNEL_1TIM_CHANNEL_4

HAL_TIMEx_PWM_Start
复制代码
HAL_StatusTypeDef HAL_TIMEx_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

功能作用

此函数是HAL库中针对高级定时器(TIM1/TIM8)或复杂PWM场景的扩展函数 ,用于启动定时器的PWM输出。与HAL_TIM_PWM_Start的主要区别在于:

  • 支持高级定时器的互补通道(如CH1N、CH2N等)
  • 包含刹车(Break)和死区时间(Dead Time)控制逻辑
  • 适用于电机控制、逆变器等需要安全保护的场景

参数解析

参数 类型 说明
htim TIM_HandleTypeDef* 指向高级定时器(TIM1/TIM8)的句柄
Channel uint32_t 支持互补通道 的选项: TIM_CHANNEL_1 TIM_CHANNEL_1N

HAL_TIM_GET_AUTORELOAD
复制代码
#define HAL_TIM_GET_AUTORELOAD(__HANDLE__) 

功能作用

此宏用于直接读取定时器自动重装载寄存器(AutoReload Register, ARR)的当前值
核心功能

  • 获取定时器的周期设定值(决定PWM频率或定时溢出时间)
  • 适用于动态调整定时参数时的参数校验
  • 调试时验证配置是否生效

| 参数 | 类型 | 说明 |

__HANDLE__ TIM_HandleTypeDef* 指向TIM外设的句柄(包含定时器配置信息)

HAL_TIM_SET_COMPARE
复制代码
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 

功能作用

此宏用于直接设置定时器的捕获/比较寄存器(CCRx)值 ,从而控制PWM占空比或定时触发点。
核心功能

  • 动态调整PWM输出的占空比(如呼吸灯、电机调速)
  • 设置输入捕获的触发阈值
  • 配置输出比较模式的匹配值
参数 类型 说明
__HANDLE__ TIM_HandleTypeDef* 指向TIM外设的句柄(包含定时器配置信息)
__CHANNEL__ uint32_t 指定通道: TIM_CHANNEL_1-TIM_CHANNEL_4
__COMPARE__ uint32_t 比较值(0 ≤ COMPARE ≤ AutoReload)

关于CCR的值

在while循环中我们要向外输出一个PWM信号, 满足呼吸灯的现象可以用一个正弦波来做输出

占空比是CCR和ARR+1的比值

我们想得到CCR的值根据上述公式可以得到

那么就得到CCR的表达式

复制代码
uint16_t ccr = duty * (arr + 1);//计算CRR寄存器的值

六、实验现象

烧录程序后,LED呈现渐变呼吸效果

相关推荐
-Springer-2 小时前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner3 小时前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天3 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT3 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠3 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠14 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200517 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT18 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen19 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制