在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HAL庫(kù)中斷處理以及相關(guān)的回調(diào)函數(shù)

strongerHuang ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2021-01-07 11:46 ? 次閱讀

STM32Cube HAL出來(lái)六七年了,還是有很多初學(xué)者沒(méi)有適應(yīng),今天就分享一個(gè)讀者問(wèn)到的關(guān)于中斷處理的問(wèn)題。 很多人都知道STM32CubeMX這套工具的一個(gè)目的:減少開(kāi)發(fā)者對(duì)STM32底層驅(qū)動(dòng)的開(kāi)發(fā)時(shí)間,把重心放在應(yīng)用代碼上。 但是,STM32CubeMX只是生成了底層驅(qū)動(dòng)的初始化代碼。所以,我們還需要掌握:應(yīng)用層代碼如何調(diào)用HAL庫(kù)函數(shù)(API接口),以及HAL庫(kù)中斷處理機(jī)制等相關(guān)知識(shí)。 HAL庫(kù)牽涉的內(nèi)容較多,下面簡(jiǎn)單描述一下HAL庫(kù)中斷處理,以及相關(guān)的回調(diào)函數(shù)。

1HAL庫(kù)中斷處理機(jī)制

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

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

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

其它大部分外設(shè)(TIM、SPI、CAN...)中斷都類似,HAL進(jìn)行統(tǒng)一處理。
也就是說(shuō),HAL已經(jīng)幫我們把中斷處理函數(shù)寫(xiě)好了,我們只需要調(diào)用相應(yīng)函數(shù)來(lái)編寫(xiě)應(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; }}

其實(shí),大家認(rèn)真看一下代碼應(yīng)該能明白,這些和我們編寫(xiě)的中斷處理函數(shù)是不是有類似之處? 這是無(wú)非就是接收中斷、發(fā)送中斷、錯(cuò)誤中斷等一系列處理。只是這里又進(jìn)行了再次封裝,比如接收中斷UART_Receive_IT。 當(dāng)然,這個(gè)UART_Receive_IT接收中斷實(shí)現(xiàn)方式又可能存在不同。像F0、F1...就是直接調(diào)用這個(gè)接收中斷函數(shù)來(lái)進(jìn)一步處理。 像L0、G0...是通過(guò)執(zhí)行指針函數(shù)RxISR來(lái)進(jìn)一步處理。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ù),大家有沒(méi)有得到什么啟發(fā)?

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

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

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

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

回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。 回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。

---來(lái)自百度百科

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

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

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

3

擴(kuò)展說(shuō)明

這里也簡(jiǎn)單說(shuō)幾點(diǎn):

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

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

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

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

3.我們追求效率,可以HAL庫(kù)源碼

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

4.實(shí)際項(xiàng)目需做一定修改

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

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

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

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

原文標(biāo)題:STM32Cube HAL庫(kù)中斷處理機(jī)制,回調(diào)函數(shù)實(shí)現(xiàn)原理

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2291

    文章

    11019

    瀏覽量

    363063
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64426

