https://m.toutiao.com/is/iRSWjuR9/ STM32開發(fā)——外部中斷 一、外部中斷 中斷的作用和意義 1、實時控制:在確定時間內(nèi)對相對應(yīng)的事件作出響應(yīng) 2、故障處理:檢測到故障,需要第一時間處理 3、數(shù)據(jù)傳輸:不確定數(shù)據(jù)何時會來,處理串口數(shù)據(jù)接收 中斷的意義:高效處理緊急程序,不會一直占用CPU資源 中斷分為外部中斷和內(nèi)部中斷,外部中斷是依賴GPIO接收外設(shè)的中斷請求。STM32 中的中斷優(yōu)先級由NVIC中的“中斷優(yōu)先級(8Bit 位寬)”將優(yōu)先級分為:搶占優(yōu)先級、響應(yīng)優(yōu)先級。當(dāng)兩個或者多個中斷的搶占式優(yōu)先級和響應(yīng)優(yōu)先級相同時,那么就遵循自然優(yōu)先級,看中斷向量表的中斷排序,數(shù)值越小,優(yōu)先級越高。 NVIC 寄存器 NVIC 相關(guān)的寄存器定義了可以在 core_cm3.h 文件中,其定義如下: typedef struct{ __IOM uint32_t ISER[8U]; /* 中斷使能寄存器 */uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /* 中斷清除使能寄存器 */uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; /* 中斷使能掛起寄存器 */uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; /* 中斷解掛寄存器 */uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; /* 中斷有效位寄存器 */uint32_t RESERVED4[56U]; __IOM uint8_t IP[240U]; /* 中斷優(yōu)先級寄存器(8Bit 位寬) */uint32_t RESERVED5[644U]; __OM uint32_t STIR; /* 軟件觸發(fā)中斷寄存器 */} NVIC_Type; NVIC 部分常用相關(guān)函數(shù) 1. ST 公司把 core_cm3.h 文件的 NVIC 相關(guān)函數(shù)封裝到 stm32f1xx_hal_cortex.c 文件中,
函數(shù)形參:是中斷優(yōu)先級分組號,可以選擇范圍:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 組) 2. HAL_NVIC_SetPriority 函數(shù) HAL_NVIC_SetPriority 是設(shè)置中斷優(yōu)先級函數(shù)。其聲明如下: void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority); 函數(shù)形參: 形參 1 是中斷號,可以選擇范圍:IRQn_Type 定義的枚舉類型,定義在 stm32f103xe.h。 形參 2 是搶占優(yōu)先級,可以選擇范圍:0 到 15。 形參 3 是響應(yīng)優(yōu)先級,可以選擇范圍:0 到 15。 3. HAL_NVIC_EnableIRQ 函數(shù) HAL_NVIC_EnableIRQ 是中斷使能函數(shù)。其聲明如下:
函數(shù)形參:形參 IRQn 是中斷號,可以選擇范圍:IRQn_Type 定義的枚舉類型,定義在 stm32f103xe.h。 4. HAL_NVIC_DisableIRQ 函數(shù) HAL_NVIC_DisableIRQ 是中斷除能函數(shù)。其聲明如下: void HAL_NVIC_disableIRQ(IRQn_Type IRQn); 函數(shù)形參:形參 IRQn 是中斷號,可以選擇范圍:IRQn_Type 定義的枚舉類型,定義在 stm32f103xe.h。 5. HAL_NVIC_SystemReset 函數(shù) HAL_NVIC_SystemReset 是系統(tǒng)復(fù)位函數(shù)。其聲明如下:
二、EXTI EXTI 即是外部中斷和事件控制器,它是由 20 個產(chǎn)生事件/中斷請求的邊沿檢測器組成。每一條輸入線都可以獨立地配置輸入類型(脈沖或掛起)和對應(yīng)的觸發(fā)事件(上升沿或下降沿或者雙邊沿都觸發(fā))。每個輸入線都可以獨立地被屏蔽。掛起寄存器保持著狀態(tài)線的中斷請求。 ①,邊沿檢測 ②,軟件觸發(fā) ③,中斷屏蔽/清除 ④,事件屏蔽 中斷和事件的理解: 中斷:要進入NVIC,有相應(yīng)的中斷服務(wù)函數(shù),需要CPU處理 事件:不進入NVIC,僅用于內(nèi)部硬件自動控制的,如:TIM、DMA、ADC 三、AFIO簡介(F1) AFIO即復(fù)用功能IO,主要用于重映射和外部中斷映射配置 1、調(diào)試IO配置:AFIO_MAPR[26:24],配置JTAG/SWD的開關(guān)狀態(tài) 2、重映射配置:AFIO_MAPR,部分外設(shè)IO重映射配置 3、外部中斷配置:AFIO_EXTICR1~4,配置EXTI中斷線0~15對應(yīng)具體哪個IO口 特別注意:配置AFIO寄存器之前要使能AFIO時鐘,方法如下: __HAL_RCC_AFIO_CLK_ENABLE(); 對應(yīng)RCC_APB2ENR寄存器 位0 四、EXTI 與 IO對應(yīng)關(guān)系 AFIO_EXTICR1的 EXTI0[3:0]位控制(F1) 五、如何使用中斷 STM32 EXTI的配置步驟(外部中斷) 1,使能GPIO時鐘:使能GPIO時鐘 2,設(shè)置GPIO輸入模式:上/下拉/浮空輸入 3,使能AFIO/SYSCFG時鐘:設(shè)置AFIO/SYSCFG時鐘開啟寄存器 4,設(shè)置EXTI和IO對應(yīng)關(guān)系:選擇PA~PK到底哪組IO對應(yīng)EXTI輸入線,AFIO_EXTICR/ SYSCFG_EXTICR 5,設(shè)置EXTI屏蔽,上/下沿:設(shè)置EXTI對應(yīng)通道的屏蔽和上升沿/下降沿觸發(fā),IMR、 RTSR/FTSR 步驟2 - 5使用 HAL_GPIO_Init 一步到位 6,設(shè)置NVIC:分3步,見前面內(nèi)容,即:設(shè)置優(yōu)先級分組、設(shè)置優(yōu)先級、使能中斷 7,設(shè)計中斷服務(wù)函數(shù):編寫對應(yīng)中斷的中斷服務(wù)函數(shù)!清中斷標(biāo)志! STM32 EXTI的HAL庫設(shè)置步驟(外部中斷) 1,使能GPIO時鐘——使用: 2,GPIO/AFIO(SYSCFG)/EXTI——使用:HAL_GPIO_Init,一步到位 3,設(shè)置中斷分組——使用: 4,設(shè)置中斷優(yōu)先級——使用: HAL_NVIC_SetPriority 5,使能中斷——使用: HAL_NVIC_EnableIRQ 6,設(shè)計中斷服務(wù)函數(shù)——編寫:EXTIx_IRQHandler,中斷服務(wù)函數(shù),清中斷標(biāo)志! STM32僅有:EXTI0~4、EXTI9_5、EXTI15_10,7個外部中斷服務(wù)函數(shù) 六、通用外設(shè)驅(qū)動模型(四步法) 通用外設(shè)驅(qū)動模型 七、HAL庫中斷回調(diào)處理機制 中斷回調(diào)函數(shù)大概原理 以上是對第三天學(xué)習(xí)的了內(nèi)容做了大概的總結(jié),由于我個人選擇的是STM32F1系列的開發(fā)進行學(xué)習(xí),所總結(jié)的大部分內(nèi)容僅限于F1系列使用。由于篇幅受限,很多地方有縮略,歡迎小伙伴們在評論區(qū)相互交流。今天的內(nèi)容到此結(jié)束,打工仔只能不定期更新,再見!#30天學(xué)會STM32##STM32# |
|