这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32NUCLEO-C542RC】:09定时器2输出PWM脉宽控制板载的L

共1条 1/1 1 跳转至页

【STM32NUCLEO-C542RC】:09定时器2输出PWM脉宽控制板载的LED灯

高工
2026-10-20 08:47:46     打赏

一:定时器2(TIM2)的特点

基本介绍

定时器2(TIM2)是STM32C542RC微控制器内部唯一的32位通用定时器。该系列其余的定时器均为16位:两个16位通用定时器、两个专用于电机控制的16位PWM定时器、两个16位基本定时器,以及一个16位低功耗定时器。TIM2功能完整,既可以做精确定时,也可以输出PWM波形,本实验正是利用TIM2的PWM输出功能来控制板载LED的亮度。

主要特点

32位可编程计数器:支持向上计数、向下计数和中央对齐计数三种方式,计数范围为0~2^32-1。相比16位定时器,可以在不借助预分频的情况下获得更长的定时周期和更高的PWM分辨率。

16位可编程预分频器(PSC):可对输入时钟进行1~65536分频,灵活调整计数时钟频率,从而改变PWM频率。

4个独立通道:每个通道均可独立配置为输入捕获、输出比较、PWM生成(PWM模式1/2)或单脉冲模式,互不干扰。

强大的PWM输出能力:支持边沿对齐和中央对齐两种PWM模式,占空比可在0%~100%之间调节;配合自动重装载预装载(ARPE)和输出比较预装载功能,可以在运行中无毛刺地更新频率与占空比。

多种时钟源:默认使用内部时钟,计数时钟来自APB定时器时钟(最高可达系统主频144MHz);同时支持外部时钟输入,方便与外部信号同步。

中断与DMA请求:更新事件、捕获/比较事件、触发事件均可产生中断或触发DMA,适合周期性后台处理。

定时器互联功能:支持主从同步、级联和触发其它定时器,可搭建复杂的时序控制链路。

为什么选用TIM2驱动LED

LED亮度调节的本质是改变PWM占空比。TIM2的32位计数器使ARR可以取得足够大,例如本实验配置PWM频率为1kHz、ARR取999时,一个周期内包含1000个计数点,占空比可实现约1000级连续调节,亮度变化平滑细腻。同时,占空比只由CCR寄存器决定,运行时只需修改一个寄存器值即可实现呼吸灯等渐变效果,CPU开销极小。

二:STM32CubeMX的配置流程

新建工程

打开STM32CubeMX,点击File → New Project进入新建工程界面。

在MCU Selector中搜索并选中STM32C542RC,或在Board Selector中直接选择NUCLEO-C542RC开发板,点击Start Project创建工程。

按开发板原理图确认时钟与调试接口配置:NUCLEO-C542RC板载24MHz高速晶振(HSE)与32.768kHz低速晶振(LSE)。

配置时钟源(RCC)

在左侧Peripherals面板的System分类中选择RCC。

将HSE设置为Crystal/Ceramic Resonator,使能板载24MHz晶振;本实验不依赖RTC,LSE保持Disabled即可。

配置系统时钟

打开Clock Configuration页面,将HSE输入设为24MHz,选择PLL作为系统时钟源,并把SYSCLK配置为144MHz(具体频率以时钟树自动计算为准)。

查看AHB/APB分频系数,确认TIM2的计数时钟(Timer Input Clock)。当APB分频为1时,TIM2时钟与系统时钟同为144MHz,这是后续计算PSC和ARR的依据。

配置TIM2输出PWM

09-1 定时器2配置图1.png

在左侧Peripherals面板的Timers分类中选择TIM2,将其置为Active使能。

将Clock Source设置为Internal Clock,使用内部时钟作为计数时钟。

在Channel(s)中选择Channel1并设置为PWM Generation CH1。此时PA5会被自动分配为TIM2_CH1复用功能引脚,PA5正是板载LED LD1所在引脚(与Arduino D13共用)。

在Parameter Settings中完成以下参数设置:预分频值Prescaler设为143;计数模式Counter Mode选择Up;自动重装载值Counter Period(ARR)设为999;使能自动重装载预装载Auto-reload preload;脉冲值Pulse(即CCR1)设为500,对应50%占空比;输出比较模式选择PWM mode 1;极性Polarity选择High。

切换到GPIO设置页面,确认PA5已被配置为TIM2_CH1的复用功能(Alternate Function),无需手动改GPIO。

参数计算说明:PWM频率=定时器时钟÷[(PSC+1)×(ARR+1)]=144MHz÷(144×1000)=1kHz;占空比=CCR1÷(ARR+1)×100%=500÷1000=50%。

工程设置与生成代码

打开Project Manager页面,填写工程名称与保存路径,Toolchain选择STM32CubeIDE(也可选择MDK-ARM等常用工具链)。

点击右上角GENERATE CODE生成初始化工程,用所选IDE打开后即可进入代码编写阶段。

三:软件代码的编写流程

了解生成的代码结构

CubeMX生成工程后,定时器初始化代码位于tim.c中,系统时钟配置位于main.c中。MX_TIM2_Init()函数已完成TIM2全部寄存器的初始化,包含预分频、自动重装载值、PWM模式与占空比等配置,用户无需手写寄存器操作。

启动PWM输出

在main函数中完成外设初始化后,调用HAL_TIM_PWM_Start函数启动TIM2通道1的PWM输出。启动后板载LED即以当前配置的占空比点亮。

    hal_tim_handle_t *htim2 = mx_tim2_gethandle() ;

    // 启动定时器计数
    HAL_TIM_Start(htim2);
    // 启动 TIM2 通道 1 的 PWM 输出

    hal_tim_oc_compare_unit_t compare_unit = hal_tim_oc_channel_to_compare_unit(HAL_TIM_CHANNEL_1);
    HAL_TIM_OC_StartChannel(htim2, HAL_TIM_CHANNEL_1);

动态调节亮度

占空比由CCR1寄存器决定,运行时通过__HAL_TIM_SET_COMPARE修改CCR1即可实时改变亮度。以下代码实现经典的呼吸灯效果:占空比在0~999之间循环渐变,LED亮度随之缓慢呼吸变化。

      PWMdata =PWMdata +10 ;
      if(PWMdata >=1000) PWMdata = 10 ;
      HAL_TIM_OC_SetCompareUnitPulse(htim2, compare_unit, PWMdata);

      HAL_Delay(100);

说明:pulse为0时占空比为0%,LED全灭;pulse为999时占空比约99.9%,LED接近全亮。HAL_Delay控制渐变速度,可按实际观感调整。

编译下载与验证

在VScode中编译工程,确认无错误后通过ST-LINK下载到开发板。

观察板载LD1是否呈现周期性的亮度渐变;也可将示波器探头接到PA5(Arduino D13)引脚,观察频率为1kHz、占空比周期变化的方波。




关键词: NUCLEO-C542RC     定时器     脉宽    

共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]