色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

STM32Cube HAL庫中斷處理機制 以及回調函數實現原理

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-03 14:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近有較多關于STM32Cube HAL的問題,側面反應了使用STM32CubeMX的人不少。所以,最近可能會重點寫這方面內容。

1寫在前面

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

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

HAL庫牽涉的內容較多,本文拿HAL庫中斷處理來講解,以及相關的回調函數。

2

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庫編寫應用代碼不是問題。

3

回調函數實現原理

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

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

回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。

---來自百度百科

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

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

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

4

擴展說明

這里也簡單說幾點:

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.

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

    關注

    0

    文章

    4

    瀏覽量

    8509
  • stm32cubemx
    +關注

    關注

    5

    文章

    286

    瀏覽量

    16097
  • HAL庫
    +關注

    關注

    1

    文章

    121

    瀏覽量

    6828
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

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

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

    STM32Cube學習筆記 (十六篇全)

    資料介紹: STM32Cube學習筆記,一步一步手把手帶你進入STM32Cube的世界,包括點燈,按鍵,串口,ADC,DAC等等一共16篇。 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內容有幫助可以關注、點贊、評論支持一下哦~)
    發表于 03-22 17:02

    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

    STM32Cube配置RTOS時定時器如何選擇?

    STM32Cube配置RTOS時定時器如何選擇
    發表于 03-07 08:47

    程序中斷的100種寫法

    。 信號處理:在Unix/Linux系統中,通過信號(signal)處理機制實現中斷。 異常處理:由程序中的異常(如除零錯誤、段錯誤)觸發。
    發表于 01-28 08:25

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

    基本的輸入輸出、數學運算、字符串處理等功能。這些函數是獨立于硬件平臺的,可以在不同的操作系統和硬件平臺上運行。標準的主要目的是提供一組通用的、可移植的函數,使得開發者可以專注于業務邏
    的頭像 發表于 12-02 14:02 ?3092次閱讀

    HAL函數調用示例

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

    HALSTM32開發中的重要性

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

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

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

    記錄我的stm32開發學習過程

    完成調函數: 當數據接收完成時,HAL 會調用 HAL_UART_RxCpltCallbac
    發表于 11-19 14:37

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

    非 OS SDK 在中斷處理函數中,請勿使用任何 ICACHE_FLASH_ATTR 定義的函數。 請問: 1、定時器和hw定時器的
    發表于 07-22 06:33
    主站蜘蛛池模板: 免费果冻传媒2021在线看 | 玩弄人妻少妇500系列网址 | 国产超碰精久久久久久无码AV | 国产精品VIDEOSSEX久久发布 | 性与肉体电影免费观看 | 老牛天天晚上夜噜噜噜 | 精品国产午夜福利在线观看蜜月 | 麻豆一区二区三区蜜桃免费 | 亚洲欧美日韩另类精品一区二区三区 | 国产成人综合在线 | 欧美精品一区二区三区四区 | 啊好深啊别拔就射在里面 | 国产精品久久久久久影院 | 亚洲精品久久午夜麻豆 | 毛片在线全部免费观看 | 涩涩涩涩爱网站 | 人淫阁 | 最新高清无码专区在线视频 | 久久天天综合 | 男男gaygay拳头 | 草莓视频在线看免费高清观看 | 亚洲 欧美 视频 手机在线 | 综合人妻久久一区二区精品 | 狠狠色丁香婷婷久久综合 | 99精品免费久久久久久久久日本 | 亚洲视频免费观看 | 伊人成综合网伊人222 | 永久午夜福利视频一区在线观看 | 国产精品美女久久久网站动漫 | 国产精品夜夜春夜夜爽久久小 | 人人碰在线视频 | 国产AV精品一区二区三区漫画 | 东京热影院| 久久www99re在线播放 | 岛国大片在线观看免费版 | 国产午夜在线观看视频 | 国产精品18久久久久久欧美网址 | 日韩AV无码一区二区三区不卡毛片 | 51久久成人国产精品麻豆 | c了瑜伽老师嗷嗷叫一节课视频 | 边做边爱免费视频 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品