91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

STM32串口中斷及DMA接收常見(jiàn)的幾個(gè)問(wèn)題

jf_pJlTbmA9 ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2023-10-26 16:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天再給大家分享一些關(guān)于STM32串口中斷及DMA接收常見(jiàn)的幾個(gè)問(wèn)題。

UART串口中斷接收

使能UART串口中斷之后,有接收到UART數(shù)據(jù),進(jìn)入中斷,此時(shí)要清除RXNE接收標(biāo)志位:

1)通過(guò)軟件向該RXNE標(biāo)志位寫入零來(lái)清零;

2)通過(guò)對(duì) USART_DR 寄存器執(zhí)行讀入操作將該位清零。

這里可以查看對(duì)應(yīng)《參考手冊(cè)》,一般我們選擇第2種,通過(guò)讀取UART串口數(shù)據(jù)來(lái)清零。

1、中斷接收數(shù)據(jù)丟失

在UART串口中斷函數(shù)中,或者更高優(yōu)先級(jí)中斷函數(shù)中長(zhǎng)時(shí)間執(zhí)行,導(dǎo)致接收丟失,所以,請(qǐng)勿在中斷函數(shù)中長(zhǎng)時(shí)間執(zhí)行。

特別有些人,還在中斷函數(shù)添加延時(shí)函數(shù)。實(shí)際應(yīng)用中,只要不是特殊情況,比如測(cè)試某個(gè)功能可以添加延時(shí)函數(shù),都不建議在中斷函數(shù)添加延時(shí)函數(shù)。

2、ORE上溢錯(cuò)誤

ORE上溢錯(cuò)誤是什么意思呢? 可能很多人不了解,簡(jiǎn)單說(shuō)就是:UART接收到有數(shù)據(jù),沒(méi)有去取,但又來(lái)了數(shù)據(jù),此時(shí)就會(huì)產(chǎn)生ORE上溢錯(cuò)誤。(請(qǐng)看“參考手冊(cè)”)

其實(shí),上面這種長(zhǎng)時(shí)間在占用中斷,就會(huì)導(dǎo)致UART接收數(shù)據(jù)上溢。

很多人沒(méi)有在意這個(gè),如果是使能了中斷接收,標(biāo)志位沒(méi)有清除,又有ORE上溢錯(cuò)誤的話,程序就會(huì)不停地進(jìn)入U(xiǎn)ART中斷。(大家不妨試一下,看一下是不是你代碼一直在UART中斷里面不停運(yùn)行)。

3、使能接收中斷前,先清除接收標(biāo)志位

有時(shí)候,在程序初始化的時(shí)候,就會(huì)接收到數(shù)據(jù),這個(gè)時(shí)候建議大家先清除接收標(biāo)志位再使能接收中斷。類似如下:

wKgZomUD8ZyAcMFkAAOnWVM3tz4985.jpg

DMA接收串口數(shù)據(jù)

使用DMA接收串口數(shù)據(jù),相信很多朋友都知道。這個(gè)可以理解為使用隊(duì)列,或者FIFO的形式,防止因高優(yōu)先級(jí)中斷而打斷,導(dǎo)致接收數(shù)據(jù)丟失。

但很多人都遇到過(guò),接收不到數(shù)據(jù),或者數(shù)據(jù)異常的情況。所以,這里同樣有需要注意的地方。

1、使能UART之前,先使能DMA相關(guān)配置

這個(gè)和清除標(biāo)志位一樣的道理,使能UART之前,先使能DMA相關(guān)配置,防止在配置過(guò)程中有接收數(shù)據(jù)。

wKgZomUD8Z2AQ7HXAAEwkQrKiT4053.jpg

2、ORE上溢錯(cuò)誤導(dǎo)致不能使用DMA接收數(shù)據(jù)

導(dǎo)致不能DMA接收不到數(shù)據(jù)的根源,有一種可能就是有ORE上溢錯(cuò)誤。

若在串口初始化并使能后到 DMA 使能之前有數(shù)據(jù)來(lái),MCU是不能接收的。如果此時(shí)數(shù)據(jù)寄存器 USART_DR 存在一個(gè)數(shù)據(jù),再來(lái)一個(gè)數(shù)據(jù),就會(huì)導(dǎo)致ORE上溢錯(cuò)誤。

一旦產(chǎn)生上溢錯(cuò)誤后,就無(wú)法再觸發(fā) DAM 請(qǐng)求,即使之后再啟動(dòng) DMA 也不行,無(wú)法觸發(fā) DMA 請(qǐng)求就無(wú)法將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)及時(shí)轉(zhuǎn)移走,如此陷入死鎖。這就是串口無(wú)法正常接收的原因。

所以,最后提醒大家,配置時(shí),請(qǐng)一定要注意這些細(xì)節(jié)。

來(lái)源:嵌入式專欄(作者 | strongerHuang)
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

