|
本次实验是在前两个视频的基础上进行的进阶实验,前两个视频分别是《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()发送到电脑上。 一、定时器设置 启动STM32CubeMX2,打开之前保存的项目,在Pinout页面的视图中选定PA5,然后在右边的列表中点击Reserved进行重新配置:
1、将PA5引脚配置为TIM2_CH1,然后对TIM2定时器进行配置:
* ?2 c) k' C, n 2、点击Activate启用TIM2定时器:
3、设置预分频为92,计数周期为255,启用自动重装载:
4、通道设置,启用channel1,模式选PWM mode 1,启用USE channel和GPIO pin:
5、在System选项内启用Global interrupt,为了防止中断冲突,设置TIM2的中断优先级为1,即高于按键中断(分组2),低于串口中断(分组0):
二、添加代码 进入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; //按键时长 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); 3、在主循环内添加获取按键时长的代码和处理按键的代码: if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN) == 1){ //获取按键时长 while (HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN) == 1){ keys ++; HAL_Delay(5); } } 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; } 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; } } } 5、注释主循环中对LED引脚翻转和延时的代码,注释按键中断回调函数的代码;
6、编译下载程序。 三、测试 打开串口调试助手,通过接收到的信息,配合按动按键,观察呼吸灯的周期变化情况。
: M8 v9 Y) u5 [8 Y+ ^9 j( c3 A9 G 在本例中,按键时长只区分了短按(即点击按键)和正常按键两种状态,如果需要,完全还可以区分出长按(2秒左右)和超长按(大于3秒)状态。
本次实验的完整视频: |
NUCLEO-H5E5ZJ 移植 LVGL
NUCLEO-H5E5ZJ 移植 ST7735 SPI LCD 驱动
NUCLEO-H5E5ZJ 以太网(Ethernet)移植记录
【STM32H5 评测】1、移植记录(LED / Shell)
【STM32C5开发板评测】- 简易低功耗实验:芯片休眠、唤醒功能简单测试演示
STM32C542RC开发板实现长短按键识别功能
STM32CubeMX2 无法正常添加 CMSIS-DSP?基于 CMake 的手动集成与工程结构优化
STM32C542RC开发板PWM呼吸灯实验
【NUCLEO-C562RE】呼吸灯
《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能
微信公众号
手机版