国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32 CubeMX】串口編程DMA+IDLE中斷

這篇具有很好參考價值的文章主要介紹了【STM32 CubeMX】串口編程DMA+IDLE中斷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。


前言

在嵌入式系統(tǒng)中,串口通信是一項關(guān)鍵的任務(wù),而使用DMA(直接內(nèi)存訪問)結(jié)合IDLE中斷進(jìn)行串口編程,尤其是在STM32 CubeMX環(huán)境中,能夠提高系統(tǒng)的效率和性能。STM32 CubeMX為STM32微控制器提供了圖形化的配置工具,可以簡化初始化代碼的生成過程,使得串口編程變得更加容易。通過結(jié)合DMA和IDLE中斷,我們可以實現(xiàn)高效的異步串口通信,確保數(shù)據(jù)傳輸?shù)目煽啃?,同時減輕CPU的負(fù)擔(dān)。


一、為什么要引入IDLE中斷

比如我們的stm32接了一個wifi模塊esp8266,esp8266會發(fā)來數(shù)據(jù),假設(shè)我現(xiàn)在想去讀數(shù)據(jù),我使用DMA方式讀數(shù)據(jù),我不知道esp8266給我發(fā)多少數(shù)據(jù),但是肯定不超過1024字節(jié)吧,然后我調(diào)用函數(shù)去讀,讀1024字節(jié),如果他給我發(fā)了剛好1024字節(jié),欸,那么就讀成功了。如果他發(fā)1000數(shù)據(jù),而且這1000數(shù)據(jù)是完整的了,但DMA的中斷并不會調(diào)用,DMA中斷只會在接收到一半或者全部接收完才會調(diào)用。

我們?nèi)绾沃浪陌l(fā)的這些東西已經(jīng)完整了呢?
我們知道,當(dāng)串口發(fā)送數(shù)據(jù)的時候,他必定有一個起始位,如果接收方在這一節(jié)數(shù)據(jù)之后,發(fā)現(xiàn)這個引腳一直沒有開始信號,在10bit的時間里發(fā)現(xiàn)對方都沒有數(shù)據(jù),他就認(rèn)為數(shù)據(jù)發(fā)送完了,這時就會產(chǎn)生IDLE空閑中斷。

比如說對方發(fā)了1bit的數(shù)據(jù),由于一些原因卡殼了,過了10bit的數(shù)據(jù)時間,這時就會調(diào)用IDLE中斷,可是數(shù)據(jù)并不完整啊。所以對于這種情況,IDLE中斷是無意義的。

注意:IDLE中斷用來傳輸大量數(shù)據(jù)的時候才有意義。

二、IDLE中斷使用方式

2.1 接收的三種情況

當(dāng)我們使用IDLE中斷來接收數(shù)據(jù)的時候,他完成會有三種情況

  1. 第一種就是確實接收到了指定數(shù)據(jù),調(diào)用的完成的回調(diào)函數(shù)(HAL_UART_RxCpltCallback被調(diào)用)
  2. 第二種就是IDLE中斷調(diào)用了(HAL_UARTEx_RxEventCallback被調(diào)用)
  3. 第三種就是有錯誤發(fā)生導(dǎo)致中斷(HAL_UART_ErrorCallback被調(diào)用)

2.2 函數(shù)的使用

查詢方式

我們可以使用下面這個函數(shù)進(jìn)行IDLE中斷的查詢方式進(jìn)行查詢:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
                                           uint32_t Timeout);

UART_HandleTypeDef *huart:
作用: 傳遞一個指向UART_HandleTypeDef結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含了UART的配置和狀態(tài)信息。
解釋: 這個參數(shù)用于標(biāo)識特定的UART外設(shè),通過該參數(shù),函數(shù)知道應(yīng)該對哪個UART進(jìn)行操作。

uint8_t *pData:
作用: 指向要接收數(shù)據(jù)的緩沖區(qū)的指針。
解釋: 這個參數(shù)指定了存儲接收數(shù)據(jù)的緩沖區(qū)。當(dāng)函數(shù)接收到指定數(shù)量的字節(jié)或達(dá)到超時條件時,接收到的數(shù)據(jù)將存儲在該緩沖區(qū)中。

uint16_t Size:
作用: 要接收的數(shù)據(jù)字節(jié)數(shù)。
解釋: 它定義了期望接收的字節(jié)數(shù)目。當(dāng)接收的字節(jié)數(shù)達(dá)到這個值時,函數(shù)將數(shù)據(jù)接收到空閑狀態(tài)(IDLE)。

uint16_t *RxLen:
作用: 指向用于存儲實際接收到的數(shù)據(jù)字節(jié)數(shù)的指針。
解釋: 當(dāng)函數(shù)成功接收到數(shù)據(jù)時,它將更新此指針指向的變量,以反映實際接收到的字節(jié)數(shù)。這對于知道接收了多少數(shù)據(jù)很有用。

