本篇主要講述GPIO外部中斷輸入檢測(cè),實(shí)際物理輸入方式是按鍵,但是實(shí)際上更適合外部設(shè)備信號(hào)的輸入檢測(cè),物理按鍵輸入因?yàn)橛卸秳?dòng),還需要硬件或者軟件去抖才比較可靠。這個(gè)例子不考慮防抖的情況。
軟件版本:
STM32CubeMX V4.25.0
System Workbench V2.4
硬件:OneNet 麒麟座V2.3
在STM32CubeMX中新建項(xiàng)目,選擇正確的MCU型號(hào)
設(shè)置RCC和SYS,然后根據(jù)板子實(shí)際情況設(shè)置時(shí)鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M)
根據(jù)板子的具體連接設(shè)置4個(gè)GPIO_OUTPUT (連接到LED)和4個(gè)GPIO_EXIT*(外部中斷模式,連接到物理按鍵)。
GPIO OUTPUT引腳設(shè)置
麒麟座按鍵有外部上拉,所以GPIO_EXIT*不需要配置內(nèi)部上拉,檢測(cè)下降沿(Falling Edge),GPIO_EXIT*設(shè)置如下
LED名稱標(biāo)號(hào)我用了1/2/3/4,SW名稱標(biāo)號(hào)我用了2/3/4/5,實(shí)例中標(biāo)號(hào)也未必相同,但是要做好一一對(duì)應(yīng)關(guān)系。
在NVIC(嵌套向量中斷控制器)中,勾選EXIT Line2 interrupt 和 EXIT Line[15:12] interrupt 使能中斷。右邊兩個(gè)選項(xiàng)設(shè)置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。此處我們選擇默認(rèn)的,不修改。
同樣修改Project - setting ,ToolChain/IDE選擇 SW4STM32
勾選這里。
生成代碼后點(diǎn)擊Open Project在Eclipse中打開項(xiàng)目,然后在在stm32f7xx_it.c中斷服務(wù)函數(shù)文件中,我們可以找到EXTI2 和EXTI15_10中斷的服務(wù)函數(shù)。
/******************************************************************************//* STM32F1xx Peripheral Interrupt Handlers *//* Add here the Interrupt Handlers for the used peripherals. *//* For the available peripheral interrupt handler names, *//* please refer to the startup file (startup_stm32f1xx.s). *//******************************************************************************//***@brief This function handles EXTI line2 interrupt.*/void EXTI2_IRQHandler(void){/* USER CODE BEGIN EXTI2_IRQn 0 *//* USER CODE END EXTI2_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);/* USER CODE BEGIN EXTI2_IRQn 1 *//* USER CODE END EXTI2_IRQn 1 */}/***@brief This function handles EXTI line[15:10] interrupts.*/void EXTI15_10_IRQHandler(void){/* USER CODE BEGIN EXTI15_10_IRQn 0 *//* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */}
右鍵點(diǎn)擊HAL_GPIO_EXTI_IRQHandler 選擇"Open Declaration"會(huì)跳轉(zhuǎn)到如下代碼:
/***@briefThis function handles EXTI interrupt request.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/voidHAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin){/* EXTI line interrupt detected */if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}}/***@briefEXTI line detection callbacks.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/__weakvoidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);/*NOTE:This function Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/}
上述代碼中可以看到GPIO外部中斷處理函數(shù)首先清除中斷標(biāo)識(shí)位,然后調(diào)用中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback()。往下看這個(gè)回調(diào)函數(shù)定義的時(shí)候使用了__weak修飾符(關(guān)于__weak修飾符, 可以參看此博文),里面沒有任何有作用的代碼,我們需要重新定義這個(gè)函數(shù)。編輯gpio.c(或者main.c也可以),進(jìn)行如下修改:
/* USER CODE BEGIN 2 */voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin == SW2_Pin){HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);}if(GPIO_Pin == SW3_Pin){HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);}if(GPIO_Pin == SW4_Pin){HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);}if(GPIO_Pin == SW5_Pin){HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin);}}/* USER CODE END 2 */
然后右鍵點(diǎn)擊項(xiàng)目,選擇Properties, Run-Debug Settings, 點(diǎn)擊右側(cè)的New,在彈出對(duì)話框中選擇Ac6 STM32 Debugging。
然后任務(wù)欄上點(diǎn)擊Run圖,當(dāng)然會(huì)報(bào)錯(cuò)的,原因請(qǐng)查看另一篇我的博客,所以需要右鍵點(diǎn)擊 項(xiàng)目名Run.cfg ,給它改個(gè)名字,
然后右鍵點(diǎn)擊項(xiàng)目樹里面的項(xiàng)目名稱,選擇“Propeties”,然后在Run/Debug Settings-選擇項(xiàng)目名-Edit-Main-C/C++Application那里點(diǎn)擊“Search Project”,然后選擇出現(xiàn)的默認(rèn)的elf文件:
然后在Debugger-User Defined-Browse 那里選擇你自己改名的配置文件:
然后右鍵點(diǎn)擊那個(gè)新的cfg文件,選擇"Open With - Text Editor", 進(jìn)行如下更改:
source [findinterface/stlink.cfg]//更改為 source [find interface/stlink-v2.cfg]reset_config srst_only srst_nogate connect_assert_srst//這一行改為 reset_config none
Run一下,就可以了。然后再Run一下,就實(shí)現(xiàn)四個(gè)按鍵分別控制LED的開關(guān)切換了。但是這里沒有防抖處理,你會(huì)發(fā)現(xiàn)有時(shí)候LED會(huì)閃一下,或者沒反應(yīng),其實(shí)是很快地點(diǎn)亮然后熄滅一次或者若干次,只是由于速度太快電流很小導(dǎo)致你看不到。下一篇我們會(huì)通過(guò)使用SysTick中斷來(lái)實(shí)現(xiàn)按鍵去抖掃描。在實(shí)際項(xiàng)目中,最好加上硬件防抖,因?yàn)槎秳?dòng)產(chǎn)生的反向電壓可能會(huì)沖擊GPIO導(dǎo)致?lián)p壞。
-
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52104 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15826
原文標(biāo)題:STM32CubeMX教程-GPIO輸入之外部中斷
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論