原文標(biāo)題:STM32Cube HAL庫(kù)中斷處理機(jī)制,回調(diào)函數(shù)實(shí)現(xiàn)原理

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開(kāi)啟函數(shù)

    我看(書(shū)是基于stm32f407編寫(xiě))書(shū)上說(shuō)在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù)
    發(fā)表于 05-28 07:19

    如何使用自定義設(shè)置調(diào)函數(shù)

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

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開(kāi)啟函數(shù)

    我看(書(shū)是基于stm32f407編寫(xiě))書(shū)上說(shuō)在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù)
    發(fā)表于 04-22 08:19

    為什么不需要給調(diào)函數(shù)傳遞參數(shù)

    調(diào)函數(shù)是C語(yǔ)言里面一個(gè)重要機(jī)制。
    的頭像 發(fā)表于 04-15 10:11 ?260次閱讀

    解鎖TSMaster fifo函數(shù):報(bào)文讀取的高效方法

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

    STM32CUBUMX定時(shí)器1中斷調(diào)函數(shù)就是進(jìn)不去怎么解決?

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

    Stm32f103 hal庫(kù)如果設(shè)置多個(gè)外部中斷,只要用螺絲刀碰觸其中一個(gè)中斷線,所有的中斷函數(shù)都有可能進(jìn)入,亂跳,為什么?

    Stm32f103 hal庫(kù)如果設(shè)置多個(gè)外部中斷,只要用螺絲刀碰觸其中一個(gè)中斷線,所有的中斷函數(shù)
    發(fā)表于 03-10 08:07

    LVGL前臺(tái)程序開(kāi)發(fā)相關(guān)操作介紹

    點(diǎn)擊“+”按鈕時(shí)它的調(diào)函數(shù)“add_new_item_event_handler”被調(diào)用,這個(gè)調(diào)函數(shù)
    的頭像 發(fā)表于 01-23 13:47 ?714次閱讀
    LVGL前臺(tái)程序開(kāi)發(fā)<b class='flag-5'>相關(guān)</b>操作介紹

    HAL庫(kù)在Arduino平臺(tái)上的使用

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

    HAL庫(kù)和標(biāo)準(zhǔn)庫(kù)的區(qū)別 HAL庫(kù)與CMSIS的關(guān)系

    在嵌入式系統(tǒng)開(kāi)發(fā)中,HAL(硬件抽象層)庫(kù)和標(biāo)準(zhǔn)庫(kù)是兩種常用的軟件庫(kù),它們?cè)诠δ芎褪褂脠?chǎng)景上有所不同。 1. 標(biāo)準(zhǔn)庫(kù) 標(biāo)準(zhǔn)
    的頭像 發(fā)表于 12-02 14:02 ?3067次閱讀

    HAL庫(kù)函數(shù)調(diào)用示例

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

    HAL庫(kù)在STM32開(kāi)發(fā)中的重要性

    開(kāi)發(fā)過(guò)程 HAL庫(kù)提供了一套完整的函數(shù)接口,用于操作STM32微控制器的各種外設(shè)和功能模塊。這些函數(shù)接口封裝了底層硬件的復(fù)雜性,使得開(kāi)發(fā)者無(wú)需深入了解硬件細(xì)節(jié)即可實(shí)現(xiàn)功能。因此,
    的頭像 發(fā)表于 12-02 13:35 ?1237次閱讀

    如何快速入門(mén)HAL庫(kù)編程 HAL庫(kù)與裸機(jī)編程的比較

    如何快速入門(mén)HAL庫(kù)編程 要快速入門(mén)HAL庫(kù)編程,可以遵循以下步驟: 了解基礎(chǔ)知識(shí) : 掌握C語(yǔ)言編程基礎(chǔ),包括變量、數(shù)據(jù)類型、函數(shù)、指針等
    的頭像 發(fā)表于 12-02 11:39 ?1036次閱讀

    定時(shí)器調(diào)函數(shù)能不能用ICACHE_FLASH_ATTR定義?

    非 OS SDK 在中斷處理函數(shù)中,請(qǐng)勿使用任何 ICACHE_FLASH_ATTR 定義的函數(shù)。 請(qǐng)問(wèn): 1、定時(shí)器和hw定時(shí)器的
    發(fā)表于 07-22 06:33

    esp8266怎么找到調(diào)函數(shù)被調(diào)用的地方?

    esp8266里的程序怎么運(yùn)行? 在user_init里注冊(cè)了espconn_regist_sentcb,espconn_regist_recvcb這幾個(gè)調(diào)函數(shù),怎么找到這幾個(gè)
    發(fā)表于 07-10 08:24
    主站蜘蛛池模板: 成人丁香乱小说 | 种子在线搜索 | 久久久国产乱子伦精品 | 国产亚洲3p无码一区二区 | 日本不卡免费高清一级视频 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 真实女人寂寞偷人视频 | 欧美三级影院 | 777奇米影音 | 女同毛片 | 成人国产精品一级毛片了 | 男人操女人免费视频 | 综合五月天堂 | 无遮挡高清一级毛片免费 | 你懂的免费在线 | 中文字幕一区二区精品区 | 欧美日一区二区三区 | 午夜综合网 | 欧洲精品码一区二区三区免费看 | 欧美成人免费草草影院 | 日韩免费视频一区二区 | 正在播放国产女免费 | 好紧好爽的午夜寂寞视频 | 35pao免费视频| 日本特黄在线观看免费 | 色老头免费视频 | 久久国产美女免费观看精品 | 亚洲一区二区三区四区在线观看 | 日韩一级片在线观看 | 国产精品欧美一区二区三区不卡 | 亚洲男人的天堂久久无 | 奇米欧美 | 天堂看动漫 | 成人免费久久精品国产片久久影院 | 四只虎免费永久观看 | 嗯好舒服好爽好快好大 | 天天碰免费视频 | 欧美精品久久久久久久小说 | 赛罗奥特曼银河帝国普通话免费版 | 图片区网友自拍另类图区 | 日本一区二区三区在线 视频观看免费 |