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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

HAL庫中對串口中斷執行流程的分解

冬至子 ? 來源:O老師講32 ? 作者:O老師 ? 2023-10-24 14:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們使用輪詢方式接收計算機端發送過來的數據,但是這種方式需要一直在循環語句中查詢是否有數據發送過來,這種方式效率非常低。

為了提高處理器的執行效率,我們使用中斷方式接收計算機端發送過來的數據,當計算機端有數據發送過來時,會觸發STM32的串口中斷,并執行中斷回調函數。

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

HAL庫的中斷接收函數和中斷發送函數分別為HAL_UART_Receive_IT和HAL_UART_Transmit_IT。下面我們對常用的中斷方式接收函數HAL_UART_Receive_IT進行重點介紹。

HAL_UART_Receive_IT函數的原型如下

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

它的三個參數分別為串口句柄,接收到的數據存儲的目標地址和接收多少個字節的數據。

打開函數HAL_UART_Receive_IT,可以看到它的定義如圖8-24所示。

圖片

圖8-24 函數HAL_UART_Receive_IT內容示意圖

可以看到,函數HAL_UART_Receive_IT并沒有實際進行數據接收,而只是對串口句柄huart的接收信息進行初始化和使能相關中斷,這些使能中斷的最后一個即為使能串口接收中斷。

由于函數HAL_UART_Receive_IT本質上是對串口的中斷進行使能,所以和設置系統時鐘一起放置于main函數的系統初始化代碼中,而不是放在while循環中反復查詢、執行。

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

圖片

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

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

那中斷方式是如何接收數據的呢?下面我們來介紹中斷方式接收數據的步驟。

(1)使能接收中斷。

(2)接收到數據后觸發接收數據中斷,此時程序按以下步驟執行。

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

圖片

圖8-26 USART1中斷函數入口

②執行中斷函數USART1_IRQHandler,在該中斷函數中調用HAL庫的USART1中斷函數,如圖8-27所示。

圖片

圖8-27 USART的中斷函數的內容

注意,該函數需要用戶自己實現,如果用戶使用CubeMX生成工程,則工程會自動在輸出文件stm32f4xx_it.c中生成該函數。

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

圖片

圖8-28 函數HAL_UART_IRQHandler定義示意圖

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

圖片

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

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

if (huart- >Init.Parity == UART_PARITY_NONE)  /* 如果沒有使能奇偶校驗,數據位為8位 */


     {


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


     }


     else  /* 如果使能了奇偶校驗,數據位為7位 */


     {


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


     }

在上述程序段中,程序首先將接收到的數據保存到句柄huart的接收區緩沖指針pRxBuffPtr指向的存儲單元中,然后指針pRxBuffPtr的值加1,指向下一個存儲單元。

所以,在中斷方式接收中,數據的接收在中斷函數中完成。

讀到一個數據后,huart的接收計數變量RxXferCount的值減1,并判斷減到0了沒有,如果減到0了,說明數據已經接收完成,關閉串口中斷,如圖8-30中的②所示,接著執行接收完成中斷回調函數HAL_UART_RxCpltCallback,如圖8-30中的③所示。

