女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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
    +關注

    關注

    2289

    文章

    11011

    瀏覽量

    362275
  • 函數
    +關注

    關注

    3

    文章

    4367

    瀏覽量

    64156

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    為什么中斷調函數中不能使用接收中斷開啟函數

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調函數里面不能使用 接收中斷開啟函數
    發表于 05-28 07:19

    如何使用自定義設置調函數

    你好,我正在嘗試編寫自己的自定義設置調函數,并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發表于 05-21 06:11

    為什么中斷調函數中不能使用接收中斷開啟函數

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調函數里面不能使用 接收中斷開啟函數
    發表于 04-22 08:19

    為什么不需要給調函數傳遞參數

    調函數是C語言里面一個重要機制。
    的頭像 發表于 04-15 10:11 ?217次閱讀

    解鎖TSMaster fifo函數:報文讀取的高效方法

    入門》手冊。1.技術背景TSMaster的小程序模塊中提供了接收事件、發送事件以及預發送事件等調事件,如圖1。相比于調
    的頭像 發表于 03-14 20:04 ?326次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數</b>:報文讀取的高效方法

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

    _TIM_Base_Start_IT(&htim1);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_3); 就死活進不去,
    發表于 03-12 06:49

    Stm32f103 hal如果設置多個外部中斷,只要用螺絲刀碰觸其中一個中斷線,所有的中斷函數都有可能進入,亂跳,為什么?

    Stm32f103 hal如果設置多個外部中斷,只要用螺絲刀碰觸其中一個中斷線,所有的中斷函數
    發表于 03-10 08:07

    HAL在Arduino平臺上的使用

    HAL在Arduino平臺上的使用 Arduino平臺是一個開源的電子原型平臺,它包括硬件(基于微控制器的電路板)和軟件(Arduino IDE)。Arduino平臺因其簡單易用而受到廣泛歡迎
    的頭像 發表于 12-02 14:04 ?1425次閱讀

    HAL和標準的區別 HAL與CMSIS的關系

    在嵌入式系統開發中,HAL(硬件抽象層)和標準是兩種常用的軟件,它們在功能和使用場景上有所不同。 1. 標準 標準
    的頭像 發表于 12-02 14:02 ?2925次閱讀

    HAL函數調用示例

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

    HAL在STM32開發中的重要性

    開發過程 HAL提供了一套完整的函數接口,用于操作STM32微控制器的各種外設和功能模塊。這些函數接口封裝了底層硬件的復雜性,使得開發者無需深入了解硬件細節即可實現功能。因此,
    的頭像 發表于 12-02 13:35 ?1165次閱讀

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

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

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

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

    esp8266怎么找到調函數被調用的地方?

    esp8266里的程序怎么運行? 在user_init里注冊了espconn_regist_sentcb,espconn_regist_recvcb這幾個調函數,怎么找到這幾個
    發表于 07-10 08:24

    ESP-IDF4.4.5的esp32s3的rmt發送結束或者接收的中斷啟動,中斷調函數的使用和中斷標志位的清除怎么寫?

    ESP-IDF4.4.5 的esp32s3的rmt發送結束或者接收的中斷啟動,中斷調函數的使用和中斷
    發表于 06-11 08:27