當前位置:首頁 > 公眾號精選 > strongerHuang
[導(dǎo)讀]STM32Cube HAL出來六七年了,還是有很多初學(xué)者沒有適應(yīng),今天就分享一個讀者問到的關(guān)于中斷處理的問題。

作者 | strongerHuang

微信公眾號 | 嵌入式專欄


STM32Cube HAL出來六七年了,還是有很多初學(xué)者沒有適應(yīng),今天就分享一個讀者問到的關(guān)于中斷處理的問題。

很多人都知道STM32CubeMX這套工具的一個目的:減少開發(fā)者對STM32底層驅(qū)動的開發(fā)時間,把重心放在應(yīng)用代碼上

但是,STM32CubeMX只是生成了底層驅(qū)動的初始化代碼。所以,我們還需要掌握:應(yīng)用層代碼如何調(diào)用HAL庫函數(shù)(API接口),以及HAL庫中斷處理機制等相關(guān)知識。

HAL庫牽涉的內(nèi)容較多,下面簡單描述一下HAL庫中斷處理,以及相關(guān)的回調(diào)函數(shù)。


1HAL庫中斷處理機制

之前使用標準外設(shè)庫開發(fā)時,中斷程序(函數(shù))由我們自己實現(xiàn)。



而HAL庫的中斷處理函數(shù)是按照HAL處理機制來實現(xiàn),如USART1,統(tǒng)一由HAL_UART_IRQHandler來進行處理,如下圖:


其它大部分外設(shè)(TIM、SPI、CAN...)中斷都類似,HAL進行統(tǒng)一處理。

也就是說,HAL已經(jīng)幫我們把中斷處理函數(shù)寫好了,我們只需要調(diào)用相應(yīng)函數(shù)來編寫應(yīng)用程序就行了。
HAL_xxx_IRQHandler里面做了哪些處理? 我們以STM32F1的HAL_UART_IRQHandler為例:

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart){ uint32_t isrflags = READ_REG(huart->Instance->SR); uint32_t cr1its = READ_REG(huart->Instance->CR1); uint32_t cr3its = READ_REG(huart->Instance->CR3); uint32_t errorflags = 0x00U; uint32_t dmarequest = 0x00U;  /* If no error occurs */ errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); if(errorflags == RESET) { /* UART in mode Receiver -------------------------------------------------*/ if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) { UART_Receive_IT(huart); return; } }  /* If some errors occur */ if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))) { /* · ·刪減了部分代碼 · */ } /* End if some error occurs */  /* UART in mode Transmitter ------------------------------------------------*/ if(((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)) { UART_Transmit_IT(huart); return; } /* UART in mode Transmitter end --------------------------------------------*/ if(((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)) { UART_EndTransmit_IT(huart); return; }}


其實,大家認真看一下代碼應(yīng)該能明白,這些和我們編寫的中斷處理函數(shù)是不是有類似之處?
這是無非就是接收中斷、發(fā)送中斷、錯誤中斷等一系列處理。只是這里又進行了再次封裝,比如接收中斷UART_Receive_IT。
當然,這個UART_Receive_IT接收中斷實現(xiàn)方式又可能存在不同。像F0、F1...就是直接調(diào)用這個接收中斷函數(shù)來進一步處理。
像L0、G0...是通過執(zhí)行指針函數(shù)RxISR來進一步處理。G0的接收中斷處理為:huart->RxISR(huart);

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart){ //刪除了前面代碼 /* If no error occurs */ errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE)); if (errorflags == 0U) { /* UART in mode Receiver ---------------------------------------------------*/ if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_RXFTIE) != 0U))) { if (huart->RxISR != NULL) { huart->RxISR(huart); } return; } } //刪除了后面代碼}


看了上面USART中斷處理的函數(shù),大家有沒有得到什么啟發(fā)?


其實,HAL庫里面處理機制基本一致,只是實現(xiàn)方式上有所不同。


如果你摸清楚了HAL庫基本原理,相信閱讀HAL庫源碼,或者使用HAL庫編寫應(yīng)用代碼不是問題。


2回調(diào)函數(shù)實現(xiàn)原理

在HAL庫中存在大量類似HAL_XXX_XXXCallback這樣的函數(shù),這些都是回調(diào)函數(shù)。


回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。

回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。

---來自百度百科


HAL庫中斷處理使用了較多的回調(diào)函數(shù),還是拿UART接收中斷來舉例說明。


初始化配置好UART中斷接收,如果有中斷請求,就會執(zhí)行回調(diào)函數(shù)HAL_UART_RxCpltCallback


看上面回調(diào)函數(shù)的定義,通過特定條件調(diào)用『回調(diào)函數(shù)』,這里觸發(fā)的條件就是中斷。


3

擴展說明

這里也簡單說幾點:


1.初學(xué)者想直接使用HAL不是不行,需要有一定C語言功底

針對大部分初學(xué)者來說,是不建議直接上手HAL。但是,有部分C功底較好的,還是建議直接上手。


2.學(xué)HAL,建議參看官網(wǎng)例程

很多人不知道如何找資源,我不止一次強調(diào),官方的才是最好。在HAL庫中Projects目錄下就有很多例程Examples。


3.我們追求效率,可以HAL庫源碼

如果你想修改HAL庫源碼,允許修改少部分。如果要大量修改,還是別折騰了。


4.實際項目需做一定修改

STM32CubeMX僅僅是生成初始化代碼和工程,你實際項目中一般都有自己的軟件架構(gòu)。

特別是項目越大,軟件架構(gòu)就需要更加規(guī)范。


比如:生成的gpio.c文件名,你需要修改成bsp_gpio.c.


再比如:函數(shù)MX_USART2_UART_Init改成MX_DEBUG_UART_Init.


------------ END ------------


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