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

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

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

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

一文詳解USART模塊接收中斷的問題處理

電子工程師 ? 來源:網(wǎng)絡(luò)整理 ? 作者:工程師a ? 2018-05-26 09:00 ? 次閱讀

問題描述:

在使用USART做串口通訊時,我只把接收中斷打開,并設(shè)置搶占優(yōu)先級為最低一個級別,而接收中斷上一個優(yōu)先級處理事情比較多,可能占用了2ms時間。當(dāng)我使用9600波特率往下位機(jī)發(fā)送數(shù)據(jù),速度非???,就是一直按回車發(fā)!問題就出來,不到1分鐘時間,通訊沒有反應(yīng)了。USART配置代碼如下:

void uart_config(void)

{

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate);

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStructure.USART_Clock = USART_Clock_Disable;

USART_InitStructure.USART_CPOL = USART_CPOL_Low;

USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_InitStructure.USART_LastBit = USART_LastBit_Enable;

/* Configure USART1 */

USART_Init(USART1, &USART_InitStructure);

/* Enable USART1 receive interrupt */

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

/* Enable the USART1 */

USART_Cmd(USART1, ENABLE);

}

分析問題:

1.為什么沒有通訊了?

通過仿真器仿真,發(fā)現(xiàn)程序一直進(jìn)入接收中斷中,由于我沒有使用中斷發(fā)送,于是程序就死在了接收中斷,也就沒有數(shù)據(jù)發(fā)送到電腦上來。接收中斷代碼如下:

void UART_Receive(void)

{

//正在處理上一條通訊,接收到數(shù)據(jù)不處理

if(bRecieveOK)

{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

return;//processing receive data,don‘t receive again

}

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

if(MoudBusExpir == 0)

{

ucRcePtr = 0;

MoudBusExpir = 20;//50ms

}

else

MoudBusExpir = 20;

/* Read one byte from the receive data register */

ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);

/* Clear the USART1 Receive interrupt */

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

}

2.為什么會一直跑到接收中斷?

斷點(diǎn)之后發(fā)現(xiàn)(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是說沒有數(shù)據(jù)接收到也進(jìn)了中斷,而且在USART配置中我也只打開了接收中斷!沒有數(shù)據(jù)送過來應(yīng)該是不可能進(jìn)入中斷的!

3.響應(yīng)了什么中斷?

我想通過函數(shù)(USART_GetITStatus()把所有中斷狀態(tài)都讀出來,但失敗了,USART_IT_XXX所有中斷狀態(tài)都是RESET!也就是說沒有中斷也進(jìn)入到這個中斷服務(wù)程序來了???

4.找資料

STM32F10x微控制器參考手冊(2009年12月第10版)P541發(fā)現(xiàn)如下說明:

 一文詳解USART模塊接收中斷的問題處理

也就是說只要接收中斷打開,即RXNEIE設(shè)置為1,那么ORE中斷也自動打開了。

可是USART_GetITStatus(USART1, USART_IT_ORE )== RESET?。。?!

找到USART_GetITStatus(USART1, USART_IT_RXNE)函數(shù),發(fā)現(xiàn)只有當(dāng)USART_IT_ERR中斷使能時,才能讀到ORE中斷。

在這里要指出這個BUG:產(chǎn)生ORE中斷了,但使用USART_GetITStatus()函數(shù)卻無法讀到這個中斷被SET起來!

5.把ORE中斷標(biāo)志位清除

既然找到了是什么中斷,那么把相應(yīng)的中斷標(biāo)志位清除,就應(yīng)該可以了吧?

USART_ClearITPendingBit(USART1, USART_IT_ORE);

但是,結(jié)果是沒有任何效果!清除之后,馬上讀ORE中斷狀態(tài),USART_GetITStatus(USART1, USART_IT_ORE)==RESET.程序仍然跑死在接收中斷。再使用另一個函數(shù)USART_GetFlagStatus(USART1, USART_FLAG_ORE) = SET,原來ORE標(biāo)志位還沒有清除。

6.問題解決

為什么清除不掉?頭疼了,再找找資料,有發(fā)現(xiàn),在P523頁如下圖:

 一文詳解USART模塊接收中斷的問題處理

接收中斷程序改為:

void UART_Receive(void)

{

if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)來判斷

{

USART_ReceiveData(USART1);

}

//正在處理上一條通訊,接收到數(shù)據(jù)不處理

if(bRecieveOK)

{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

return;//processing receive data,don‘t receive again

}

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

if(MoudBusExpir == 0)

{

ucRcePtr = 0;

MoudBusExpir = 20;//50ms

}

else

MoudBusExpir = 20;

/* Read one byte from the receive data register */

ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);

/* Clear the USART1 Receive interrupt */

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

}

