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

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

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

HAL庫(kù)中對(duì)串口中斷執(zhí)行流程的分解

冬至子 ? 來(lái)源:O老師講32 ? 作者:O老師 ? 2023-10-24 14:37 ? 次閱讀

我們使用輪詢方式接收計(jì)算機(jī)端發(fā)送過(guò)來(lái)的數(shù)據(jù),但是這種方式需要一直在循環(huán)語(yǔ)句中查詢是否有數(shù)據(jù)發(fā)送過(guò)來(lái),這種方式效率非常低。

為了提高處理器的執(zhí)行效率,我們使用中斷方式接收計(jì)算機(jī)端發(fā)送過(guò)來(lái)的數(shù)據(jù),當(dāng)計(jì)算機(jī)端有數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí),會(huì)觸發(fā)STM32的串口中斷,并執(zhí)行中斷回調(diào)函數(shù)。

在這種方式中,不用反復(fù)去查詢串口是否接收到數(shù)據(jù),所以效率非常高,實(shí)時(shí)性也更好。

HAL庫(kù)的中斷接收函數(shù)和中斷發(fā)送函數(shù)分別為HAL_UART_Receive_IT和HAL_UART_Transmit_IT。下面我們對(duì)常用的中斷方式接收函數(shù)HAL_UART_Receive_IT進(jìn)行重點(diǎn)介紹。

HAL_UART_Receive_IT函數(shù)的原型如下

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

它的三個(gè)參數(shù)分別為串口句柄,接收到的數(shù)據(jù)存儲(chǔ)的目標(biāo)地址和接收多少個(gè)字節(jié)的數(shù)據(jù)。

打開(kāi)函數(shù)HAL_UART_Receive_IT,可以看到它的定義如圖8-24所示。

圖片

圖8-24 函數(shù)HAL_UART_Receive_IT內(nèi)容示意圖

可以看到,函數(shù)HAL_UART_Receive_IT并沒(méi)有實(shí)際進(jìn)行數(shù)據(jù)接收,而只是對(duì)串口句柄huart的接收信息進(jìn)行初始化和使能相關(guān)中斷,這些使能中斷的最后一個(gè)即為使能串口接收中斷。

由于函數(shù)HAL_UART_Receive_IT本質(zhì)上是對(duì)串口的中斷進(jìn)行使能,所以和設(shè)置系統(tǒng)時(shí)鐘一起放置于main函數(shù)的系統(tǒng)初始化代碼中,而不是放在while循環(huán)中反復(fù)查詢、執(zhí)行。

為了便于對(duì)比,圖8-25給出了輪詢方式接收函數(shù)的定義。

圖片

圖8-25 輪詢方式接收函數(shù)HAL_UART_Receive定義示意圖

由輪詢方式接收函數(shù)的定義可以看到,函數(shù)HAL_UART_Receive是確實(shí)在接收數(shù)據(jù)并保存到參數(shù)pData指向的存儲(chǔ)單元中。這點(diǎn)和中斷方式接收函數(shù)完全不同,讀者千萬(wàn)不要被函數(shù)名迷惑了。

那中斷方式是如何接收數(shù)據(jù)的呢?下面我們來(lái)介紹中斷方式接收數(shù)據(jù)的步驟。

(1)使能接收中斷。

(2)接收到數(shù)據(jù)后觸發(fā)接收數(shù)據(jù)中斷,此時(shí)程序按以下步驟執(zhí)行。

①到中斷向量表中找到USART1的中斷入口,如圖8-26所示。

圖片

圖8-26 USART1中斷函數(shù)入口

②執(zhí)行中斷函數(shù)USART1_IRQHandler,在該中斷函數(shù)中調(diào)用HAL庫(kù)的USART1中斷函數(shù),如圖8-27所示。

圖片

圖8-27 USART的中斷函數(shù)的內(nèi)容

注意,該函數(shù)需要用戶自己實(shí)現(xiàn),如果用戶使用CubeMX生成工程,則工程會(huì)自動(dòng)在輸出文件stm32f4xx_it.c中生成該函數(shù)。

③執(zhí)行HAL庫(kù)的中斷函數(shù)HAL_UART_IRQHandler。在該函數(shù)中先判斷是否存在接收錯(cuò)誤,如果不存在,則執(zhí)行函數(shù)UART_Receive_IT(),如圖8-28所示。

圖片

