STM32F407野火霸天虎系列笔记(四)EXTI
一、前言
?????????我在學(xué)習(xí)的過程中,經(jīng)歷過毫無頭緒,找到一堆學(xué)習(xí)資料卻不知從何開始的痛苦。我希望我整理的筆記,不光可以方便自己在以后的項(xiàng)目中拿來即用,也希望能夠?qū)δ切┫矚g玩硬件、愛折騰的小伙伴有所幫助。如果你們覺得我的文章對你們有用,歡迎大家點(diǎn)贊+收藏,讓我知道,我的工作是有價值的。
? ? ? ? 這篇筆記,綜合參考了野火、正點(diǎn)原子、st官方以及網(wǎng)絡(luò)上的一些資料,然后經(jīng)過我自己的思考、嘗試與實(shí)踐,從而整理出來的。感謝那些愿意在學(xué)習(xí)的路上分享自己知識與經(jīng)驗(yàn)的前輩。
?
二、學(xué)習(xí)筆記
(一)、編程思路和代碼
編程順序,NVIC,EXIT(系統(tǒng)時鐘開啟和連接),中斷服務(wù)函數(shù)
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;/* 設(shè)置引腳為輸入模式 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 設(shè)置引腳不上拉也不下拉 */GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/* 使用上面的結(jié)構(gòu)體初始化按鍵 */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.搶占優(yōu)先級和響應(yīng)優(yōu)先級
搶占優(yōu)先比較搶占優(yōu)先級,當(dāng)搶占優(yōu)先級相同時,比較響應(yīng)優(yōu)先級,兩者編號越小,表明優(yōu)先級越高,搶占優(yōu)先級相同時,則不能被對方打斷,但會依據(jù)響應(yīng)優(yōu)先級來判斷優(yōu)先相應(yīng)。
2.NVIC 的優(yōu)先級組
第0組:所有4位用于指定響應(yīng)優(yōu)先級
16種相應(yīng)優(yōu)先級
第1組:最高1位用于指定搶占式優(yōu)先級,最低3位用于指定響 應(yīng)優(yōu)先級
2種搶斷優(yōu)先級(0、1),8種響應(yīng)優(yōu)先級
第2組:最高2位用于指定搶占式優(yōu)先級,最低2位用于指定響應(yīng)優(yōu)先級
第3組:最高3位用于指定搶占式優(yōu)先級,最低1位用于指定響應(yīng)優(yōu)先級
第四組:所有4位用于指定搶占式優(yōu)先級
3.其中優(yōu)先級分組寫在主函數(shù)中,NVIC配置寫在一個函數(shù)中(中斷源,搶占優(yōu)先級和響應(yīng)優(yōu)先級,使能中斷)
NVIC_InitTypeDef NVIC_InitStructure;/* 配置NVIC為優(yōu)先級組1 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* 配置中斷源:按鍵1 */NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;/* 配置搶占優(yōu)先級:1 */NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 配置子優(yōu)先級:1 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷通道 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* 配置中斷源:按鍵2,其他使用上面相關(guān)配置 */ NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;NVIC_Init(&NVIC_InitStructure);5.配置按鍵EXTI中斷線
1.中斷事件線,用于選擇哪個位
2.中斷模式,產(chǎn)生中斷或產(chǎn)生事件
EXTI_InitTypeDef EXTI_InitStructure;/* 選擇 EXTI 中斷源 */EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;/* 中斷模式 */EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/* 下降沿觸發(fā) */EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; /* 使能中斷/事件線 */EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);6編寫EXTI中斷服務(wù)函數(shù)
void KEY1_IRQHandler(void) {//確保是否產(chǎn)生了EXTI Line中斷if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) {// LED1 取反 LED1_TOGGLE;//清除中斷標(biāo)志位EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } }void KEY2_IRQHandler(void) {//確保是否產(chǎn)生了EXTI Line中斷if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) {// LED2 取反 LED2_TOGGLE;//清除中斷標(biāo)志位EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); } }總結(jié)
以上是生活随笔為你收集整理的STM32F407野火霸天虎系列笔记(四)EXTI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android Studio应用开发实
- 下一篇: 在Oracle OTN 使用迅雷下载的方