uint32_t Timeout:
作用: 接收數(shù)據(jù)的超時時間。
解釋: 定義了等待接收數(shù)據(jù)的最大時間。如果在超時時間內(nèi)未接收到指定數(shù)量的字節(jié),函數(shù)將返回適當(dāng)?shù)腻e誤代碼。

如果有IDLE狀態(tài),他放回HAL_OK

中斷方式

我們可以使用下面這種方式進(jìn)行IDLE中斷的接收:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

這個函數(shù)就是去使能接收中斷和IDLE中斷。
如果發(fā)生了IDLE中斷他會怎么做?
在串口1這里,IDLE中斷也屬于串口中斷
【STM32 CubeMX】串口編程DMA+IDLE中斷,從0帶你學(xué)會如何像人類一樣寫STM32程序,stm32,單片機(jī),嵌入式硬件,mcu,c,51單片機(jī)
下面就是如果有IDLE中斷發(fā)生的代碼:如果發(fā)現(xiàn)了IDLE中斷,他會分兩種情況處理
【STM32 CubeMX】串口編程DMA+IDLE中斷,從0帶你學(xué)會如何像人類一樣寫STM32程序,stm32,單片機(jī),嵌入式硬件,mcu,c,51單片機(jī)
如果你使用DMA:
取消DMA,調(diào)用下面這個:
【STM32 CubeMX】串口編程DMA+IDLE中斷,從0帶你學(xué)會如何像人類一樣寫STM32程序,stm32,單片機(jī),嵌入式硬件,mcu,c,51單片機(jī)
傳入你收到了幾個字符。

如果你使用中斷:
禁止接收中斷,調(diào)用下面這個:
【STM32 CubeMX】串口編程DMA+IDLE中斷,從0帶你學(xué)會如何像人類一樣寫STM32程序,stm32,單片機(jī),嵌入式硬件,mcu,c,51單片機(jī)

傳入你收到了幾個字符。

當(dāng)有IDLE中斷時,調(diào)用HAL_UARTEx_RxEventCallback表示有IDLE中斷了

DMA方式

我們可以使用下面這個函數(shù)進(jìn)行DMA+IDLE接收:

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

當(dāng)他產(chǎn)生IDLE中斷后,他會調(diào)用HAL_UARTEx_RxEventCallback回調(diào)函數(shù)

分析一個問題

UART 的 IDLE 中斷何時發(fā)生?RxD 引腳一開始就是空閑的啊,難道 IDLE 中斷一直產(chǎn)生?
不是的。當(dāng)我們使能 IDLE 中斷后,它并不會立刻產(chǎn)生,而是:至少收到 1 個數(shù)據(jù)后,發(fā)現(xiàn)
在一個字節(jié)的時間里,都沒有接收到新數(shù)據(jù),才會產(chǎn)生 IDLE 中斷。


總結(jié)

串口編程對于嵌入式系統(tǒng)至關(guān)重要,而在STM32 CubeMX環(huán)境中,利用DMA和IDLE中斷的組合可以使串口通信更為高效。DMA允許數(shù)據(jù)在內(nèi)存和外設(shè)之間直接傳輸,減輕了CPU的負(fù)擔(dān),提高了系統(tǒng)的響應(yīng)速度。IDLE中斷則使得在沒有數(shù)據(jù)傳輸時,系統(tǒng)能夠進(jìn)入低功耗狀態(tài),進(jìn)一步降低功耗。通過這樣的串口編程方式,我們能夠在保證性能的同時,實現(xiàn)更加節(jié)能和可靠的嵌入式系統(tǒng)。在STM32 CubeMX的支持下,配置串口通信變得更加簡單,為嵌入式開發(fā)者提供了更高的開發(fā)效率。文章來源地址http://www.zghlxwxcb.cn/news/detail-828513.html