圖8-28 函數(shù)HAL_UART_IRQHandler定義示意圖

④執(zhí)行接收完成中斷函數(shù)UART_Receive_IT(),如圖8-29所示。

圖片

圖8-29 函數(shù)UART_Receive_IT()定義示意圖

由圖可見(jiàn),在該函數(shù)中首先判斷字長(zhǎng)是9位還是8位,如果是8位,則根據(jù)是否使能奇偶校驗(yàn)使用如下語(yǔ)句讀取數(shù)據(jù)(見(jiàn)圖8-29中的①):

if (huart- >Init.Parity == UART_PARITY_NONE)  /* 如果沒(méi)有使能奇偶校驗(yàn),數(shù)據(jù)位為8位 */


     {


        *huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x00FF);


     }


     else  /* 如果使能了奇偶校驗(yàn),數(shù)據(jù)位為7位 */


     {


       *huart- >pRxBuffPtr++ = (uint8_t)(huart- >Instance- >DR & (uint8_t)0x007F);


     }

在上述程序段中,程序首先將接收到的數(shù)據(jù)保存到句柄huart的接收區(qū)緩沖指針pRxBuffPtr指向的存儲(chǔ)單元中,然后指針pRxBuffPtr的值加1,指向下一個(gè)存儲(chǔ)單元。

所以,在中斷方式接收中,數(shù)據(jù)的接收在中斷函數(shù)中完成。

讀到一個(gè)數(shù)據(jù)后,huart的接收計(jì)數(shù)變量RxXferCount的值減1,并判斷減到0了沒(méi)有,如果減到0了,說(shuō)明數(shù)據(jù)已經(jīng)接收完成,關(guān)閉串口中斷,如圖8-30中的②所示,接著執(zhí)行接收完成中斷回調(diào)函數(shù)HAL_UART_RxCpltCallback,如圖8-30中的③所示。

