衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HAL庫中斷處理以及相關的回調函數

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-01-07 11:46 ? 次閱讀

STM32Cube HAL出來六七年了,還是有很多初學者沒有適應,今天就分享一個讀者問到的關于中斷處理的問題。 很多人都知道STM32CubeMX這套工具的一個目的:減少開發者對STM32底層驅動的開發時間,把重心放在應用代碼上。 但是,STM32CubeMX只是生成了底層驅動的初始化代碼。所以,我們還需要掌握:應用層代碼如何調用HAL庫函數(API接口),以及HAL庫中斷處理機制等相關知識。 HAL庫牽涉的內容較多,下面簡單描述一下HAL庫中斷處理,以及相關的回調函數。

1HAL庫中斷處理機制

之前使用標準外設庫開發時,中斷程序(函數)由我們自己實現。

而HAL庫的中斷處理函數是按照HAL處理機制來實現,如USART1,統一由HAL_UART_IRQHandler來進行處理,如下圖:

00f04488-4ad8-11eb-8b86-12bb97331649.jpg

其它大部分外設(TIM、SPI、CAN...)中斷都類似,HAL進行統一處理。
也就是說,HAL已經幫我們把中斷處理函數寫好了,我們只需要調用相應函數來編寫應用程序就行了。 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; }}

其實,大家認真看一下代碼應該能明白,這些和我們編寫的中斷處理函數是不是有類似之處? 這是無非就是接收中斷、發送中斷、錯誤中斷等一系列處理。只是這里又進行了再次封裝,比如接收中斷UART_Receive_IT。 當然,這個UART_Receive_IT接收中斷實現方式又可能存在不同。像F0、F1...就是直接調用這個接收中斷函數來進一步處理。 像L0、G0...是通過執行指針函數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中斷處理的函數,大家有沒有得到什么啟發?

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

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

2回調函數實現原理

在HAL庫中存在大量類似HAL_XXX_XXXCallback這樣的函數,這些都是回調函數。

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。 回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。

---來自百度百科

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

初始化配置好UART中斷接收,如果有中斷請求,就會執行回調函數HAL_UART_RxCpltCallback。

看上面回調函數的定義,通過特定條件調用『回調函數』,這里觸發的條件就是中斷。

3

擴展說明

這里也簡單說幾點:

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

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

2.學HAL,建議參看官網例程

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

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

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

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

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

特別是項目越大,軟件架構就需要更加規范。

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

再比如:函數MX_USART2_UART_Init改成MX_DEBUG_UART_Init.

原文標題:STM32Cube HAL庫中斷處理機制,回調函數實現原理

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357550
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968

