目录
文章目录
前言
目标
内容
需求
Timer配置
分频系数
Timer编码
总结
前言
定时器(Timer)在嵌入式系统中是一种重要的硬件资源,常用于生成精确的时间延迟、周期性触发事件或产生PWM信号等应用。本文将重点介绍在STM32微控制器上配置定时器以及实现定时器的占空比输出功能。我们将以实际例子为基础,演示如何通过定时器3的CH3通道实现LED呼吸灯效果,同时讨论配置定时器时需要考虑的周期、分频等关键参数。
目标
- 掌握定时器I配置方式
- 掌握定时器占空比输出
内容
需求
以PD15
对应的LED8为例,我们做一个呼吸灯的效果。
我们采用TIMER3_CH3进行实现:
Timer配置
配置Timer通道输出, 这里注意要选择TIMER4 CH4, 因为STM32的TIMER是从TIMER1开始的,通道也是从CH1开始的
配置周期和分频计数
- psc为分频系数,这里的值需要写入到寄存器中的
- period为周期计数,这里的值需要写入到寄存器中
-
- 配置为一个动态数值
SystemCoreClock / 2 / 10000 - 1
- 后边齿轮里要选择No check, 否则无法填入这个内容
- 配置为一个动态数值
分频系数
这里再引入一个点,系统时钟和Timer自己的时钟,系统时钟是系统主频,Timer自己有自己的主频,这个之间存在一个比值。系统主频为168MHZ, Timer3(GD32)的主频为42MHZ,差值为4倍。标准库提供了4倍频方案,HAL库没有,因此计算时,我们需要加入这个因素。
例如:希望 1秒钟执行100次,通常解决思路如下:
但是计数值不可以超过65535,需要做分频:
表达的意思是100秒执行10000次,也就是1秒钟执行100次
但是在这里还要注意一个倍频的问题,当前Timer2存在2倍差距。这里100秒执行10000次,就变成了200秒执行10000次。所以,倍频方面需要再次做处理。
因此,如果要做到1秒执行100次,那么
Timer编码
提供PWM更新的API
/* USER CODE BEGIN 1 */
#include <math.h>
#define CLIP_VALUE(val, min, max) val = fmax(min, fmin(max, val))
void MX_TIM4_Update_CH4(float duty){
CLIP_VALUE(duty, 0, 100);
uint32_t pulse = htim4.Init.Period * duty / 100.0f;
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, pulse);
}
/* USER CODE END 1 */
main文件
/* USER CODE BEGIN 2 */
// 启用指定TIM通道的PWM输出
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
float duty = 0.0f;
int dir = 1;
while (1)
{
// [0, 100], [100, 0] ....
duty += dir;
if (duty >= 100){
dir = -1;
}else if(duty <= 0){
dir = 1;
}
MX_TIM4_Update_CH4(duty);
printf("duty: %.1f\n", duty);
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
总结
本文详细介绍了在STM32微控制器上配置和使用定时器的方法,特别是利用定时器3的CH3通道实现了呼吸灯效果。首先,我们通过HAL库选择并配置了TIM3通道,确保其能够正确地控制LED的亮度变化。在配置过程中,我们注意到了系统时钟和定时器时钟之间的倍频关系,确保定时器工作频率与系统主频的协调。接着,我们详细讨论了如何设置定时器的周期和分频系数,以实现精确的时间计数和PWM信号输出。
在代码实现中,我们展示了如何通过MX_TIM4_Update_CH4函数更新PWM占空比,从而实现LED亮度的动态调节。这种方法不仅使得STM32能够精确控制外设的工作状态,还为开发人员提供了一个可靠的解决方案,用于实现各种时间相关的应用需求。
通过学习本文中的步骤和方法,开发人员不仅能够掌握定时器的基本配置和占空比输出,还能够应用于更广泛的嵌入式应用开发中,如电机控制、传感器数据采集等。定时器作为嵌入式系统中的核心模块之一,为实现精准和高效的时间控制提供了重要支持,对于需要时间精度和可靠性的应用具有重要意义。