到了這里,關(guān)于【STM32 CubeMX】串口編程DMA+IDLE中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32 CubeMX】串口編程DMA

    【STM32 CubeMX】串口編程DMA

    在嵌入式系統(tǒng)中,串口通信是一項至關(guān)重要的功能,它允許單片機(jī)與外部設(shè)備進(jìn)行數(shù)據(jù)交換,如傳感器、顯示器或其他設(shè)備。然而,在高速數(shù)據(jù)傳輸?shù)膱鼍跋拢瑐鹘y(tǒng)的串口通信方式可能會使CPU過于繁忙,從而影響系統(tǒng)的性能。為了解決這一問題,STM32系列微控制器提供了DMA(

    2024年02月20日
    瀏覽(18)
  • GD32實現(xiàn)串口空閑(IDLE)中斷 + DMA機(jī)制接收數(shù)據(jù)

    GD32實現(xiàn)串口空閑(IDLE)中斷 + DMA機(jī)制接收數(shù)據(jù)

    前言 串口功能在單片機(jī)開發(fā)中,是比較常用的外設(shè),熟練使用串口功能也是驅(qū)動開發(fā)必備的技能之一。 DMA 是一種CPU輔助手段,可以在CPU不參與的情況下,是做一些輔助CPU的事情,如通常的數(shù)據(jù)搬運(yùn)。 在沒有DMA之前,數(shù)據(jù)讀取時,需要CPU的處理,在多任務(wù)處理時,增加資源緊

    2023年04月13日
    瀏覽(24)
  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實現(xiàn)不定長數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實現(xiàn)不定長數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實物連接 串口輪詢模式 輪詢模式HAL庫函數(shù) 特點(diǎn) 實驗一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開串口中斷 中斷模式HAL庫函數(shù) 特點(diǎn) 實驗二:使用中斷回調(diào)完成實驗一

    2024年04月10日
    瀏覽(44)
  • GD32或STM32:DMA循環(huán)模式與普通模式(串口IDLE)

    USART+DMA+循環(huán)隊列接收不定長數(shù)據(jù)-CSDN博客 STM32 DMA 循環(huán)模式DMA_Mode_Circular詳解-CSDN博客 推薦以上兩個鏈接。 Normal(普通)模式的DMA+串口IDLE中斷,流程如下: 1、初始化時:開啟串口IDLE中斷;dma_circulation_disable,失能DMA的循環(huán); 2、在串口IDLE中斷里面: (1) 清除idle的flag;dma_c

    2024年02月21日
    瀏覽(26)
  • STM32 UART串口通信IDLE空閑中斷的使用步驟

    參考了各路大神的資料,蒙蔽了半天,終于學(xué)會了,記錄一下,以后忘了可以回來復(fù)習(xí)參考。 一、首先在stm32cube中配置打開對應(yīng)uart串口的中斷 二、工程main函數(shù)調(diào)用 __HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);//hal庫宏定義,使能串口空閑中斷 ?? ?HAL_UART_Receive_DMA(huart1,data,sizeof(data));//使

    2024年02月12日
    瀏覽(15)
  • 【STM32】HAL庫 STM32CubeMX——DMA (串口DMA發(fā)送接收)

    【STM32】HAL庫 STM32CubeMX——DMA (串口DMA發(fā)送接收)

    軟件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦線,面包板,USB轉(zhuǎn)TTL DMA,全稱Direct Memory Access,即直接存儲器訪問。 DMA傳輸將數(shù)據(jù)從一個地址空間復(fù)制到另一個地址空間,提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。 我們知道系統(tǒng)的運(yùn)

    2024年02月12日
    瀏覽(24)
  • STM32CubeMX系列05——ADC(輪詢、中斷、DMA)

    STM32CubeMX系列05——ADC(輪詢、中斷、DMA)

    ==== 文章匯總(有代碼匯總) ==== 正點(diǎn)原子Mini板,主控 STM32F103RCT6. 用到的外設(shè): 串口1(PA9、PA10) 任意幾個GPIO口(這里用PA1、PA2、PA3,對應(yīng)ADC通道1、2、3)。 配置時鐘源 配置debug模式(如果需要ST-Link下載及調(diào)試可以勾選) 配置時鐘樹(可以直接在HCLK那里輸入72,然后敲回

    2024年02月10日
    瀏覽(24)
  • STM32CubeMX配置ADC采樣(輪詢、中斷、DMA)

    STM32CubeMX配置ADC采樣(輪詢、中斷、DMA)

    STM32CubeMX能夠極大減小STM32外設(shè)配置的工作量,因此作者也借助空閑時間對STM32CubeMX相關(guān)配置進(jìn)行了學(xué)習(xí),本文介紹如何利用STM32CubeMX配置ADC采樣,記錄了作者學(xué)習(xí)過程中遇到的問題及解決辦法,使大家少走彎路,并方便以后復(fù)習(xí) 先選擇所使用的MCU,這里我使用的是STM32F407ZGT系

    2024年02月03日
    瀏覽(29)
  • STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    本篇文章給大家講解一下DMA+串口空閑中斷接收串口不定長數(shù)據(jù),之前我們也是講解過串口接收不定長數(shù)據(jù)的,那么本篇文章的話將使用DMA來接收不定長數(shù)據(jù)。 串口空閑中斷是指在串口接收到數(shù)據(jù)后,在數(shù)據(jù)的傳輸結(jié)束之后,在一段連續(xù)的空閑時間內(nèi)沒有接收到新數(shù)據(jù)時觸發(fā)

    2024年02月19日
    瀏覽(27)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中斷+定時器+RTC的多傳感器數(shù)據(jù)采集系統(tǒng)(2*ADXL355和ADXL375通過Sync時序同步)

    Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中斷+定時器+RTC的多傳感器數(shù)據(jù)采集系統(tǒng)(2*ADXL355和ADXL375通過Sync時序同步)

    本文的初衷一方面是將我的一些關(guān)于STM32開發(fā)方面淺顯的個人經(jīng)驗分享給初學(xué)者、并期望得到大佬的批評指正,另一方面是記錄自己的實驗過程便于回顧。 我預(yù)感應(yīng)該要寫很多,不過鑒于之前的數(shù)篇筆跡中,對于SPI/DMA/ADXL3XX系列加表的使用已經(jīng)詳細(xì)描述過了,所以這篇博客只

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包