描述
在单片机和嵌入式开发中,经常会遇到 PWM(脉宽调制)、定时器、SysTick(系统滴答定时器) 这几个词。很多初学者容易把它们混为一谈,以为都是“定时相关的东西”。其实,它们在本质和应用上有明显差别。下面我们来梳理清楚。
一、基本概念
定时器(Timer)
MCU 内最基础的计数外设,通过计数时钟周期实现定时、计数功能。多数 MCU 内部有多个通用定时器,可配置为定时中断、事件触发或输入捕获等。
示例:STM32 16 位定时器每 1ms 触发一次中断
- HAL_TIM_Base_Start_IT(&htim2);// 启动定时器中断
-
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
- if(htim->Instance== TIM2){
- // 每 1ms 执行的任务
- }
- }
PWM(Pulse Width Modulation,脉宽调制)
严格来说,PWM 并非独立硬件,而是基于定时器的一种输出模式。它通过控制高电平与低电平的占空比,调节输出信号的平均电压,实现 LED 调光、马达调速等。
示例:STM32 生成 1 kHz,50% 占空比 PWM
- HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,500);// 占空比 50%
SysTick(System Tick Timer,系统滴答定时器)ARM Cortex-M 系列内核自带的 24 位倒计时定时器,主要用于操作系统节拍(OS Tick),也可作为轻量级定时器使用。它独立于通用定时器,硬件固定,配置简单。、
示例:使用 SysTick 生成 1ms Tick
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);// 系统时钟 1ms
- voidSysTick_Handler(void){
- HAL_IncTick();// 系统时间递增
- }

- 三、应用场景举例
-
- 定时器(Timer)系统定时中断(如每 1 ms 触发一次)
- 测量脉冲宽度(捕获模式)
- 外部信号计数(计数模式)
- 与 PWM 配合生成复杂波形PWM电机调速(通过占空比控制速度)
- LED 调光(调节亮度,避免闪烁)
- 模拟电压输出(通过滤波电路平滑波形)
- 简单音频输出(模拟 DAC 方案)
- SysTickRTOS 心跳定时(如 FreeRTOS 1ms Tick)
- 简单延时函数(中断或计数实现)
- 周期性任务调度(轻量级应用)
-
- 四、总结定时器:基础硬件,功能灵活,可用于计数、比较、捕获等。
-
- PWM:定时器的应用模式,用于波形输出与占空比调节。
- SysTick:Cortex-M 内核自带的简化定时器,主要服务系统调度。
- 可以类比理解:定时器 = 万能工具箱PWM = 工具箱里的电烙铁(专门输出“热量”)SysTick = 内核赠送的小手表(简单好用,但功能有限)
打开APP阅读更多精彩内容