1.軟體及工程環境搭建
- 就不介紹了,可以直接用現成的
鏈接:https://pan.baidu.com/s/1GaSYpNm6yh-lZZmqRdXxvQ
提取碼:dy63 - 相關庫檔案
鏈接:https://pan.baidu.com/s/19PLYdtiuSoZZGdVD7_tumQ
提取碼:mrw8
2.按鍵key中斷控制led燈
- 了解一下中斷處理程序
中斷處理程序:例外(中斷)中斷源–>允許中斷–>申請中斷–> CPU 回應–>保護現場(堆疊)–> 跳轉處理–>回傳.


-
中斷意義
中斷,程式事件中占著非常重要位置,如果沒有中斷,則CPU的作業效率會大打折扣,就像UART模塊中,接收電腦發送來的資料,使用了while(){}查詢狀態的方式,如果電腦沒有發送資料,則程式會一直阻塞,使CPU做不了其它事,如果有一種機制,不用CPU回圈查詢是否有資料到來,而是硬體自動接收資料,當收到資料時候自動通知CPU,這時候CPU再去把資料讀出來,這樣,在沒有接收到資料前,CPU可以去做其他的事,作業效率自然就提高了,在CPU硬體中,通過中斷這種機制來實作這個功能,每個片上外設硬體到提供一個中斷信號,當模塊處理特定作業狀態時,會發生中斷信號通訊CPU, -
添加一下中斷的庫函式

-
看一下開發板原理圖
外部中斷觸發(中斷)事件的方式:1.上升沿觸發 2.下降沿觸發 3.邊沿觸發

上一天得到對應的按鍵對應KEY1->PA0,KEY2->PD2,KEY3->PC12,點擊KEY1是為高電平,KEY2,KEY3分別是低電平,
則高電平對于上升沿觸發,低電平則下降沿觸發 -
選擇外部中斷線EXTI

STM32F4xx中文參考手冊.pdf得出key1的PA0對應EXTI0,key2的PD2對應EXTI2,key3的PC12對應EXTI12 -
系統配置控制器 (SYSCFG)
系統配置控制器主要用于管理對可執行代碼的存盤區域的地址重映射、選擇以太網 PHY 接
口以及管理 GPIO 的外部中斷線連接,
除非特別說明,否則本部分適用于整個 STM32F4xx 系列, -
先LED初始化,就不寫了,第一天的有,不會的可以去看看,那就Exit_Init初始化
/*******************************************************
*函式名:Exit_Init
*功 能:中斷初始化
*參 數:無
*返 回:無
*備 注:注意開啟PA0,PD2的PC12的映射SYSCFG時鐘 ,使能外部中斷
********************************************************/
void Exit_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//開啟SYSCFG時鐘,簡稱重映射
EXTI_InitTypeDef Exit_Key1,Exit_Key2,Exit_Key3;//定義外部中斷結構體變數
// //key1
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //映射到PA0引腳到EXTI
Exit_Key1.EXTI_Line = EXTI_Line0; //選擇EXTI0
Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 選擇模式(中斷)
Exit_Key1.EXTI_Trigger = EXTI_Trigger_Rising;//選擇上升沿觸
Exit_Key1.EXTI_LineCmd = ENABLE;//啟用EXTI0
EXTI_Init(&Exit_Key1);//寫入EXTI初始化
NVIC_EnableIRQ(EXTI0_IRQn);//使能外部中斷0線進行作業
//key2
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2); //映射到PD2引腳到EXTI2
Exit_Key2.EXTI_Line = EXTI_Line2; //選擇EXTI2
Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 選擇模式(中斷)
Exit_Key2.EXTI_Trigger = EXTI_Trigger_Falling;//選擇下升沿觸
Exit_Key2.EXTI_LineCmd = ENABLE;啟用EXTI2
EXTI_Init(&Exit_Key2);//寫入EXTI初始化
NVIC_EnableIRQ(EXTI2_IRQn);//使能外部中斷2線進行作業
//key3
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource12); //映射到PC12引腳到EXTI3
Exit_Key3.EXTI_Line = EXTI_Line12; //選擇EXTI12
Exit_Key3.EXTI_Mode = EXTI_Mode_Interrupt; // 選擇模式(中斷)
Exit_Key3.EXTI_Trigger = EXTI_Trigger_Falling;//選擇下升沿觸
Exit_Key3.EXTI_LineCmd = ENABLE;//啟用EXTI3
EXTI_Init(&Exit_Key3);//寫入EXTI初始化
NVIC_EnableIRQ(EXTI15_10_IRQn);//由于沒有EXTI12,所以使能外部中斷15_10線進行作業
}
- (主要的來了來了,他來了)按鍵key中斷點擊控制led燈開和關
/*******************************************************
*函式名:EXTI0_IRQHandler
*功 能:按鍵一中斷
*參 數:無
*返 回:無
*備 注:注意掛起暫存器(清0)
********************************************************/
int EXTI1_flag;
void EXTI0_IRQHandler(void)//由中斷自動觸發
{
EXTI_ClearFlag(EXTI_Line0); //掛起暫存器PA0
EXTI1_flag++;
if(EXTI1_flag%2)
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
else
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
/*******************************************************
*函式名:EXTI0_IRQHandler
*功 能:按鍵二中斷
*參 數:無
*返 回:無
*備 注:注意掛起暫存器(清0)
********************************************************/
int EXTI2_flag;
void EXTI2_IRQHandler(void)//由中斷自動觸發
{
EXTI_ClearFlag(EXTI_Line2); //掛起暫存器PD2
EXTI2_flag++;
if(EXTI2_flag%2)
GPIO_ResetBits(GPIOC,GPIO_Pin_10);
else
GPIO_SetBits(GPIOC,GPIO_Pin_10);
}
/*******************************************************
*函式名:EXTI0_IRQHandler
*功 能:按鍵三中斷
*參 數:無
*返 回:無
*備 注:注意掛起暫存器(清0)
********************************************************/
int EXTI3_flag;
void EXTI15_10_IRQHandler(void)
{
EXTI3_flag++;
if(EXTI3_flag%2)
GPIO_ResetBits(GPIOC,GPIO_Pin_11);
else
GPIO_SetBits(GPIOC,GPIO_Pin_11);
EXTI_ClearFlag(EXTI_Line12); //掛起暫存器PC2
}
- 主函式呼叫相關的函式
LEDInit();//LED初始化
Exit_Init();//中斷初始化
while(1)
{
//是不是很激動,這里什么都不用寫,哈哈
}
到此完美實作按鍵key中斷點擊控制led燈開和關,最后感謝大家閱讀,如果需要其他相關資料請聯系我
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267118.html
標籤:其他
上一篇:RTTHREAD軟體包目錄
下一篇:STM32 oled多級選單顯示