⑤執行回調函數HAL_UART_RxCpltCallback。由于在步驟④中執行函數UART_Receive_IT時已經關閉了串口的接收中斷,所以如果要繼續采用中斷方式接收數據,則需要在回調函數中再次調用函數HAL_UART_Receive_IT使能串口中斷。

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

    關注

    8

    文章

    1221

    瀏覽量

    54384
  • STM32
    +關注

    關注

    2291

    文章

    11022

    瀏覽量

    363485
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14301
  • 系統時鐘
    +關注

    關注

    1

    文章

    31

    瀏覽量

    9580
  • HAL庫
    +關注

    關注

    1

    文章

    121

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    請問HAL中用DMA方式使用串口串口中斷用開嗎?

    關于HAL中用DMA方式使用串口的問題,串口中斷用開嗎?使用DMA模式收發串口的核心語句為如下2句HA
    發表于 12-04 08:48

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

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

    STM32 HAL串口中斷通訊【任意長度 不丟幀】精選資料分享

    基于HAL的多串口通信入門,多串口中斷通信,可以發任意字節數據,用的STM32F302CBTx,STM32F103也一樣通用。本例使用三組串口中斷
    發表于 08-16 06:30

    【STM32的HAL開發】CubeMX配置HAL,不進串口中斷的問題 精選資料分享

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

    HAL串口中斷接收

    [STM32系列]一、HAL串口中斷接收1、前言2、回調函數3、HAL中斷接收函數使用1、
    發表于 08-16 08:13

    如何解決CubeMX配置HAL不進串口中斷的問題?

    如何解決CubeMX配置HAL不進串口中斷的問題?
    發表于 11-16 09:04

    基于HAL串口中斷接收函數該如何去實現呢

    基于HAL串口中斷接收函數該如何去實現呢?有什么方法嗎?
    發表于 12-06 06:56

    STM32F0 HAL串口中斷調用順序是什么樣的?

    STM32F0 HAL串口中斷調用順序是什么樣的?
    發表于 12-08 07:59

    請問hal如何實現stm32串口中斷接收數據?

    請問hal如何實現stm32串口中斷接收數據?
    發表于 12-09 07:39

    【STM32+cubemx】0005 HAL開發:uart串口中斷和fifo環形隊列

    上一節我們學習了串口的輪詢收發,以及HAL自帶的中斷收發。也分析了優缺點,這一節我們來講講如何改寫HAL庫函數,使它能更高效地收發數據,更
    發表于 11-15 20:36 ?39次下載
    【STM32+cubemx】0005 <b class='flag-5'>HAL</b><b class='flag-5'>庫</b>開發:uart<b class='flag-5'>串口中斷</b>和fifo環形隊列

    HAL實驗中斷開關點燈及串口通信

    HAL實驗中斷開關點燈及串口通信中斷介紹1、什么是中斷2、
    發表于 11-23 18:06 ?8次下載
    <b class='flag-5'>HAL</b><b class='flag-5'>庫</b>實驗<b class='flag-5'>中斷</b>開關點燈及<b class='flag-5'>串口</b>通信

    STM32 HAL串口空閑中斷+DMA 實現串口數據的不定長接收

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

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

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

    STM32使用HAL實現串口通訊

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

    串口中斷是內部中斷還是外部中斷串口中斷是怎么觸發的

    串口中斷通常被視為外部中斷。雖然串口控制器(如USART、UART等)可能集成在微控制器或處理器的內部,但從中斷的角度來看,串口中斷是由處理
    的頭像 發表于 01-29 15:03 ?1626次閱讀
    主站蜘蛛池模板: 666夜色666夜色国产免费看 | 天天操夜| 国产黄网站 | 好骚综合在线 | 天天色官网 | 国产香蕉视频在线观看 | 成人欧美精品久久久久影院 | 天堂资源在线中文 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 日本天堂影院 | 国产一级毛片外aaaa | 色老头久久久久久久久久 | 综合网在线观看 | 中文一区二区在线观看 | 一级不卡毛片免费 | 91免费网站在线看入口黄 | 免费的三及片 | 97影院午夜在线观看视频 | 久久九九亚洲精品 | 涩久久 | 免费日本视频 | 热re99久久精品国产99热 | 成人a网| 欧美色综合高清视频在线 | 久久综合九色欧美综合狠狠 | 亚洲成a人片在线观看导航 亚洲成a人片在线观看尤物 | 噜噜噜色噜噜噜久久 | 射久久| 婷婷午夜激情 | 免费看黄视频网站 | freesex性欧美重口 | 天堂色 | 伊人网综合在线视频 | 国产男人女人做性全过程视频 | 国模人体一区二区三区 | 免费大片黄国产在线观看 | 小泽玛利亚在线观看123 | 亚洲综合成人网 | 久久久噜噜噜久久 | 国产亚洲综合色就色 | 特级毛片女人18毛片 |