基于STM32的按键、中断学习
問題咨詢及項目源碼下載請加群:
群名:IT項目交流群
群號:245022761
?
?
STM32單片機學習篇3:按鍵 外部中斷
?
封裝
===================
?條件運算符: (三目運算符)
?
?<條件> ? <表達式1> : <表達式2>
?
?條件為真 ?-----》表達式1 ? ? 1
?條件為假 ?-----》表達式2 ? ? 0
?
?n ? <高電平> :<低電平>
#define ? LED0(n) ? n?<高電平> :<低電平>
C語言知識
====================================
源文件:(.c .s) 定義的函數以及變量
頭文件:(.h) 聲明源文件的函數名以及變量名,宏定義
==========條件編譯=========
#ifndef __STM32F4xx_GPIO_H
#define __STM32F4xx_GPIO_H
#endif
操作步驟:
1.去工程下面的SYSTEM里面建立源文件.c和頭文件.h
2.去keil5下面去添加SYSTEM
3.添加頭文件路徑:魔法棒----》c/c++
按鍵
==========================
1.看圖
2.讀取GPIO的狀態 ?GPIO_ReadInputDataBit()
? uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
? 參數1:GPIO_TypeDef* GPIOx ?組別
? ? ? ? ?GPIOA --GPIOG
? 參數2:uint16_t GPIO_Pin ? 引腳號
? ? ? ? ?GPIO_Pin_x where x can be (0..15).
??
--------------------位帶操作----------------------
1.意義
? ?51單片機
? ?P0 =0x55; //將P0端口設置為01010101
? ?P1^2=1; ? //將P1組引腳2設置為高電平
? ?a=P1^3; ? //將P1組引腳3電平賦值給a
? ?
? ?可以快速定位修改或獲取引腳的高低電平的狀態
? ?我們可以通過快速的方法定位或者獲取stm32引腳的電平 ? ? ??
? ?GPIO_ResetBits(GPIOF,GPIO_Pin_9) ?修改為 PFout(9)
? ?GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0 修改為PAin(0)
? ?
練習:完善剩下的按鍵 ?可以選擇位帶操作或者讀取操作 ??
?? ??? ??? ? ?KEY0 ? PA0
?? ??? ??? ? ?KEY1 ? PE2
?? ??? ??? ? ?KEY2 ? PE3
?? ??? ??? ? ?KEY3 ? PE4
?? ? ?
======================外部中斷====================
1、定義
? ?專業說法:中斷指的是計算機運行中,正在運行事情被打斷,需要緊急處理
? ?現實的例子:玩 王者榮耀 的時候,女朋友給你打電話
? ?
2.中斷七步曲
?1.使能中斷時鐘 ?RCC_APB2PeriphClockCmd
?void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
?參數1:uint32_t RCC_APB2Periph ?中斷時鐘
? ? ? ? ? ?RCC_APB2Periph_SYSCFG
?參數2:FunctionalState NewState ?權限設置
? ? ? ? ? ?ENABLE 開啟使能 ?DISABLE 關閉使能
?? ??? ? ??
?2.初始化GPIO口 ?GPIO_Init();
?
?3.設置GPIO口和中斷線的映射關系 SYSCFG_EXTILineConfig
?void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
?參數1:uint8_t EXTI_PortSourceGPIOx ?組別
? ? ? ? EXTI_PortSourceGPIOA --EXTI_PortSourceGPIOG
?參數2:uint8_t EXTI_PinSourcex ?引腳編號
? ? ? ? EXTI_PinSourcex where x can be (0..15)
?
?4.初始化中斷口,設置觸發條件 ?EXTI_Init()
?void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
?參數:EXTI_InitTypeDef* EXTI_InitStruct
? ? ? ?typedef struct
?? ??? ?{
?? ??? ? ?uint32_t EXTI_Line; ? ? ? ? ? ? ? /*!< 設置中斷線 */
?? ??? ? ??
?? ??? ? ?EXTIMode_TypeDef EXTI_Mode; ? ? ? /*!< 中斷模式 */
?? ??? ? ?EXTITrigger_TypeDef EXTI_Trigger; /*!< 中斷沿的設置 */
?? ??? ? ?FunctionalState EXTI_LineCmd; ? ? /*!< 中斷權限設置 */?
?? ??? ?}EXTI_InitTypeDef;
?? ??? ?
?? ??? ?1.
?? ??? ?#define EXTI_Line0 ? ? ? ((uint32_t)0x00001) ? ? /*!< External interrupt line 0 */
?? ??? ?#define EXTI_Line1 ? ? ? ((uint32_t)0x00002) ? ? /*!< External interrupt line 1 */
?? ??? ?#define EXTI_Line2 ? ? ? ((uint32_t)0x00004) ? ? /*!< External interrupt line 2 */
?? ??? ?#define EXTI_Line3 ? ? ? ((uint32_t)0x00008) ? ? /*!< External interrupt line 3 */
?? ??? ?#define EXTI_Line4 ? ? ? ((uint32_t)0x00010) ? ? /*!< External interrupt line 4 */
?? ??? ?#define EXTI_Line5 ? ? ? ((uint32_t)0x00020) ? ? /*!< External interrupt line 5 */
?? ??? ?#define EXTI_Line6 ? ? ? ((uint32_t)0x00040) ? ? /*!< External interrupt line 6 */
?? ??? ?#define EXTI_Line7 ? ? ? ((uint32_t)0x00080) ? ? /*!< External interrupt line 7 */
?? ??? ?#define EXTI_Line8 ? ? ? ((uint32_t)0x00100) ? ? /*!< External interrupt line 8 */
?? ??? ?#define EXTI_Line9 ? ? ? ((uint32_t)0x00200) ? ? /*!< External interrupt line 9 */
?? ??? ?#define EXTI_Line10 ? ? ?((uint32_t)0x00400) ? ? /*!< External interrupt line 10 */
?? ??? ?#define EXTI_Line11 ? ? ?((uint32_t)0x00800) ? ? /*!< External interrupt line 11 */
?? ??? ?#define EXTI_Line12 ? ? ?((uint32_t)0x01000) ? ? /*!< External interrupt line 12 */
?? ??? ?#define EXTI_Line13 ? ? ?((uint32_t)0x02000) ? ? /*!< External interrupt line 13 */
?? ??? ?#define EXTI_Line14 ? ? ?((uint32_t)0x04000) ? ? /*!< External interrupt line 14 */
?? ??? ?#define EXTI_Line15 ? ? ?((uint32_t)0x08000) ? ? /*!< External interrupt line 15 */
?
? ? ? ? 2.
?? ??? ?/**?
?? ??? ? ?* @brief ?EXTI mode enumeration ?
?? ??? ? ?*/
?? ??? ?typedef enum
?? ??? ?{
?? ??? ? ?EXTI_Mode_Interrupt = 0x00, ?中斷請求
?? ??? ? ?EXTI_Mode_Event = 0x04 ? ? ? 事件請求
?? ??? ?}EXTIMode_TypeDef;
?? ??? ?
?? ??? ?3.
?? ??? ?/**?
?? ??? ? ?* @brief ?EXTI Trigger enumeration ?
?? ??? ? ?*/
?? ??? ?typedef enum
?? ??? ?{
?? ??? ? ?EXTI_Trigger_Rising = 0x08, ? ? ? ? 上升沿
?? ??? ? ?EXTI_Trigger_Falling = 0x0C, ? ? ? ?下降沿
?? ??? ? ?EXTI_Trigger_Rising_Falling = 0x10 ? ??
?? ??? ?}EXTITrigger_TypeDef;
?? ??? ?4.
?? ??? ? ENABLE 開啟使能 DISABLE ?關閉使能
?? ??? ?
?5.配置中斷分組
?6.寫中斷服務函數
?7.清空標志位?
? ??
學習思維圖:
按鍵學習
?
中斷學習:
?
?
代碼實現:
//按鍵代碼實現#include "key.h"/****key***/ void KEY_Init() {GPIO_InitTypeDef GPIO_InitStruct;//1.?a??ê±?óRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE,ENABLE);//2.GPIO3?ê??ˉGPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//0òy??GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;//ê?è?GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;//0òy??GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;//ê?è?GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOE,&GPIO_InitStruct); }/*******??è?°′?üμ?×′ì?***/ int key_scan(void) {//?D??ê?·?°′??è¥if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0){//?ùéè15msoó?D??delay(15);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0){return 1;}}//?D??ê?·?°′??è¥if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0){//?ùéè15msoó?D??delay(15);if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0){return 2;}}//?D??ê?·?°′??è¥if(PEin(3) == 0){//?ùéè15msoó?D??delay(15);if(PEin(3) == 0){return 3;}}//?D??ê?·?°′??è¥if(PEin(4) == 0){//?ùéè15msoó?D??delay(15);if(PEin(4) == 0){return 4;}}return -1; }?
//中斷實現代碼#include "exti.h"/******** ?D??******/ void EXTI_KEY_Init(void) {EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;//?a???D??ê±?óRCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//éè??IO?úó??D????μ?ó3é?1??μSYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);//3?ê??ˉ?D??EXTI_InitStruct.EXTI_Line=EXTI_Line0;//?D????0EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//?D?????óEXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//???μ??EXTI_InitStruct.EXTI_LineCmd=ENABLE;//ê1?üEXTI_Init(&EXTI_InitStruct);//?D??ó??è??????NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//?D??ê??t£??ústm32f4xx.h2é?òNVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 0x02;//?à??ó??è??NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;//?ìó|ó??è??NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//ê1?üNVIC_Init(&NVIC_InitStruct); }void EXTI0_IRQHandler()//?a??oˉêy???ústartup_stm32f40_41xxx.s {PFout(9) = ~PFout(9);//?????D??±ê??EXTI_ClearITPendingBit(EXTI_Line0); }附上本人在大學學習期間所有學習實現的demo,這些項目的實現都通過本人親自測試運行,也是自己學習中知識的一點一點積累,整理不易,希望能幫到大家,不足之處大家多多交流。
?
QQ:1805523903
郵箱:1805523603@qq.com
昵稱:忘塵
?
世界不同角落共同努力,變成更優秀的我們。
?
1.51單片機學習整理
?
基于51單片機的智能光控路燈 :https://download.csdn.net/download/qq_37037348/11071869
基于51單片機超聲波測距(內含源程序,原理圖及PCB源文件):https://download.csdn.net/download/qq_37037348/11071866
?
?
基于51單片機的智能安防報警系統:https://download.csdn.net/download/qq_37037348/11071865
?
基于51單片機模塊化編程模塊 (紅外、液晶顯示屏、溫濕度等傳感器模塊化)
:https://download.csdn.net/download/qq_37037348/11053222
?
基于51單片機pwm控制的呼吸燈程序
https://download.csdn.net/download/qq_37037348/11053195
?
51單片機與上位機串口通信實例包含詳細講解的完整代碼
https://download.csdn.net/download/qq_37037348/11053164
?
?
基于51單片機的直交流電壓表仿真 (詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053145
?
?
?
基于51單片機胸牌 詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053125
?
基于51單片機3x4按鍵撥號 (詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053093
?
?
基于51單片機撥號 (詳細代碼實現,設計講解)
?
https://download.csdn.net/download/qq_37037348/11053090
?
?
基于51單片機警燈系統設計(詳細代碼實現,設計講解)
https://download.csdn.net/download/qq_37037348/11053086
?
?
基于51單片機點亮一個小燈(詳細代碼實現,設計講解,學習51基礎實驗)
https://download.csdn.net/download/qq_37037348/11053084
?
基于51單片機開發的排球計時器,附有詳細注釋講解,為大家提供最真心的幫助
https://download.csdn.net/download/qq_37037348/11053024
?
?
基于51單片機的音樂播放器,源碼詳細注釋
https://download.csdn.net/download/qq_37037348/11053022
?
?
?
2.Android 開發學習整理:
?
Android-serialport 手機App串口通信代碼實現:
?
https://download.csdn.net/download/qq_37037348/11050521
?
Android-serialport 手機App網絡通信實例代碼實現:
https://download.csdn.net/download/qq_37037348/11050516
?
Android 第一個App詳細教程、基礎實驗 :
https://download.csdn.net/download/qq_37037348/11050515
?
?
3.計算機視覺(深度學習、神經網絡的學習)
?
feature extraction(深度學習,特征提取,神經網絡:https://download.csdn.net/download/qq_37037348/11065968
?
feature extraction(深度學習,特征提取,神經網絡多種訓練模型詳細實現):
https://download.csdn.net/download/qq_37037348/11065974
?
?
?
歡迎大家加入學習項目交流,為大家分享各類個人學習項目及學習資料,互相交流互相學習。
總結
以上是生活随笔為你收集整理的基于STM32的按键、中断学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios swift 5 UIView切圆
- 下一篇: PHP开发支付宝微信个人免签支付接口实例