99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

lihui710884923
認證:VIP會員
所在專題目錄 查看專題
嵌入式軟件底層開發的框架
嵌入式串口通訊處理機制(附FIFO源碼)
STM32 嵌入式平臺上的語音識別系統
STM32F767ZI 之人工智能(AI) 應用
STM32 HAL庫中斷(繞來繞去)——剖析回調函數機制
stm32如何用虛擬地址存儲數據
作者動態 更多
物聯網專題之NB-IoT項目框架(二)
2024-07-25 11:53
物聯網專題之介紹(一)
2024-07-11 18:37
單片機RTC的中斷剖析
2024-03-09 15:28
串口通訊的來龍去脈
2024-02-14 17:32
stm32單片機的USB燒錄程序
2023-09-08 22:48

STM32 HAL庫中斷(繞來繞去)——剖析回調函數機制

STM32Cube HAL出來六七年了,還是有很多初學者沒有適應,今天就分享一個HAL庫的關于中斷處理的問題。

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

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

HAL庫牽涉的內容較多,下面簡單描述一下HAL庫中斷處理,以及相關的回調函數。

一、HAL庫中斷處理機制

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

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

其它大部分外設(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庫編寫應用代碼不是問題。

二、回調函數實現原理

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

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

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

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

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

三、初學hal庫建議

這里也簡單說幾點:

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.

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 10
收藏 11
關注 212
成為作者 賺取收益
全部留言
0/200
  • 小董 2021-03-25 12:40
    思路清晰,受益匪淺
    回復
  • dy-blNlwnWV 2021-02-24 23:08
    大開眼界,真是好文
    回復
  • keyhei66 2021-01-03 09:53
    精彩,很多東西還沒接觸到
    回復
  • 星球居民-YBPLIKJ1 2020-12-30 22:53
    不錯
    回復
  • 米修兒 2020-12-29 17:53
    深度好文,學習了
    回復
  • 晨風 2020-12-28 15:46
    對我很有幫助
    回復
  • liuxiaofei126 2020-12-28 13:26
    圍觀學習
    回復
主站蜘蛛池模板: 乱亲女h秽乱长久久久 | 久久精品成人免费观看三 | 91亚洲精品第一 | 亚洲国产精品久久久久 | 野花社区www官网在线观看 | 激情aa| 一区二区三区在线视频 | 男人的天堂在线视频 | 一区二区不卡在线播放 | 久久精品亚洲男人的天堂 | 欧美性受ⅹ╳╳╳黑人a性爽 | 水野优香在线亚洲一区 | 精品亚洲一区二区三区在线观看 | 日韩精品一二区 | 午夜男女爽爽影院网站 | 日日摸夜夜添夜夜添无码免费视频 | 91老司机福利在线视频 | 羞羞答答xxdd在线播放 | 免费观看作爱视频网站 | 国产激情无码视频在线播放性色 | 亚洲国产成人精品无色码 | 国产色爱综合网 | 国产精品探花在线观看 | 免费视频网站一区二区三区 | 性色免费| 亚洲成av人在线看 | 国产亚洲综合一区柠檬导航 | 国产高清黄色片 | 国精产品一区二区三区四区 | 国产精品裸体一区二区三区 | 高潮毛片无遮挡免费高清 | 日韩欧美多p乱免费视频 | 国产精品午夜一区二区欲梦 | 最近日本mv字幕免费高清在线 | 亚洲国产日韩在线人成蜜芽 | 免费超级淫片日本高清视频 | 亚洲日韩欧美一区久久久久我 | 久久一线 | 99久久精品免费看国产 | 亚洲女同一区 | 裸体女人高潮毛片扒开一一区 |