【STM32】【STM32CubeMX】STM32CubeMX的使用之二:外部中斷
前言
今天我們來學習STM32CubeMX中外部中斷的使用,實現按下KEY0
KEY1
KEY2
中斷-->IO-->按鍵
對映:
EXTI2-->PE2-->KEY2
EXTI3-->PE3-->KEY1
EXTI4-->PE4-->KEY0
IO-->LED
對映:
PB5-->LED0
PE5-->LED1
1、GPIO及RCC配置
在配置GPIO之前需要先開啟HSE,並設定為晶振為時鐘源。
而後就可以設定按鍵對應的管腳為外部中斷模式了。
點選System Core
中的GPIO
選項後先選擇按鍵對映的GPIO
的GPIO mode
[
1
]
^{[1]}
[1]:其中有六個選項:
External Interupt Mode with Rising edge trigger detection
External Interupt Mode with Falling edge trigger detection
External Interrupt Mode with Rising/Faling edge trigger detection
External Event Mode with Rising edge trigger detection
External Event Mode with Falling edge trigger detection
External Event Mode with Rising/Faling edge trigger detection
分別對應著外部中斷和外部事件的上升沿觸發、下降沿觸發和上升/下降沿觸發。
如果按鍵沒有外接上拉電阻的話我們需要先選擇Pull up
[
2
]
^{[2]}
[2]開啟內建上拉電阻即可實現按鍵按下產生下降沿。
在User Label
[
3
]
^{[3]}
[3]中我們可以自定義GPIO
的名稱,這個名稱會在Pinout View
介面做同步更改。
2、NVIC設定
使用中斷,免不了配置NVIC
我們可以參照下表來選擇Proority Group
[
1
]
^{[1]}
[1],然後選中要配置的EXTI linex interrupt
在Preemption Priority
[
2
]
^{[2]}
[2]中選擇其搶佔優先順序和子優先順序,然後勾選Enable
來使能中斷。
在NVIC
邊上還有一個Code generation
選項卡在其中我們可以選擇我們想要排序的中斷,然後可以在Rank
欄看到排序序號。
3、其他設定
3.1、時鐘設定、生成工程
按照下圖選擇HSE
作為主時鐘源來源即可。
隨後按照流程填寫工程名,設定Code generation
而後生成工程即可。
3.2、中斷後的操作
中斷觸發後在HAL裡呼叫順序是這樣子的:
EXTI15_10_IRQHandler --> HAL_GPIO_EXTI_IRQHandler --> HAL_GPIO_EXTI_Callback
而__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
函式是一個弱定義函式。
函式名稱前面加上__weak
修飾符,我們一般稱這個函式為“弱函式”。
加上了__weak
修飾符的函式,使用者可以在使用者檔案中重新定義一個同名函式,最終編譯器編譯的時候,會選擇使用者定義的函式,如果使用者沒有重新定義這個函式,那麼編譯器就會執行__weak
宣告的函式,並且編譯器不會報錯。所以我們可以在別的地方定義一個相同名字的函式,而不必也儘量不要修改之前的函式。
ST官方這麼做即做到了響應外部中斷又做到了讓事件在清楚外部中斷標誌之後完成,從而避免了一些中斷巢狀。
我們可以在gpio.c
檔案的最下方定義自己的HAL_GPIO_EXTI_Callback
函式來完成在中斷中想做的操作:
按鍵消抖:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_2)//KEY2
{
HAL_Delay(20);//延時20ms
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
}
else if(GPIO_Pin==GPIO_PIN_3)//KEY1
{
HAL_Delay(20);//延時20ms
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
}
}
else if(GPIO_Pin==GPIO_PIN_4)//KEY0
{
HAL_Delay(20);//延時20ms
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
}
}
相關文章
- STM32 外部中斷使用方法總結
- STM32CubeMX系列|ADC模數轉換
- 使用STM32CubeMX生成ThreadX實時作業系統工程模板thread作業系統
- EXTI-外部中斷
- 基於STM32cubeMX 的 RT-Thread 的預設串列埠輸出修改及內容修改thread串列埠
- STM32--外部中斷
- 暫時關閉EXTI外部中斷的一個坑 HK32(stm32沒有測試過)
- STM32學習筆記——中斷筆記
- x86架構中的外部中斷結構-Part 1:中斷控制器的演化架構
- stm32 SysTick/EXTI/USART中斷過程
- 應廣微控制器-外部中斷demo
- STM32中斷相關知識總結
- 《STM32CubeMX配置STM32H743XI工程》第一講《初始化UART,重定義printf函式,點亮一個LED燈》函式
- STM32學習筆記之中斷筆記
- 微控制器學習(十)紅外遙控與外部中斷
- SMP PPI中斷使用
- SpringBoot使用外部tomcatSpring BootTomcat
- [譯] Xcode 中的使用者斷點XCode斷點
- STM32 串列埠進入中斷,但是沒有檢查到接收資料位!!!!串列埠
- 外部js呼叫vue的methods中的方法JSVue
- SpringBoot中配置外部TomcatSpring BootTomcat
- SpringBoot使用外部Web容器的解決方案Spring BootWeb
- 使用keil進行stm32的開發
- vue專案中獲取外部js,並使用其中方法VueJS
- 關於SpringBoot的外部化配置使用記錄Spring Boot
- 程式設計思路-外部請求,中斷測試,結算費用,帶出logs引數程式設計
- 配置springboot專案使用外部tomcatSpring BootTomcat
- Postgresql外部表使用 postgres_fdwSQL
- SpringBoot外部化配置使用Plus版Spring Boot
- Web Components中引入外部CSS的 8 種方法WebCSS
- LINUX中斷--申請中斷和解除安裝中斷Linux
- 使用springboot建立web專案,並使用外部TomcatSpring BootWebTomcat
- android中activity可以響應外部的action的例子(可以Android
- java URLClassLoader 載入外部jar包中的指定的類JavaJAR
- 中斷和中斷處理程式
- stm32 SWD除錯介面的使用除錯
- Spring中的Environment外部化配置管理詳解Spring
- 【軟體開發底層知識修煉】二 深入淺出處理器之二 中斷的概念與意義