1+X 傳感網(wǎng)中級備考微實(shí)例:按鍵控制呼吸燈

本文參考《傳感網(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 相連蹈矮。

圖1: 按鍵與呼吸燈的電路原理圖

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)]

圖2:按鍵外部中斷的配置

標(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]”捂蕴。
圖3:TIM4 輸出通道的配置

配置 TIM4 輸出 PWM 信號的過程如圖
圖4: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)號③處)撵割。
圖5:配置按鍵NVIC

(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.  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市故硅,隨后出現(xiàn)的幾起案子外遇,更是在濱河造成了極大的恐慌,老刑警劉巖契吉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跳仿,死亡現(xiàn)場離奇詭異,居然都是意外死亡捐晶,警方通過查閱死者的電腦和手機(jī)菲语,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門妄辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人山上,你說我怎么就攤上這事眼耀。” “怎么了佩憾?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵哮伟,是天一觀的道長。 經(jīng)常有香客問我妄帘,道長楞黄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任抡驼,我火速辦了婚禮鬼廓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘致盟。我一直安慰自己碎税,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布馏锡。 她就那樣靜靜地躺著雷蹂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杯道。 梳的紋絲不亂的頭發(fā)上萎河,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音蕉饼,去河邊找鬼。 笑死玛歌,一個(gè)胖子當(dāng)著我的面吹牛昧港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播支子,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼创肥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了值朋?” 一聲冷哼從身側(cè)響起叹侄,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨登,沒想到半個(gè)月后趾代,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰辣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年撒强,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了禽捆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飘哨,死狀恐怖胚想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芽隆,我是刑警寧澤浊服,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站胚吁,受9級特大地震影響牙躺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜囤采,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一述呐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕉毯,春花似錦乓搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棉磨,卻和暖如春江掩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乘瓤。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工环形, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衙傀。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓抬吟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親统抬。 傳聞我的和親對象是個(gè)殘疾皇子火本,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348