1+X 传感网中级备考微实例:按键控制呼吸灯

本文参考《传感网应用开发职业技能等级认证 培训教材 中级》

1.任务要求:

本任务要求设计一个可通过按键进行控制的呼吸灯系统,
具体要求如下:
-使用外部中断实现按键功能
-LED 灯的显示效果为“逐渐变亮”然后“逐渐变暗”
-系统刚上电时,LED 灯为关闭状态。第奇数次按下按键,LED 灯显示呼吸灯效果;第偶数次按下按键,LED 灯关闭,并以此循环往复
按键与呼吸灯的电路原理图如图1,其中按键的 GPIO 引脚为 PC13,呼吸灯 LED与 GPIO 引脚 PB8 相连。

图1: 按键与呼吸灯的电路原理图

2.任务实施:

2.1. 建立 STM32CubeMX 工程并生成初始 C 代码

(1)建立工程存放的文件夹,注意英文路径;独立文件夹;
(2)新建 STM32CubeMX 工程
(3)选择 MCU 型号,STM32F103VE 的微控制器
(4)配置调试端口,将“PA13”引脚配置为 SWDIO 功能,“PA14”引脚配置为 SWCLK功能;
(5)配置 MCU 时钟树
(6)配置外部中断按键 GPIO 功能
在 STM32CubeMX 工具的配置主界面,用鼠标左键点击 MCU的“PC13”引脚,选择功能“GPIO_EXTI13”,
[图片上传中...(image.png-cd52c1-1603940943722-0)]

图2:按键外部中断的配置

标号①:展开“Pinout & Configuration”标签页左侧的“System Core”选项,选择“GPIO”选项;
标号②:GPIO 模式配置为“External Interrupt Mode with Falling edge trigger detection(检测下降沿的外部中断模式)”;
标号③:GPIO 上拉下拉功能配置为“Pull-up(上拉)”;
标号④:GPIO 用户标签配置为“KEY1”。
(7)配置定时器 TIM4 输出 PWM 信号
在 STM32CubeMX 工具的配置主界面,用鼠标左键点击 MCU 的“PB8”引脚,选择功能“TIM4_CH3”,将 PB8 引脚功能配置为 TIM4 的 CH3 输出通道,如图 3标号①所示。依次点击图3 中的标号②、标号③和标号④处设置用户标签为“LED[Breathe]”。
图3:TIM4 输出通道的配置

配置 TIM4 输出 PWM 信号的过程如图
图4:TIM4 输出 PWM 信号的配置

对图4 中的配置过程说明如下
标号①:展开“Pinout & Configuration”标签页左侧的“Timers”选项,选择“TIM4”
标号②:将 TIM4 的时钟源配置为“Internal Clock(内部时钟)”。
标号③:配置 TIM4 的通道 3 输出 PWM 信号 PWM Generation CH3。
标号④:配置 TIM4 的分频系数为 71。
标号⑤:配置自动重载值为 99。
标号⑥:配置 TIM4 输出的 PWM 信号为 PWM1 模式。
标号⑦:配置 PWM 信号输出极性为“Low”,即:有效电平为低电平、无效电平为高电平
(8)保存 STM32CubeMX 工程
点击“File(文件)”菜单,选择“Save Project(保存工程)”选项。然后定位到文件夹“D:\STM32_WorkSpace\task3_Key_PWM_LED”,点击“确定”保存 STM32CubeMX 工程。
(9)配置按键 NVIC
要使用外部中断实现按键功能,在配置好按键所对应的 GPIO 功能以后,还应进行 NVIC的配置。
展开“Pinout & Configuration”标签页左侧的“System Core”选项,点击图 5标号①处的“NVIC”选项,然后勾选使能外部中断(标号②处),最后配置中断的优先级(标号③处)。
图5:配置按键NVIC

(10)生成初始 C 代码工程
参考 相关内容进行“C 代码生成”与“工程保存”的配置,最后点击“GENERATECODE(生成代码)”按钮,生成按键控制呼吸灯系统的初始 C 代码工程。

2.2 完善代码

(1)编写按键外部中断回调函数

1. /* USER CODE BEGIN 4 */
2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
3. {
4. if (GPIO_Pin & GPIO_PIN_13)
5.   {
6.       keydown_flag = 1;
7.    }
8. }
9. /* USER CODE END 4 */

在“main.c”中添加以下按键外部中断回调函数代码:
(2)定义相关变量

1. /* USER CODE BEGIN PTD */
2. typedef enum
3. {
4. count_up = 0x01,
5. count_down,
6. } pwm_mode_enum_TypeDef;
7.
8. pwm_mode_enum_TypeDef pwm_mode = count_up;
9. uint8_t keydown_flag = 0;
10. uint8_t pwm_enable = 0;
11. static uint16_t pwm_value = 0;
12. /* USER CODE END PTD */

(3)使能 TIM4 输出 PWM 信号

1. /* USER CODE BEGIN 2 */
2. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
3. /* USER CODE END 2 */

(4)编写主循环程序

1. while (1)
2. {
3.    if (keydown_flag == 1)
4.    {
5.     HAL_Delay(300);
6.     if (keydown_flag == 1)
7.        {
8.        keydown_flag = 0;
9.
10.        if (pwm_enable == 0)
11.            pwm_enable = 1;
12.       else if (pwm_enable == 1)
13.          pwm_enable = 0;
14.       }
15.    }
16. /* USER CODE END WHILE */
17.
18. /* USER CODE BEGIN 3 */
19. if (pwm_enable == 1)
20.     {
21.       if (pwm_value == 0)
22.       {
23.        pwm_mode = count_up;
24.      }
25.      else if (pwm_value == 50)
26.     {
27.        pwm_mode = count_down;
28.     }
29.
30.      if (pwm_mode == count_up)
31.      {
32.        pwm_value++;
33.      }
34.      if (pwm_mode == count_down)
35.      {
36.         pwm_value--;
37       }
38.     __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, pwm_value);
39. }
40    else if (pwm_enable == 0)
41.   {
42. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
43    }
44. HAL_Delay(50);
45.  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。