聲明:本文內(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)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5608

    瀏覽量

    129951
  • STM32
    +關(guān)注

    關(guān)注

    2309

    文章

    11161

    瀏覽量

    373386
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1618

    瀏覽量

    82797
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    581

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    串口中斷和定時(shí)中斷,外部中斷在一起如何調(diào)用?

    /9600=20ms 也就是說(shuō),處理了定時(shí)中斷后,再處理的串口中斷 時(shí)間上:實(shí)際是定時(shí)+串口 如果是1s內(nèi),那么定時(shí)中斷內(nèi)嵌套串口中斷
    發(fā)表于 01-14 06:25

    串口空閑中斷串口超時(shí)中斷介紹

    1. 空閑中斷(Idle Interrupt) 觸發(fā)條件 當(dāng)串口總線在接收數(shù)據(jù)后持續(xù)保持空閑狀態(tài)(如高電平)超過(guò)一幀時(shí)間(即一個(gè)字符傳輸時(shí)間)時(shí)觸發(fā)。 硬件自動(dòng)檢測(cè)總線空閑狀態(tài),與數(shù)據(jù)長(zhǎng)度無(wú)關(guān)
    發(fā)表于 11-21 08:31

    E203串口中斷使用總結(jié)

    以上函數(shù)的設(shè)置后,就可以在中斷服務(wù)函數(shù)中寫下自己需要的中斷處理功能,并且在 main() 函數(shù)中寫下“my_uart_init()”,就能實(shí)現(xiàn)串口中斷。 二、串口
    發(fā)表于 10-22 07:34

    rt-thread 在使用串口DMA模式的時(shí)候,接收數(shù)據(jù)接收不到00,為什么?

    硬件為STM32F103ZET6: 在使用串口通訊時(shí),在DMA接收模式下,收不到00數(shù)據(jù),遇到00數(shù)據(jù),好像DMA模式就認(rèn)為是數(shù)據(jù)已經(jīng)結(jié)束了
    發(fā)表于 10-14 06:20

    串口DMA接收方式打開(kāi),為什么在開(kāi)啟IDLE中斷的情況下還需要開(kāi)啟DMA中斷呢?

    如圖,在以 RT_DEVICE_FLAG_DMA_RX 方式打開(kāi)串口時(shí),底層會(huì)配置串口IDLE中斷,同時(shí)也會(huì)打開(kāi)DMA
    發(fā)表于 09-29 08:30

    串口DMA接收數(shù)據(jù)包丟失怎么解決?

    RTT串口DMA接收數(shù)據(jù),超過(guò)緩沖區(qū)后為什么會(huì)吞掉一個(gè)數(shù)據(jù)包呢,不能每次處理完后清除緩沖區(qū)數(shù)據(jù)嗎,感覺(jué)接收的數(shù)據(jù)是累計(jì)的,累計(jì)滿之后會(huì)重新覆蓋,在最后一個(gè)包
    發(fā)表于 09-29 07:50

    RTT5.2.0串口接收中斷死機(jī)怎么解決?

    RT_DEVICE_FLAG_DMA_RX 和 RT_DEVICE_FLAG_INT_RX 問(wèn)題一樣, 如果不使用中斷就不會(huì)出現(xiàn)這個(gè)問(wèn)題, 開(kāi)始中斷如果沒(méi)有數(shù)據(jù)接收不會(huì)報(bào)錯(cuò), 有
    發(fā)表于 09-22 06:16

    關(guān)于stm32f4zgt6和mspm0g3507串口通信問(wèn)題

    本人在使用stm32f4zgt6和mspm0g3507串口通信時(shí)出現(xiàn)問(wèn)題,情況如下: m0芯片使用軟件超時(shí)解析進(jìn)行數(shù)據(jù)接收,使用標(biāo)準(zhǔn)庫(kù)的transmit函數(shù)進(jìn)行數(shù)據(jù)發(fā)送。 stm32使
    發(fā)表于 09-01 11:11

    CYT2B7串口接收會(huì)漏接數(shù)據(jù)怎么解決?

    串口中斷方式接收會(huì)漏接數(shù)據(jù)如串口工具發(fā)送 :1234567芯片接收到 :1357硬件是CYTVII-B-E-1M-SK開(kāi)發(fā)板軟件是SDL v8.3 中的
    發(fā)表于 08-14 07:29

    求助,關(guān)于stm32H7多DMA數(shù)據(jù)流問(wèn)題求解

    情況如下:stm32H7配置了一個(gè)adc進(jìn)行采樣,通過(guò)dma進(jìn)行數(shù)據(jù)傳輸,串口接收和發(fā)送命令,用兩個(gè)dma數(shù)據(jù)流通道,采用的空閑
    發(fā)表于 07-29 15:02

    STM32407使用串口閑時(shí)中斷+DMA方式接收最大接收字節(jié)是多少?

    使用串口閑時(shí)中斷+DMA方式接收數(shù)據(jù),波特率為460800,DMA接收長(zhǎng)度為1024個(gè)字節(jié),并開(kāi)
    發(fā)表于 07-22 08:16

    STM32串口下載軟件(FLYMCU)

    STM32串口下載軟件(FLYMCU),經(jīng)典版本,親試可用。
    發(fā)表于 04-09 15:59 ?11次下載

    使用串口dma環(huán)形接收+空閑中斷,觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,怎么處理?

    求助,我使用串口dma環(huán)形接收+空閑中斷,默認(rèn)應(yīng)該開(kāi)了緩存,在觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,但是我掛上調(diào)試之后在拷貝
    發(fā)表于 03-27 06:17

    stm32f105串口數(shù)據(jù)丟失的原因?

    hal庫(kù)通過(guò)dma空閑中斷接收數(shù)據(jù),收到的數(shù)據(jù)直接通過(guò)串口打印出去,每隔一段時(shí)間出現(xiàn)接收到數(shù)據(jù)丟失是為啥呢
    發(fā)表于 03-14 13:38

    STM32F427串口接收和發(fā)送中斷同時(shí)使能,為什么會(huì)出現(xiàn)接收中斷丟數(shù)的情況?

    STM32F427芯片,針對(duì)UART7開(kāi)啟串口接收緩存區(qū)非空中斷RXNE和串口傳輸完成中斷TC.
    發(fā)表于 03-11 07:05