概述
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。 使用外部中斷EXTI進行驅動LED。 最近在弄ST和GD的課程,需要GD樣片的可以加群申請:615061293 。
視頻教學
https://www.bilibili.com/video/BV1Ld4y1i7pF/
csdn課程
課程更加詳細。
https://download.csdn.net/course/detail/37152
生成例程
這里準備了自己繪制的開發板進行驗證。
查看原理圖,PB14為按鍵管腳。
LED管腳為PB7.
配置時鐘樹
配置時鐘為64M。
中斷口配置
GPIO 口連接到 16 個外部中斷 / 事件線如下圖 。可以看到PC13應該是在EXTI14上。
外部中斷/事件控制器用于產生事件/中斷請求的邊沿檢測器。每根輸入線都可單獨進行配置,以選擇類型(中斷或事件)和相應的觸發事件(上升沿觸發、下降沿觸發或邊沿觸發)。每根輸入線還可單獨屏蔽。掛起寄存器用于保持中斷請求的狀態線。
所以需要配置中斷口是上升沿觸發或者下降沿觸發。
中斷服務函數
配置完中斷優先級之后,接著要做的就是編寫中斷服務函數。中斷服務函數的名字是在 HAL 庫中事先有定義的。
中斷線 10-15 共用中斷函數。一般情況下,我們可以把中斷控制邏輯直接編寫在中斷服務函數中,但是 HAL 庫把中斷處理過程進行了簡單封裝。
GPIO配置
PA5為板上LED燈,配置PB7為輸出口,當中斷發生時候改變IO口極性。
配置中斷優先級(NVIC),并使能中斷
同樣的,在mian.c的MX_GPIO_Init中,設置好中斷線和 GPIO 映射關系,然后又設置好了中斷的觸發模式等初始化參數。既然是外部中斷,涉及到中斷我們當然還要設置 NVIC 中斷優先級。 HAL_NVIC_SetPriority的中間0表示搶占優先級為0,最右邊的0表示子優先級為0。
- 搶占優先級比子優先級的優先權更高,這意味搶占優先級更高的中斷會先執行,而不管子優先級的優先權,數值越低優先級越高。
- 同理,如果搶占優先級相同,那么就會比較子優先級,子優先級更高的中斷將會先被執行,數值越低優先級越高。
- 當兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶占式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。
EXTI15_10_IRQHandler
在stm32f0xx_it.c中,程序開始執行EXTI15_10_IRQHandler函數,EXTI15_10_IRQHandler函數只是調用了另一個函數HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
HAL_GPIO_EXTI_Callback
在stm32f1xx_hal_gpio.c中,HAL_GPIO_EXTI_IRQHandler該函數實現的作用非常簡單,就是清除中斷標志位,然后調用回調函數HAL_GPIO_EXTI_Callback()實現控制邏輯。根據函數名Callback也能看出來這里才是真正執行具體功能的函數,該函數需要在mian.c文件中重寫,通過判斷中斷是來自哪個IO口編寫相應的中斷服務控制邏輯。
代碼
在main.c中,重寫HAL_GPIO_EXTI_Callback。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_14){/* KEY */
/* 翻轉LED */
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);
}
}
/* USER CODE END 4 */
審核編輯:湯梓紅
-
外部中斷
+關注
關注
1文章
131瀏覽量
15801 -
stm32cubemx
+關注
關注
5文章
280瀏覽量
14751 -
EXTI
+關注
關注
0文章
27瀏覽量
3672 -
gd32f303
+關注
關注
4文章
38瀏覽量
3674
發布評論請先 登錄
相關推薦
評論