零基础学习5:定时器魔法与PWM呼吸之光
摘要: 本文探讨嵌入式系统中定时器与PWM技术的演进与应用。传统循环延时存在精度低、CPU占用高等缺陷,硬件定时器通过非阻塞中断机制实现精准时间管理。STM32定时器家族包含基本、通用和高级定时器,分别适用于不同场景。以双定时器并发任务为例,TIM3配置5秒串口通信、TIM2实现2秒LED闪烁,通过中断计数变量精准控制时序。PWM技术则通过调节占空比实现模拟控制,广泛应用于电机驱动等领域。实验证明
目录
前言
在嵌入式系统设计领域,时间管理始终是核心挑战之一。早期的嵌入式开发往往依赖于简单的循环延时方法,这种方法虽然实现简便,但其固有的阻塞特性严重制约了系统的实时性能与多任务处理能力。随着应用场景的日益复杂,对时间精度和系统效率的要求不断提升,传统的延时方式已难以满足现代嵌入式系统的设计需求。
定时器的出现标志着嵌入式系统时间管理的重要演进。这种硬件级的时间管理机制使处理器能够从繁重的计时任务中解放出来,实现了真正意义上的并发处理。与软件循环延时相比,定时器不仅提供了更精确的时间基准,更重要的是实现了非阻塞的任务调度,为复杂嵌入式系统的开发奠定了坚实基础。
脉冲宽度调制技术则代表了数字信号处理的精妙应用。通过调节数字信号的占空比,PWM能够在数字域中实现模拟量的精确控制。这种技术巧妙地在离散的数字系统与连续的物理世界之间建立了桥梁,使得LED亮度渐变、电机速度控制等应用成为可能。其背后的数学原理虽然简单,但应用范围却极为广泛。
本单元将系统探讨定时器与PWM技术的理论基础与实践应用。从定时器的内部架构和工作原理入手,逐步深入到多定时器协同工作的复杂场景。同时,通过对PWM波形生成机制的分析,揭示其在嵌入式系统中的典型应用模式。特别地,我们将重点研究如何利用这些技术实现精确的时间控制和复杂的外设驱动。
一、定时器——CPU的精准闹钟
1.1 从循环延时至定时器的进化
在嵌入式系统开发的早期阶段,开发者普遍采用循环延时方法来实现时间控制。这种基于空循环的延时机制虽然在实现上较为简单,但其本质上是一种阻塞式的工作模式。在延时执行期间,处理器核心完全被占用,无法响应其他任务或事件,导致系统资源利用率极低。
循环延时方法存在几个显著的技术缺陷。首先是精度问题,其延时准确性严重依赖处理器的主频稳定性,任何时钟源的波动都会直接影响延时精度。其次是可移植性差,当代码在不同主频的硬件平台间迁移时,必须重新调整延时参数。最重要的是资源浪费问题,CPU在延时期间处于无效工作状态,无法执行其他有效任务,这在多任务系统中是不可接受的。
下表清晰地展示了两种延时方式的性能对比:
| 延时方式 | 精度 | CPU利用率 | 多任务支持 | 功耗控制 |
|---|---|---|---|---|
| 循环延时 | 低 | 0%(完全占用) | 不支持 | 高功耗 |
| 定时器中断 | 高 | >90% | 完美支持 | 可休眠 |
定时器技术的引入彻底改变了这一局面。定时器作为处理器的专用外设,能够独立于CPU核心进行精确计时。当设定的时间到达时,通过中断机制通知CPU进行处理,实现了非阻塞的时间管理方式。这种机制使得CPU能够在定时器工作的同时,继续执行其他重要任务,极大地提升了系统的整体效率和响应能力。
从软件延时到硬件定时的转变,代表了嵌入式系统设计理念的重要演进。开发者开始从资源独占的思维模式转向资源共享和并发处理的架构设计,这为复杂嵌入式系统的开发奠定了坚实基础。
1.2 定时器工作原理深度解析
定时器的核心是一个精密的数字计数系统,其工作基于多个协同工作的硬件模块。时钟源模块为整个定时器提供基础的时间参考,这个参考信号通常来源于系统主时钟或其分频信号,决定了定时器的时间基准精度。
预分频器的作用是对原始时钟信号进行频率调整,通过设置适当的分频系数,可以将高频时钟转换为适合具体应用需求的计数频率。这种分频机制扩展了定时器的应用范围,使其既能够处理微秒级的精确计时,也能够实现长达数小时的超长定时。
计数寄存器是定时器的核心计数单元,它在每个时钟边沿进行递增或递减操作,实时反映当前的计时状态。自动重装载寄存器定义了计数器的周期边界,当计数器值达到预设的重装载值时,会产生更新事件并重新开始计数周期。
为了更好地理解各组件功能,可以参考以下类比表:
| 组件 | 功能 | 相当于生活中的 |
|---|---|---|
| 时钟源 | 提供时间基准 | 心跳/脉搏 |
| 预分频器 | 降低计数频率 | 齿轮减速箱 |
| 计数器 | 累加时钟脉冲 | 秒表计时 |
| 自动重装载寄存器 | 设定计数上限 | 闹钟设定时间 |
| 比较/捕获寄存器 | 特定时间点触发 | 多个闹钟点 |
定时器的完整工作流程包括:首先选择适当的时钟源,如内部72MHz时钟;然后通过预分频器将时钟频率分频至所需值;计数器从零开始累加时钟脉冲;当计数值达到自动重装载寄存器设定的阈值时,产生更新事件;最后计数器自动重置,开始新的计数周期。
定时时间的计算遵循确定的数学关系:
定时时间 = (ARR + 1) × (PSC + 1) ÷ 时钟频率
这一公式为精确的时间控制提供了理论依据,使开发者能够根据具体需求精确配置定时器参数。
1.3 STM32定时器家族概览
STM32微控制器提供了丰富多样的定时器资源,形成了完整的定时器家族体系。这些定时器在功能复杂度和应用范围上存在明显差异,可以满足不同场景的需求。
基本定时器是家族中最简单的成员,主要提供基础的定时功能。它们通常包含一个16位自动重装载计数器和一个可编程的预分频器,适用于简单的延时生成或作为DMA操作的触发源。
通用定时器在基本定时器的基础上增加了输入捕获和输出比较功能。输入捕获可以精确测量外部信号的脉宽或频率,输出比较则能够产生精确的PWM波形或单脉冲输出。这些特性使通用定时器成为电机控制、电源管理等应用的理想选择。
高级定时器是功能最为强大的定时器类型,除了具备通用定时器的所有功能外,还增加了互补输出、死区时间插入、紧急制动等高级特性。这些功能使其特别适合用于三相电机控制、开关电源等复杂功率电子应用。
下表详细比较了STM32F1系列各类定时器的特性:
| 定时器类型 | 实例 | 位数 | 特性 | 适用场景 |
|---|---|---|---|---|
| 高级定时器 | TIM1, TIM8 | 16位 | 互补输出,死区控制 | 电机驱动,电源管理 |
| 通用定时器 | TIM2-TIM5 | 16位 | 输入捕获,PWM输出 | 测量,控制,PWM生成 |
| 基本定时器 | TIM6, TIM7 | 16位 | 仅定时功能 | 基础延时,DMA触发 |
在时钟架构方面,不同的定时器连接到不同的总线。APB1总线承载TIM2至TIM7,最大运行频率为72MHz;APB2总线则连接TIM1和TIM8,同样支持72MHz的最高频率。值得注意的是,当APB预分频系数不为1时,定时器的实际工作时钟频率将是APB总线频率的两倍,这一特性为高频应用提供了额外的灵活性。
二、双定时器并发任务实战
2.1 中断服务函数——时间的守望者
中断服务函数是定时器系统中实现异步事件处理的核心机制。当定时器产生特定事件时,处理器会暂停当前任务,转而执行相应的中断服务程序,待处理完成后恢复原有任务流程。
定时器中断主要分为几种类型:更新中断在计数器溢出或重载时触发,适用于周期性任务的执行;捕获中断在检测到输入信号边沿时产生,常用于频率或脉宽的精确测量;比较中断在计数器值与比较寄存器匹配时激活,适合需要精确时间点控制的场景。
各类中断的应用特点如下表所示:
| 中断类型 | 触发条件 | 应用场景 |
|---|---|---|
| 更新中断 | 计数器溢出/重载 | 周期性任务 |
| 捕获中断 | 输入信号边沿 | 频率测量 |
| 比较中断 | 计数器匹配比较值 | 精确时间点控制 |
中断服务函数的编写需要遵循严格的编程规范。首要原则是保持函数的简洁高效,避免在中断上下文中执行复杂的计算或耗时操作。中断标志的管理也至关重要,必须在适当的时间点清除中断标志,防止重复进入中断服务程序。
典型的中断服务函数结构如下:
void TIMx_IRQHandler(void)
{
if(TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET)
{
// 1. 清除中断标志
TIM_ClearITPendingBit(TIMx, TIM_IT_Update);
// 2. 执行定时任务
User_Task_Handler();
// 3. 避免耗时操作
}
}
在多中断系统中,中断优先级管理成为关键问题。STM32的嵌套向量中断控制器(NVIC)提供了灵活的中断优先级配置机制。开发者可以根据任务的重要性和实时性要求,为不同中断分配合适的优先级。
NVIC支持多种优先级分组方式,每种方式在抢占优先级和子优先级的位数分配上有所不同:
| 优先级组 | 抢占优先级 | 子优先级 | 特点 |
|---|---|---|---|
| NVIC_PriorityGroup_0 | 无 | 4位 | 简单平等 |
| NVIC_PriorityGroup_4 | 4位 | 无 | 强抢占性 |
在实际应用中,需要特别注意中断服务函数的执行时间控制。过长的中断处理会阻塞其他低优先级中断的响应,影响系统的实时性能。对于需要大量计算的任务,建议在中断中仅设置标志位,将实际处理移交给主循环或低优先级任务。
2.2 5秒串口通信使者——TIM3配置
选择Timers,再选择TIM3,开启Internal Clock,这里我设置PSC为72-1,ARR为5000-1,这样算出来的时间就为0.005s。
2.3 2秒LED闪烁卫士——TIM2配置
流程与上头一致。
配置好之后,需要再mian.c主函数中加入以下俩行代码:
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
再在函数后加入以下代码:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt3 =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
}
if(htim->Instance == TIM3)
{
if(++time_cnt3 >= 1000)
{
time_cnt3 =0;
HAL_UART_Transmit(&huart1,hello,20,100000);
}
}
}
这里我引入俩个计数变量,来统计进入中断的次数,依此得到2s和5s
2.4 双定时效果展示
VID_20251019_014311
三、PWM——数字世界的模拟魔法
3.1 占空比:光与暗的掌控者
脉冲宽度调制(PWM)技术通过调节数字信号中高电平与低电平的时间比例,实现了对模拟量的精确控制。这种技术的核心在于占空比的概念,即在一个信号周期内,高电平时间占总周期的百分比。
PWM信号的特性由几个关键参数决定。频率决定了信号周期的长短,直接影响外部设备的响应特性。周期是频率的倒数,表示一个完整波形的时间长度。占空比则直接控制输出信号的平均电压水平,是实现模拟控制的关键变量。分辨率反映了占空比可调节的精细程度,决定了控制的精度和平滑度。
这些参数之间的关系及其对LED控制的影响如下表所示:
| 参数 | 定义 | 计算公式 | 对LED的影响 |
|---|---|---|---|
| 频率 | 1秒内周期数 | Fpwm = 主频/((ARR+1)*(PSC+1)) | 闪烁感 |
| 周期 | 一个完整波形时间 | T = 1/Fpwm | 响应速度 |
| 占空比 | 高电平时间占比 | Duty = CCR/(ARR+1) × 100% | 亮度控制 |
| 分辨率 | 可调节的精度级数 | Res = 1/(ARR+1) | 平滑度 |
在LED亮度控制应用中,不同的占空比设置会产生明显不同的视觉效果。当占空比为0%时,LED完全熄灭;随着占空比增加,LED亮度逐渐提升;当占空比达到100%时,LED以最大亮度发光。这种亮度变化与占空比之间的关系近似线性,但由于LED本身的非线性特性和人眼的感知特性,实际视觉效果会有所偏差。
不同占空比下的LED表现如下:
| 占空比 | 电压等效值 | LED亮度 | 应用场景 |
|---|---|---|---|
| 0% | 0V | 全灭 | 关闭状态 |
| 25% | 0.83V | 微亮 | 夜间指示 |
| 50% | 1.65V | 中等亮度 | 常规照明 |
| 75% | 2.48V | 较亮 | 重点照明 |
| 100% | 3.3V | 最亮 | 全功率输出 |
图片示意如下:
3.2 PWM的工作过程
PWM信号的生成依赖于定时器内部精密的硬件架构,图125展示了捕获/比较通道输出部分的具体实现机制。这个硬件结构确保了PWM信号生成的精确性和实时性。
从图125可以看出,PWM输出通道的核心比较逻辑基于计数器(CNT)与捕获/比较寄存器(CCR1)的实时比较。当计数器值小于CCR1设定值时,输出参考信号(oc1ref)保持有效状态;当两者相等时,触发比较事件。这种硬件级的比较操作在每个时钟周期都在进行,确保了极高的时序精度。
输出模式控制器是整个PWM生成的关键部件,它根据TIMx_CCMR1寄存器中OC1M[2:0]位的配置,决定输出波形的具体行为模式。常见的模式包括:
- PWM模式1:在向上计数时,CNT<CCR1时通道为有效状态
- PWM模式2:在向上计数时,CNT<CCR1时通道为无效状态
- 强制输出模式:强制输出高电平或低电平
- 输出使能模式:仅在特定条件下使能输出
输出使能电路受CC1E位控制,这个位位于TIMx_CCER寄存器中。只有当CC1E位被置位时,OC1信号才能实际输出到引脚。这种设计提供了软件层面的安全控制,防止误操作导致意外输出。
在实际硬件连接中,PWM输出引脚的选择具有相当的灵活性。以TIM3为例,通过重映射功能,同一个定时器通道可以输出到不同的GPIO引脚:
| 复用功能 | TIM3_REMAP[1:0] = 00 (没有重映像) | TIM3_REMAP[1:0] = 10 (部分重映像) | TIM3_REMAP[1:0] = 11 (完全重映像) |
|---|---|---|---|
| TIM3_CH1 | PA6 | PB4 | PC6 |
| TIM3_CH2 | PA7 | PB5 | PC7 |
| TIM3_CH3 | PB0 | PC8 | |
| TIM3_CH4 | PB1 | PC9 |
这种引脚重映射功能在实际PCB设计中有重要价值。当默认引脚被其他功能占用时,可以通过重映射将PWM输出切换到其他可用引脚。例如,如果PA6和PA7已被用作串口通信,可以将TIM3_CH1和TIM3_CH2重映射到PB4和PB5,从而避免硬件冲突。
在主模式控制器方面,PWM输出可以触发其他外设的操作。例如,一个PWM通道的更新事件可以启动ADC转换,实现精确的采样同步。这种硬件级的联动机制减少了CPU的干预,提高了系统的整体效率。
输出极性控制也是PWM工作过程的重要组成部分。通过设置CCER寄存器中的CC1P位,可以反转输出信号的极性。这在驱动不同类型的功率器件时特别有用,例如某些MOSFET需要高电平开启,而IGBT可能需求低电平有效。
整个PWM生成过程完全由硬件自动完成,不占用CPU资源。计数器持续运行,与CCR值的比较、输出状态的切换都是硬件自动行为。这种硬件自动化的特性使得PWM输出具有极高的稳定性和精确性,即使在CPU忙于处理其他任务时,PWM信号也能保持稳定输出。
在实际应用中,PWM工作过程的配置通常包括以下步骤:
- 配置定时器时钟和预分频器
- 设置自动重装载值决定PWM频率
- 配置捕获/比较寄存器设定占空比
- 选择输出模式和极性
- 使能输出并启动定时器
通过这种精密的硬件架构,STM32的定时器能够产生极其稳定和精确的PWM信号,为电机控制、电源管理、照明调光等应用提供了可靠的基础。
3.3 TIM3与TIM4的PWM模式配置
在定时器配置基础上都选择CH1通道
主函数修改如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwmVal);
// TIM3->CCR1 = pwmVal;
HAL_Delay(2);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwmVal);
// TIM3->CCR1 = pwmVal;
HAL_Delay(2);
}
}
/* USER CODE END 3 */
}
3.4 呼吸灯效果展示
VID_20251019_014413
3.5 示波器验证

上图是PWM输出波形,可以很明显的发现输出频率接近理论的2KHZ。
四、总结
本实验通过定时器与PWM技术的实践应用,深入探究了嵌入式系统中时间管理的核心机制。从基础的循环延时至硬件定时器的演进,体现了嵌入式系统设计理念从资源独占向并发处理的重大转变。双定时器的并发任务实现验证了非阻塞式时间管理的优越性,为复杂嵌入式系统的开发奠定了技术基础。
PWM呼吸灯实验则展示了数字信号与模拟控制之间的巧妙转换,通过占空比的精确调节实现了LED亮度的平滑渐变。这一过程不仅涉及定时器硬件架构的深入理解,更需要综合考虑人眼视觉特性与控制系统响应的匹配关系。实验结果证实了硬件PWM在精度和稳定性方面的显著优势,为后续的电机控制、电源管理等应用提供了重要参考。
五、参考资料
更多推荐



所有评论(0)