本文參考《傳感網(wǎng)應(yīng)用開發(fā)職業(yè)技能等級認(rèn)證 培訓(xùn)教材 中級》
1.任務(wù)要求:
本任務(wù)要求設(shè)計(jì)一個(gè)可通過按鍵進(jìn)行控制的呼吸燈系統(tǒng),
具體要求如下:
-使用外部中斷實(shí)現(xiàn)按鍵功能宣赔;
-LED 燈的顯示效果為“逐漸變亮”然后“逐漸變暗”;
-系統(tǒng)剛上電時(shí)瞪浸,LED 燈為關(guān)閉狀態(tài)儒将。第奇數(shù)次按下按鍵,LED 燈顯示呼吸燈效果对蒲;第偶數(shù)次按下按鍵钩蚊,LED 燈關(guān)閉,并以此循環(huán)往復(fù)
按鍵與呼吸燈的電路原理圖如圖1,其中按鍵的 GPIO 引腳為 PC13,呼吸燈 LED與 GPIO 引腳 PB8 相連蹈矮。
2.任務(wù)實(shí)施:
2.1. 建立 STM32CubeMX 工程并生成初始 C 代碼
(1)建立工程存放的文件夾砰逻,注意英文路徑;獨(dú)立文件夾泛鸟;
(2)新建 STM32CubeMX 工程
(3)選擇 MCU 型號蝠咆,STM32F103VE 的微控制器
(4)配置調(diào)試端口,將“PA13”引腳配置為 SWDIO 功能嗓节,“PA14”引腳配置為 SWCLK功能呻粹;
(5)配置 MCU 時(shí)鐘樹
(6)配置外部中斷按鍵 GPIO 功能
在 STM32CubeMX 工具的配置主界面谤逼,用鼠標(biāo)左鍵點(diǎn)擊 MCU的“PC13”引腳,選擇功能“GPIO_EXTI13”菊霜,
[圖片上傳中...(image.png-cd52c1-1603940943722-0)]
標(biāo)號①:展開“Pinout & Configuration”標(biāo)簽頁左側(cè)的“System Core”選項(xiàng),選擇“GPIO”選項(xiàng)济赎;
標(biāo)號②:GPIO 模式配置為“External Interrupt Mode with Falling edge trigger detection(檢測下降沿的外部中斷模式)”鉴逞;
標(biāo)號③:GPIO 上拉下拉功能配置為“Pull-up(上拉)”记某;
標(biāo)號④:GPIO 用戶標(biāo)簽配置為“KEY1”。
(7)配置定時(shí)器 TIM4 輸出 PWM 信號
在 STM32CubeMX 工具的配置主界面构捡,用鼠標(biāo)左鍵點(diǎn)擊 MCU 的“PB8”引腳液南,選擇功能“TIM4_CH3”,將 PB8 引腳功能配置為 TIM4 的 CH3 輸出通道叭喜,如圖 3標(biāo)號①所示贺拣。依次點(diǎn)擊圖3 中的標(biāo)號②、標(biāo)號③和標(biāo)號④處設(shè)置用戶標(biāo)簽為“LED[Breathe]”捂蕴。
配置 TIM4 輸出 PWM 信號的過程如圖
對圖4 中的配置過程說明如下
標(biāo)號①:展開“Pinout & Configuration”標(biāo)簽頁左側(cè)的“Timers”選項(xiàng)譬涡,選擇“TIM4”
標(biāo)號②:將 TIM4 的時(shí)鐘源配置為“Internal Clock(內(nèi)部時(shí)鐘)”。
標(biāo)號③:配置 TIM4 的通道 3 輸出 PWM 信號 PWM Generation CH3啥辨。
標(biāo)號④:配置 TIM4 的分頻系數(shù)為 71涡匀。
標(biāo)號⑤:配置自動(dòng)重載值為 99。
標(biāo)號⑥:配置 TIM4 輸出的 PWM 信號為 PWM1 模式溉知。
標(biāo)號⑦:配置 PWM 信號輸出極性為“Low”陨瘩,即:有效電平為低電平、無效電平為高電平
(8)保存 STM32CubeMX 工程
點(diǎn)擊“File(文件)”菜單级乍,選擇“Save Project(保存工程)”選項(xiàng)舌劳。然后定位到文件夾“D:\STM32_WorkSpace\task3_Key_PWM_LED”,點(diǎn)擊“確定”保存 STM32CubeMX 工程玫荣。
(9)配置按鍵 NVIC
要使用外部中斷實(shí)現(xiàn)按鍵功能甚淡,在配置好按鍵所對應(yīng)的 GPIO 功能以后,還應(yīng)進(jìn)行 NVIC的配置捅厂。
展開“Pinout & Configuration”標(biāo)簽頁左側(cè)的“System Core”選項(xiàng)贯卦,點(diǎn)擊圖 5標(biāo)號①處的“NVIC”選項(xiàng),然后勾選使能外部中斷(標(biāo)號②處)焙贷,最后配置中斷的優(yōu)先級(標(biāo)號③處)撵割。
(10)生成初始 C 代碼工程
參考 相關(guān)內(nèi)容進(jìn)行“C 代碼生成”與“工程保存”的配置,最后點(diǎn)擊“GENERATECODE(生成代碼)”按鈕辙芍,生成按鍵控制呼吸燈系統(tǒng)的初始 C 代碼工程啡彬。
2.2 完善代碼
(1)編寫按鍵外部中斷回調(diào)函數(shù)
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”中添加以下按鍵外部中斷回調(diào)函數(shù)代碼:
(2)定義相關(guān)變量
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)編寫主循環(huán)程序
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. }