⑤執(zhí)行回調(diào)函數(shù)HAL_UART_RxCpltCallback。由于在步驟④中執(zhí)行函數(shù)UART_Receive_IT時(shí)已經(jīng)關(guān)閉了串口的接收中斷,所以如果要繼續(xù)采用中斷方式接收數(shù)據(jù),則需要在回調(diào)函數(shù)中再次調(diào)用函數(shù)HAL_UART_Receive_IT使能串口中斷。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1177

    瀏覽量

    53377
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354297
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    13846
  • 系統(tǒng)時(shí)鐘
    +關(guān)注

    關(guān)注

    1

    文章

    30

    瀏覽量

    9282
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6144
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)HAL庫(kù)中用DMA方式使用串口,串口中斷用開(kāi)嗎?

    關(guān)于HAL庫(kù)中用DMA方式使用串口的問(wèn)題,串口中斷用開(kāi)嗎?使用DMA模式收發(fā)串口的核心語(yǔ)句為如下2句HA
    發(fā)表于 12-04 08:48

    STM32使用CubeMAX配置的串口中斷接收方法是什么

    STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在mai
    發(fā)表于 08-13 09:06

    STM32 HAL庫(kù)串口中斷通訊【任意長(zhǎng)度 不丟幀】精選資料分享

    基于HAL庫(kù)的多串口通信入門,多串口中斷通信,可以發(fā)任意字節(jié)數(shù)據(jù),用的STM32F302CBTx,STM32F103也一樣通用。本例使用三組串口中斷
    發(fā)表于 08-16 06:30

    【STM32的HAL庫(kù)開(kāi)發(fā)】CubeMX配置HAL庫(kù),不進(jìn)串口中斷的問(wèn)題 精選資料分享

    【STM32的HAL庫(kù)開(kāi)發(fā)】串口中斷開(kāi)發(fā)環(huán)境在main.c添加代碼(1/2)在stm32f4xx_it.c添加代碼(2/2)注意附代碼開(kāi)發(fā)環(huán)境cubemx V5.5.0 + MDK Keil
    發(fā)表于 08-16 07:00

    HAL庫(kù)串口中斷接收

    [STM32系列]一、HAL庫(kù)串口中斷接收1、前言2、回調(diào)函數(shù)3、HAL庫(kù)中斷接收函數(shù)使用1、
    發(fā)表于 08-16 08:13

    如何解決CubeMX配置HAL庫(kù)不進(jìn)串口中斷的問(wèn)題?

    如何解決CubeMX配置HAL庫(kù)不進(jìn)串口中斷的問(wèn)題?
    發(fā)表于 11-16 09:04

    基于HAL庫(kù)串口中斷接收函數(shù)該如何去實(shí)現(xiàn)呢

    基于HAL庫(kù)串口中斷接收函數(shù)該如何去實(shí)現(xiàn)呢?有什么方法嗎?
    發(fā)表于 12-06 06:56

    STM32F0 HAL庫(kù)串口中斷調(diào)用順序是什么樣的?

    STM32F0 HAL庫(kù)串口中斷調(diào)用順序是什么樣的?
    發(fā)表于 12-08 07:59

    請(qǐng)問(wèn)hal庫(kù)如何實(shí)現(xiàn)stm32串口中斷接收數(shù)據(jù)?

    請(qǐng)問(wèn)hal庫(kù)如何實(shí)現(xiàn)stm32串口中斷接收數(shù)據(jù)?
    發(fā)表于 12-09 07:39

    串口中斷丟失數(shù)據(jù)問(wèn)題

    關(guān)于51單片機(jī),串口中斷發(fā)送與接收出現(xiàn)數(shù)據(jù)丟失問(wèn)題串口中斷的接收器具有雙緩沖結(jié)構(gòu),即在從接收寄存器讀出前一個(gè)已收到的字節(jié)之前,便能接收第2個(gè)字節(jié),如果第2個(gè)字節(jié)已經(jīng)接收完畢,第1個(gè)字節(jié)還沒(méi)有被讀出
    發(fā)表于 02-17 00:13 ?3517次閱讀

    【STM32+cubemx】0005 HAL庫(kù)開(kāi)發(fā):uart串口中斷和fifo環(huán)形隊(duì)列

    上一節(jié)我們學(xué)習(xí)了串口的輪詢收發(fā),以及HAL庫(kù)自帶的中斷收發(fā)。也分析了優(yōu)缺點(diǎn),這一節(jié)我們來(lái)講講如何改寫HAL庫(kù)函數(shù),使它能更高效地收發(fā)數(shù)據(jù),更
    發(fā)表于 11-15 20:36 ?39次下載
    【STM32+cubemx】0005 <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>開(kāi)發(fā):uart<b class='flag-5'>串口中斷</b>和fifo環(huán)形隊(duì)列

    HAL庫(kù)實(shí)驗(yàn)中斷開(kāi)關(guān)點(diǎn)燈及串口通信

    HAL庫(kù)實(shí)驗(yàn)中斷開(kāi)關(guān)點(diǎn)燈及串口通信中斷介紹1、什么是中斷2、
    發(fā)表于 11-23 18:06 ?8次下載
    <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>實(shí)驗(yàn)<b class='flag-5'>中斷</b>開(kāi)關(guān)點(diǎn)燈及<b class='flag-5'>串口</b>通信

    STM32 HAL庫(kù)串口空閑中斷+DMA 實(shí)現(xiàn)串口數(shù)據(jù)的不定長(zhǎng)接收

    Package for STM32F0 Series)本文內(nèi)容:不定長(zhǎng)數(shù)據(jù)接收的原理串口接收中斷的配置串口接收DMA線的配置示例程序及起運(yùn)行流程附件:代碼工程(MDK)文章...
    發(fā)表于 12-06 18:36 ?26次下載
    STM32 <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>中</b><b class='flag-5'>串口</b>空閑<b class='flag-5'>中斷</b>+DMA 實(shí)現(xiàn)<b class='flag-5'>串口</b>數(shù)據(jù)的不定長(zhǎng)接收

    STM32使用CubeMAX配置的串口中斷接收方法

    STM32使用CubeMAX配置的串口中斷接收方法目錄1.定位串口中斷發(fā)生的地方2.處理串口中斷接收的流程是:(1)初始化串口(2)在mai
    發(fā)表于 12-14 18:45 ?28次下載
    STM32使用CubeMAX配置的<b class='flag-5'>串口中斷</b>接收方法

    STM32使用HAL庫(kù)實(shí)現(xiàn)串口通訊

    文章目錄理論講解查詢模式中斷模式中斷的概念一、對(duì)中斷的理解。二、中斷源,中斷標(biāo)志等概念中斷接收
    發(fā)表于 12-24 18:42 ?13次下載
    STM32使用<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>實(shí)現(xiàn)<b class='flag-5'>串口</b>通訊