原文標題:STM32Cube HAL庫中斷處理機制,回調函數實現原理

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HAL函數調用示例

    HAL(Hardware Abstraction Layer,硬件抽象層)是STM32等微控制器中常用的,它為開發者提供了訪問和控制硬件設備的接口。以下是一些常用的HAL
    的頭像 發表于 12-02 14:01 ?666次閱讀

    如何快速入門HAL編程 HAL與裸機編程的比較

    如何快速入門HAL編程 要快速入門HAL編程,可以遵循以下步驟: 了解基礎知識 : 掌握C語言編程基礎,包括變量、數據類型、函數、指針等
    的頭像 發表于 12-02 11:39 ?450次閱讀

    定時器調函數能不能用ICACHE_FLASH_ATTR定義?

    非 OS SDK 在中斷處理函數中,請勿使用任何 ICACHE_FLASH_ATTR 定義的函數。 請問: 1、定時器和hw定時器的
    發表于 07-22 06:33

    對于中斷,先執行中斷服務函數還是先清理中斷標志?

    對于中斷,先執行中斷服務函數還是先清理中斷標志?開始學習固件的時候,差不多是先進入服務函數在清
    發表于 05-22 07:20

    請問hal的串口接收完成調函數中如何區分是不是DMA接收完成?

    HAL_UART_RxCpltCallback 這個調函數在串口中斷接收完成后會被調用,在DMA接收完成后也會被調用 那么能否在這個
    發表于 05-07 07:39

    求助,幫忙判斷下對ADC DMA調函數的理解是否正確?

    的掃描 --> DMA1 Channel1 傳送數據一輪完后 ---> 觸發 DMA1 Channel1 的中斷 --> 進入中斷調
    發表于 05-06 09:24

    STM32 hal無法接收串口數據是怎么回事?

    一個字節產生中斷。在接收中斷調函數處理保存數據并重新開啟接收一個字節的
    發表于 04-29 06:11

    請問ucos-III中斷保護放在中斷調函數還是中斷里面?

    請教下ucos-III 中斷保護放在中斷調函數還是中斷里面? 1.
    發表于 04-23 07:44

    使用HAL的USB模塊時,當設置要接收的數據長度為大于64字節時,無法從接收結束調函數的原因?

    兩個方面:1、HAL包調用接收結束的調函數的條件為:接收完預設的數據長度 或者 接收到小于max_packet長度的包。 當接收到第一個64字節后,因為還不滿要求接收的長度,因此
    發表于 04-12 06:07

    請問Hall多串口接收時串口中斷調函數重入導致HardFault 0xFFFFFFF1怎么解決?

    _BUSY){ UART3_RestartRecIT=1; } } } 按照正常集成的設計,各串口都有獨立的串口中斷響應函數,所以不會存在該問題。但是HAL
    發表于 04-03 06:44

    STM32CUBUMX定時器1中斷調函數就是進不去怎么解決?

    );HAL_TIM_PWM_Start( htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start_IT( htim1, TIM_CHANNEL_3); 就死活進不去,
    發表于 03-28 07:58

    HAL_UART_RxCpltCallback HAL調函數,通過485發送命令與串口三通信后,整個調函數就不執行了的原因?

    HAL_UART_RxCpltCallbackHAL調函數兩個串口同時進行中斷接受數據,一
    發表于 03-22 06:53

    Stm32G474 DMA傳輸全部完畢后,需要產生中斷并調運回調函數完成相關操作,如何處理

    Stm32G474,DMA傳輸全部完畢后,需要產生中斷并調運回調函數完成相關操作。請問我如何處理?沒有看到常規的
    發表于 03-15 08:26

    調函數(callback)是什么?調函數的實現方法

    調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執行完畢后被調用。
    發表于 03-12 11:46 ?3141次閱讀

    ??嵌入式中調函數的實現方法

    調函數的命名規范沒有固定的標準,但是根據通用慣例和編碼規范,調函數的命名應該能夠反映
    發表于 03-04 14:49 ?813次閱讀
    利高百家乐现金网| 金盈会百家乐官网现金网| 博彩公司排名| 黄金岛棋牌游戏下载| 大发888娱乐注册| 大发888娱乐官方网站| 大发888网址| 大发888官网客服| 网上足球投注| 禹城市| 至尊百家乐官网下载| 百家乐官网赌场分析网| 百家乐官网电器维修| 三元风水24山水法| 怎样玩百家乐看路| 澳门百家乐注册| 豫游棋牌游戏中心| 百家乐庄和闲的赌法| 百家乐筹码方形| 太阳城直属现金网| 真錢棋牌游戏| 百家乐官网稳赢投注方法| 百家乐官网在线娱乐可信吗| 太子百家乐官网娱乐城| 真人百家乐是啥游戏| 金殿百家乐的玩法技巧和规则| 永利高娱乐| 奇博网上娱乐| 网上百家乐官网有没有假| 鸟巢百家乐官网的玩法技巧和规则| 利赢百家乐现金网| 免费百家乐过滤| 轮盘赌| 百家乐官网在线投注网| 百家乐官网平注法亏损| 百家乐网页游戏| 南溪县| 骰子百家乐官网的玩法技巧和规则| 网络百家乐漏洞| 大发888下载 大发888游戏平台| 百家乐官网娱乐城网址|