總結(jié):

注意問題:

1.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中斷,那么ORE中斷也同時被開啟了。

2.ORE中斷只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 讀到(沒有使能USART_IT_ERR中斷時)

BUG建議:1.在STM32庫中,能不能修改USART_GetITStatus()函數(shù)對USART_IT_ORE中斷的處理?也就是我只要打開了接收中斷,那么有ORE中斷時,我也能使用USART_GetITStatus(USART1,USART_IT_ORE)讀到。

其它:在找資料的同時,發(fā)現(xiàn)STM32F10x微控制器參考手冊(2009年12月第10版)中文翻譯P538有錯誤,如下圖:

 一文詳解USART模塊接收中斷的問題處理

英文P696如下圖:

 一文詳解USART模塊接收中斷的問題處理

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

    關(guān)注

    1

    文章

    263

    瀏覽量

    25329
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    198

    瀏覽量

    31522
收藏 人收藏

    評論

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

    USART 中斷方式接收無響應(yīng)問題的種情況 及其處理方法

    本用戶手冊,下載鏈接為:調(diào)研:、經(jīng)過調(diào)研:1.1 客戶除了使用USART做串口通信,還開啟了定時器中斷來進(jìn)行數(shù)據(jù)采集.1.2 定時器的優(yōu)先級比串口接收的優(yōu)先級高.1.3 定時器
    發(fā)表于 09-27 16:01

    STM32 USART 串口 DMA 接收和發(fā)送的源碼詳解

    的,產(chǎn)生的條件是這樣的,當(dāng)清除IDLE標(biāo)志位后,必須有接收到第個數(shù)據(jù)后,才開始觸發(fā),接收的數(shù)據(jù)斷流,沒有接收到數(shù)據(jù),即產(chǎn)生IDLE
    發(fā)表于 08-22 14:21

    如何實(shí)現(xiàn)STM32 USART DMA發(fā)送中斷接收

    如何實(shí)現(xiàn)STM32 USART DMA發(fā)送中斷接收
    發(fā)表于 12-10 07:37

    詳解MCS-51單片機(jī)的中斷系統(tǒng)

    詳解MCS-51單片機(jī)的中斷系統(tǒng),具體的跟隨小編來了解下。
    的頭像 發(fā)表于 07-28 11:26 ?1.3w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>MCS-51單片機(jī)的<b class='flag-5'>中斷</b>系統(tǒng)

    STM32單片機(jī)的USART接收數(shù)據(jù)問題解決方案

    先使用USART中斷函數(shù)接收數(shù)據(jù),判斷是否接收到每幀數(shù)據(jù)的起始標(biāo)記字符。如果接收到就關(guān)閉USART
    發(fā)表于 12-06 15:36 ?6458次閱讀

    詳解藍(lán)牙模塊原理與結(jié)構(gòu)

    電子發(fā)燒友網(wǎng)站提供《詳解藍(lán)牙模塊原理與結(jié)構(gòu).pdf》資料免費(fèi)下載
    發(fā)表于 11-26 16:40 ?94次下載

    USART中斷方式接收無響應(yīng)問題的種情況及其處理方法資料下載

    電子發(fā)燒友網(wǎng)為你提供USART中斷方式接收無響應(yīng)問題的種情況及其處理方法資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中
    發(fā)表于 04-14 08:52 ?24次下載
    <b class='flag-5'>USART</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b>無響應(yīng)問題的<b class='flag-5'>一</b>種情況及其<b class='flag-5'>處理</b>方法資料下載

    USART中斷方式接收無響應(yīng)問題的情況及其處理方法

    USART中斷方式接收無響應(yīng)問題的情況及其處理方法。
    發(fā)表于 04-28 15:41 ?5次下載

    STM32串口中斷卡死主循環(huán)直進(jìn)中斷問題分析

    項(xiàng)目中,使用STM32作為主控,程序運(yùn)行段時間后概率出現(xiàn)主循環(huán)卡死現(xiàn)象。問題分析如下:1、程序USART2不停接收處理串口數(shù)據(jù),波特
    發(fā)表于 11-26 14:06 ?14次下載
    STM32串口<b class='flag-5'>中斷</b>卡死主循環(huán)<b class='flag-5'>一</b>直進(jìn)<b class='flag-5'>中斷</b>問題分析

    2021-04-16 STM32F103 USART 接收數(shù)據(jù)不進(jìn)中斷 以及 進(jìn)中斷后數(shù)據(jù)接收問題

    問題1:硬件OK,USART接收數(shù)據(jù)不進(jìn)終端現(xiàn)象: 硬件以及串口助手通過自檢都沒有問題,但是使用Keil Debug的時候發(fā)現(xiàn),USART的SR寄存器中在每次接收到數(shù)據(jù)后,F(xiàn)E位都會置
    發(fā)表于 12-02 13:06 ?9次下載
    2021-04-16  STM32F103 <b class='flag-5'>USART</b> <b class='flag-5'>接收</b>數(shù)據(jù)不進(jìn)<b class='flag-5'>中斷</b> 以及  進(jìn)<b class='flag-5'>中斷</b>后數(shù)據(jù)<b class='flag-5'>接收</b>問題

    USART空閑中斷

    的檢測,進(jìn)入中斷程序即意味著已經(jīng)接收組完整數(shù)據(jù),僅需即時對數(shù)據(jù)處理或?qū)?shù)據(jù)轉(zhuǎn)移出緩沖區(qū)即可。為了節(jié)省資源,簡化幀頭幀尾檢測,單片機(jī)接收
    發(fā)表于 12-04 12:06 ?8次下載
    <b class='flag-5'>USART</b>空閑<b class='flag-5'>中斷</b>

    GD32E23x的USART被斷點(diǎn)打斷后重新運(yùn)行,會直進(jìn)入中斷的問題

    GD32E23x的USART被斷點(diǎn)打斷后重新運(yùn)行,會直進(jìn)入中斷的問題GD32E230K8單片機(jī)USART0連接個從機(jī)芯片,該芯片每100
    發(fā)表于 12-09 10:06 ?8次下載
    GD32E23x的<b class='flag-5'>USART</b>被斷點(diǎn)打斷后重新運(yùn)行,會<b class='flag-5'>一</b>直進(jìn)入<b class='flag-5'>中斷</b>的問題

    Stm32 hal庫 usart2與hc-08透傳模塊通訊

    為打印串口使用,藍(lán)牙透傳模塊將使用usart2進(jìn)行通訊,配置如下。usart1 不用處理接收的數(shù)據(jù),故不用打開
    發(fā)表于 12-24 18:46 ?18次下載
    Stm32 hal庫 <b class='flag-5'>usart</b>2與hc-08透傳<b class='flag-5'>模塊</b>通訊

    串口接收中斷--并不是說不使能串口接受中斷就無法接收數(shù)據(jù)

    并不是說不使能串口接受中斷就無法接收數(shù)據(jù),只是為了在串口接收數(shù)據(jù)的時候防止其程序打擾串口數(shù)據(jù)的接收,所以跑到中斷中去
    發(fā)表于 12-28 19:15 ?15次下載
    串口<b class='flag-5'>接收</b><b class='flag-5'>中斷</b>--并不是說不使能串口接受<b class='flag-5'>中斷</b>就無法<b class='flag-5'>接收</b>數(shù)據(jù)

    如何通過配置串口的接收作為中斷

    使用中斷 通過配置串口的接收作為中斷源,開啟中斷輸出控制,配置NVIC。開啟中斷通道。 //開啟中斷
    的頭像 發(fā)表于 11-10 16:33 ?813次閱讀
    如何通過配置串口的<b class='flag-5'>接收</b>作為<b class='flag-5'>中斷</b>源
    主站蜘蛛池模板: 四虎国产精品影库永久免费 | 免费免费啪视频视频观看 | 成人在线天堂 | 美女流白浆网站 | 老师我好爽再深一点好大 | 国产免费播放一区二区三区 | 一级黄色片在线看 | 色婷婷综合久久久久中文一区二区 | 天天躁夜夜躁狠狠躁2021a | 四虎精品免费永久在线 | 99久久免费精品国产免费高清 | 国产一区二区三区四卡 | 爱爱天堂| 亚洲五月婷婷 | 婷婷丁香在线观看 | 日本三级电影在线观看 | 午夜爽爽| 午夜影视网站 | 国产做a爰片久久毛片 | 国产色妞妞在线视频免费播放 | 不卡一级毛片免费高清 | 亚洲视频黄 | 玖玖在线国产精品 | 香蕉蕉亚亚洲aav综合 | 国内一级毛片 | 色视频在线免费看 | 国产精品久久久久久久免费大片 | 亚洲丰满熟妇毛片在线播放 | 国产午夜精品福利 | 久久国产精品亚洲综合 | 天天爽夜夜爽人人爽曰喷水 | 99福利| 亚洲精品第三页 | 夜夜精品视频一区二区 | 在线欧美三级 | 特级深夜a级毛片免费观看 特级生活片 | 国产女主播在线播放一区二区 | 日日噜噜夜夜狠狠久久丁香 | 日日噜噜噜噜人人爽亚洲精品 | 男人在线网站 | 天天爽夜夜爽 |