本篇主要講述GPIO外部中斷輸入檢測,實際物理輸入方式是按鍵,但是實際上更適合外部設備信號的輸入檢測,物理按鍵輸入因為有抖動,還需要硬件或者軟件去抖才比較可靠。這個例子不考慮防抖的情況。
軟件版本:
STM32CubeMX V4.25.0
System Workbench V2.4
硬件:OneNet 麒麟座V2.3
在STM32CubeMX中新建項目,選擇正確的MCU型號
設置RCC和SYS,然后根據板子實際情況設置時鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M)
根據板子的具體連接設置4個GPIO_OUTPUT (連接到LED)和4個GPIO_EXIT*(外部中斷模式,連接到物理按鍵)。
GPIO OUTPUT引腳設置
麒麟座按鍵有外部上拉,所以GPIO_EXIT*不需要配置內部上拉,檢測下降沿(Falling Edge),GPIO_EXIT*設置如下
LED名稱標號我用了1/2/3/4,SW名稱標號我用了2/3/4/5,實例中標號也未必相同,但是要做好一一對應關系。
在NVIC(嵌套向量中斷控制器)中,勾選EXIT Line2 interrupt 和 EXIT Line[15:12] interrupt 使能中斷。右邊兩個選項設置搶占優先級和響應優先級。此處我們選擇默認的,不修改。
同樣修改Project - setting ,ToolChain/IDE選擇 SW4STM32
勾選這里。
生成代碼后點擊Open Project在Eclipse中打開項目,然后在在stm32f7xx_it.c中斷服務函數文件中,我們可以找到EXTI2 和EXTI15_10中斷的服務函數。
/******************************************************************************//* 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 */}
右鍵點擊HAL_GPIO_EXTI_IRQHandler 選擇"Open Declaration"會跳轉到如下代碼:
/***@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外部中斷處理函數首先清除中斷標識位,然后調用中斷回調函數HAL_GPIO_EXTI_Callback()。往下看這個回調函數定義的時候使用了__weak修飾符(關于__weak修飾符, 可以參看此博文),里面沒有任何有作用的代碼,我們需要重新定義這個函數。編輯gpio.c(或者main.c也可以),進行如下修改:
/* 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 */
然后右鍵點擊項目,選擇Properties, Run-Debug Settings, 點擊右側的New,在彈出對話框中選擇Ac6 STM32 Debugging。
然后任務欄上點擊Run圖,當然會報錯的,原因請查看另一篇我的博客,所以需要右鍵點擊 項目名Run.cfg ,給它改個名字,
然后右鍵點擊項目樹里面的項目名稱,選擇“Propeties”,然后在Run/Debug Settings-選擇項目名-Edit-Main-C/C++Application那里點擊“Search Project”,然后選擇出現的默認的elf文件:
然后在Debugger-User Defined-Browse 那里選擇你自己改名的配置文件:
然后右鍵點擊那個新的cfg文件,選擇"Open With - Text Editor", 進行如下更改:
source [findinterface/stlink.cfg]//更改為 source [find interface/stlink-v2.cfg]reset_config srst_only srst_nogate connect_assert_srst//這一行改為 reset_config none
Run一下,就可以了。然后再Run一下,就實現四個按鍵分別控制LED的開關切換了。但是這里沒有防抖處理,你會發現有時候LED會閃一下,或者沒反應,其實是很快地點亮然后熄滅一次或者若干次,只是由于速度太快電流很小導致你看不到。下一篇我們會通過使用SysTick中斷來實現按鍵去抖掃描。在實際項目中,最好加上硬件防抖,因為抖動產生的反向電壓可能會沖擊GPIO導致損壞。
-
GPIO
+關注
關注
16文章
1216瀏覽量
52377 -
外部中斷
+關注
關注
1文章
132瀏覽量
15886
原文標題:STM32CubeMX教程-GPIO輸入之外部中斷
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論