你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32C542RC开发板PWM呼吸灯及多功能按键实验

[复制链接]
老牛洋车 发布时间:2026-10-17 12:43
本次实验是在前两个视频的基础上进行的进阶实验,前两个视频分别是《STM32C542RC 开发板开箱上电、建立LED闪烁和检测按键项目》(链接https://bbs.21ic.com/icview-3537339-1-1.html)和《STM32C542RC开发板串口通讯实验》(链接https://bbs.21ic.com/icview-3537619-1-1.html),有兴趣者可以查看这两个帖子。
  本次实验分两个部分:首先是通过PWM实现呼吸灯效果,使用TIM2作为PWM控制器,驱动连接LED的PA5引脚;其次是通过连接PC13引脚的按键,采用轮询的方式获取按键时间和长短,实现多功能效果。在本实验中是通过按键时间的长短实现控制呼吸灯明暗周期的减慢加快,周期变动的信息的通过printf()发送到电脑上。

# R; ?0 r! r9 @. Q* W
一、定时器设置
启动STM32CubeMX2,打开之前保存的项目,在Pinout页面的视图中选定PA5,然后在右边的列表中点击Reserved进行重新配置:
PWM_01.png

/ N; K- I& x/ q- p5 h3 U& p) j- B
1、将PA5引脚配置为TIM2_CH1,然后对TIM2定时器进行配置:
PWM_02.png
* ?2 c) k' C, n
  2、点击Activate启用TIM2定时器:
    PWM_03.png

( r; @% j* L! U
  3、设置预分频为92,计数周期为255,启用自动重装载:
PWM_47.png

" j' [8 s* j. P9 Q$ a" J# [
4、通道设置,启用channel1,模式选PWM mode 1,启用USE channel和GPIO pin:
PWM_48.png

9 L* @0 Y5 G9 z" a* `% F) ^2 o
5、在System选项内启用Global interrupt,为了防止中断冲突,设置TIM2的中断优先级为1,即高于按键中断(分组2),低于串口中断(分组0):
PWM_49.png

3 z6 w9 _9 {" ]: b
二、添加代码
进入VS Code,打开测试项目的文件夹:
1、在main.c文件中先定义全局变量:
uint16_t pwm_space = 32, pwm_wait = 0;     //变动周期,周期计数
uint16_t pwm_duty = 0;                     //当前占空比数值
uint8_t pwm_dir = 0;                       //占空比变动方向
uint16_t keys = 0;                         //按键时长

, G- `9 O9 f5 I* W- @% L# D
2、启用PWM定时器
    hal_tim_handle_t *htim2 = mx_tim2_gethandle(); //获得定时器句柄
   
    HAL_TIM_Start_IT(htim2);                 //启用定时器
//或        HAL_TIM_Start(htim2);
    /*enable timer2 channel PWM*/   
    HAL_TIM_OC_StartChannel(htim2,HAL_TIM_CHANNEL_1);

/ C% u$ V- H4 o8 E. }
3、在主循环内添加获取按键时长的代码和处理按键的代码:
      if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN) == 1){    //获取按键时长
        while (HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN) == 1){
          keys ++;
          HAL_Delay(5);
        }
      }

0 J/ h  Z& ^4 O+ i+ T4 L/ P
      if(keys > 0){
        printf("Key=%d\r\n",keys);
        if(keys < 40){                             //短按键处理
          if(pwm_space > 1)
            pwm_space >>= 1;                       //周期加快一倍
        }else{                                     //长按键处理
          if(pwm_space < 128){
            pwm_space <<= 1;                       //周期缩短一半
          }
        }
        printf("PWM_Space=%d\r\n", pwm_space);
        keys = 0;
      }

" J4 `* R; ?! B( y% M
4、添加回调函数
void HAL_TIM_UpdateCallback(hal_tim_handle_t *htim)
{
  /* Prevent unused argument(s) compilation warning */
  STM32_UNUSED(htim);
  
  pwm_wait++;
  if(pwm_wait > pwm_space){
    pwm_wait = 0;
    TIM2->CCR1 = pwm_duty;
    if(pwm_dir < 1){
      if(pwm_duty < 255)
        pwm_duty++;
      else
        pwm_dir = 1;
    }else{
      if(pwm_duty > 0)
        pwm_duty--;
      else
        pwm_dir = 0;
    }
  }
}

+ \( \* ]7 {& T; R  z' e5 `
5、注释主循环中对LED引脚翻转和延时的代码,注释按键中断回调函数的代码;
pwm09.png
* W" A. k% B  w# f  ^, @' `* z
6、编译下载程序。
三、测试
打开串口调试助手,通过接收到的信息,配合按动按键,观察呼吸灯的周期变化情况。
pwm10.png
: M8 v9 Y) u5 [8 Y+ ^9 j( c3 A9 G
在本例中,按键时长只区分了短按(即点击按键)和正常按键两种状态,如果需要,完全还可以区分出长按(2秒左右)和超长按(大于3秒)状态。
pwm11.png

9 g& T' T" C, P, `" I
本次实验的完整视频:
' P9 [" S4 f9 w
赞 收藏 评论0 发布时间:2026-10-17 12:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版