STM32F407野火霸天虎系列笔记(四)EXTI
一、前言
?????????我在學習的過程中,經歷過毫無頭緒,找到一堆學習資料卻不知從何開始的痛苦。我希望我整理的筆記,不光可以方便自己在以后的項目中拿來即用,也希望能夠對那些喜歡玩硬件、愛折騰的小伙伴有所幫助。如果你們覺得我的文章對你們有用,歡迎大家點贊+收藏,讓我知道,我的工作是有價值的。
? ? ? ? 這篇筆記,綜合參考了野火、正點原子、st官方以及網絡上的一些資料,然后經過我自己的思考、嘗試與實踐,從而整理出來的。感謝那些愿意在學習的路上分享自己知識與經驗的前輩。
?
二、學習筆記
(一)、編程思路和代碼
編程順序,NVIC,EXIT(系統時鐘開啟和連接),中斷服務函數
1.初始化GPIO(配置按鍵GPIO為輸入模式)
2.開啟按鍵GPIO的時鐘和SYSCFG的時鐘(很重要,在初始化GPIO開時鐘后弄)
同時將IO口線連接到中斷線上面來
GPIO_InitTypeDef GPIO_InitStructure; /*開啟按鍵GPIO口的時鐘*/RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);/* 使能 SYSCFG 時鐘 ,使用GPIO外部中斷時必須使能SYSCFG時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* 選擇按鍵1的引腳 */ GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;/* 設置引腳為輸入模式 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 設置引腳不上拉也不下拉 */GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/* 使用上面的結構體初始化按鍵 */GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);3.將按鍵GPIO連接到EXTI源輸入
/* 連接 EXTI 中斷源 到key1引腳 */SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);4配置NVIC(嵌套向量中斷控制器)
不可屏蔽中斷和外部中斷由它處理,SYSTICK不是由他處理。
1.搶占優先級和響應優先級
搶占優先比較搶占優先級,當搶占優先級相同時,比較響應優先級,兩者編號越小,表明優先級越高,搶占優先級相同時,則不能被對方打斷,但會依據響應優先級來判斷優先相應。
2.NVIC 的優先級組
第0組:所有4位用于指定響應優先級
16種相應優先級
第1組:最高1位用于指定搶占式優先級,最低3位用于指定響 應優先級
2種搶斷優先級(0、1),8種響應優先級
第2組:最高2位用于指定搶占式優先級,最低2位用于指定響應優先級
第3組:最高3位用于指定搶占式優先級,最低1位用于指定響應優先級
第四組:所有4位用于指定搶占式優先級
3.其中優先級分組寫在主函數中,NVIC配置寫在一個函數中(中斷源,搶占優先級和響應優先級,使能中斷)
NVIC_InitTypeDef NVIC_InitStructure;/* 配置NVIC為優先級組1 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* 配置中斷源:按鍵1 */NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;/* 配置搶占優先級:1 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 配置子優先級:1 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷通道 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* 配置中斷源:按鍵2,其他使用上面相關配置 */ NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;NVIC_Init(&NVIC_InitStructure);5.配置按鍵EXTI中斷線
1.中斷事件線,用于選擇哪個位
2.中斷模式,產生中斷或產生事件
EXTI_InitTypeDef EXTI_InitStructure;/* 選擇 EXTI 中斷源 */EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;/* 中斷模式 */EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/* 下降沿觸發 */EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; /* 使能中斷/事件線 */EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);6編寫EXTI中斷服務函數
void KEY1_IRQHandler(void) {//確保是否產生了EXTI Line中斷if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) {// LED1 取反 LED1_TOGGLE;//清除中斷標志位EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } }void KEY2_IRQHandler(void) {//確保是否產生了EXTI Line中斷if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) {// LED2 取反 LED2_TOGGLE;//清除中斷標志位EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); } }總結
以上是生活随笔為你收集整理的STM32F407野火霸天虎系列笔记(四)EXTI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android Studio应用开发实
- 下一篇: 在Oracle OTN 使用迅雷下载的方