啥是中斷?中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序并轉入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續運行。
舉個例子:
類比一下
在實際的代碼中,HAL庫的中斷處理較為復雜:startup_stm32f103xb.s通過匯編注冊了中斷處理函數EXTI1_IRQHandler(),在stm32f1xx_it.c中,EXTI_IRQHandler()引用了HAL庫的處理函數HAL_GPIO_EXTI_IRQHandler(),其功能主要為判斷具體的中斷原因,并調用對應的中斷回調函數:HAL_GPIO_EXTI_Callback()。用戶可以自己重聲明中斷回調函數(HAL_GPIO_EXTI_Callback()),在其中寫入自己的用戶邏輯,不出意外的話,你這時候可能會有點懵。上圖!
中斷處理函數寫在EXTI_IRQHandler()或HAL_GPIO_EXTI_Callback()皆可,不過HAL_GPIO_EXTI_Callback()需要重新聲明,比如:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(HAL_GetTick()-t>30) { if(GPIO_Pin == GPIO_PIN_1) { duty_cycle=duty_cycle+100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle); } if(GPIO_Pin == GPIO_PIN_2) { duty_cycle=duty_cycle-100; __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle); } } t=HAL_GetTick();}
對于代碼的意思不必理會,只需知道這些是自己按需求寫的,下面開始連接硬件:
以下是實操工程:
1,配置引腳
2,使能外部中斷
3,點擊右上角GENERATE CODE生成代碼
Hal_GPIO_TogglePin()這個函數可以反轉引腳電平,以控制小燈亮滅,多加的那幾行代碼用來做一個簡單的消抖,然后編譯,下載。如果沒出問題的話,每按一次按鍵,燈都會改變一次亮滅狀態,上面用的是xxxit.c中的Handler函數,下面試一試Callback函數,注釋掉剛才加的代碼,在main.c中添加如下代碼:
編譯,下載,運行,效果應該跟剛才一樣,下面試一下TIM。
搞完后,小燈應該每秒閃爍5次。注意:
中斷里不要使用延時函數Hal_Delay()
TIM中斷要手動開啟(Hal_TIM_Base_Start_IT())
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
STM32
+關注
關注
2270文章
10904瀏覽量
356417 -
程序
+關注
關注
117文章
3788瀏覽量
81113 -
機器
+關注
關注
0文章
783瀏覽量
40748
發布評論請先 登錄
相關推薦
STM32CubeMX的菜單介紹
相信初學者打開STM32CubeMX一定是一臉懵逼,里面都是全英文的,不知道從何入手。這里先給大家簡單講解一下。在新建工程這一欄里,我們最常用的是第一個,它會彈出一個芯片列表供你選擇,然后就會創建一
STM32CUBEMX(11)--外部中斷(EXTI)
首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板:
選擇芯片型號
使用STM32CUBEMX選擇芯片stm32f030r8,如下所示:
配置時鐘源
HSE與LSE分別為外部
發表于 09-10 15:44
如何利用STM32CubeMX生成的keil項目如何關閉全局中斷?
利用STM32CubeMX生成的keil項目如何關閉全局中斷?中斷相關的函數在哪個頭文件里?
如何關閉系統滴答定時器中斷
發表于 05-16 07:52
使用STM32cubemx的外部中斷只能觸發一次的原因?
配置截圖在下邊,還有外部輸入的三路PWM方波的截圖。 我們的需求是三個GPIO做外部中斷,接三路PWM方波輸入,方波周期為60ms,高電平20ms低電平40ms。
現在的問題是,GPIO的管腳只有
發表于 05-07 08:18
stm32CubeMX怎么添加中斷以及相應的代碼或者.c和.h文件?
我想咨詢一下,用stm32CubeMX生成的工程里邊 怎么添加中斷以及相應的代碼或者.c和.h文件。我跑的是freertos系統,能不能在stm32CubeMX里邊直接添加啊。
發表于 04-29 08:17
用stm32cubemx開發stm32L052,對LPUART設置的時候,為什么沒有能夠設置通信中斷的地方?
各位大神請教下,小弟用stm32cubemx開發L052,庫使用的是L0 v1.11.2 發現在對LPUART設置的時候,沒有能夠設置通信中斷的地方(USART可以設置),我以前的老工程用cube打開是可以設置的,請教下是升級后更改了使用方法了嗎?
發表于 04-19 06:10
用stm32cubemx的串口中斷接收時,過一段時間串口中斷不進了怎么解決?
我用stm32cubemx建的工程本來跑的挺好的,最近發現有bug。 我用uart1 在TIM3里邊 1s定時發送數據,采用問答式通訊,對端收到了之后發送8個字節的應答。問題是跑了幾十分鐘之后或者一
發表于 04-17 06:48
STM32cubemx的庫和KEIL的庫有什么不同?
STM32cubemx軟件有對應各個系列芯片的庫.
使用cubemx,生成代碼框架,比如生成MDK的代碼框架。但MDK也有自己的PACK。那么MDK的PACK和CUBEMX的庫有什么區別,兩者時什么關系呢?
發表于 04-11 06:02
STM32CubeMX生成代碼軟件卡死的原因?怎么解決?
STM32CubeMX 生成代碼 軟件卡死!在生成代嗎時,一直卡死在如圖所示的狀態,進度條一直就不走了。試過多次,一直如此。請問如何解決該問題,原因可能是什么?STM32CubeMX版本5.1.0
發表于 04-10 06:03
STM32CubeMX安裝最新版本V6.9,Motor Control Workbench生成項目工程總是顯示STM32CubeMX not found的原因?
STM32CubeMX安裝最新版本V6.9,但Motor Control Workbench生成項目工程,總是顯示STM32CubeMX not found?
發表于 03-14 07:28
如何使用STM32CubeMx配置STM32MP135的LTDC外設?
請問一下,如何使用STM32CubeMx配置STM32MP135的LTDC外設,打開后LTDC配置項是空的
發表于 03-11 07:37
使用STM32CubeMX初始化STM32F103程序代碼默認打開了哪些中斷?是否可以暫時性關閉?
使用STM32CubeMX初始化STM32F103程序代碼,在不使用任何外設中斷的情況下,系統會默認打開哪些中斷?這些中斷又可以怎樣暫時性關
發表于 03-11 07:22
評論