吴忠躺衫网络科技有限公司

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

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

3天內不再提示

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

電子工程師 ? 來源:網絡整理 ? 作者:工程師a ? 2018-05-26 09:00 ? 次閱讀

問題描述:

在使用USART做串口通訊時,我只把接收中斷打開,并設置搶占優先級為最低一個級別,而接收中斷上一個優先級處理事情比較多,可能占用了2ms時間。當我使用9600波特率往下位機發送數據,速度非???,就是一直按回車發!問題就出來,不到1分鐘時間,通訊沒有反應了。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.為什么沒有通訊了?

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

void UART_Receive(void)

{

//正在處理上一條通訊,接收到數據不處理

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.為什么會一直跑到接收中斷?

斷點之后發現(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是說沒有數據接收到也進了中斷,而且在USART配置中我也只打開了接收中斷!沒有數據送過來應該是不可能進入中斷的!

3.響應了什么中斷?

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

4.找資料

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

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

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

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

找到USART_GetITStatus(USART1, USART_IT_RXNE)函數,發現只有當USART_IT_ERR中斷使能時,才能讀到ORE中斷。

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

5.把ORE中斷標志位清除

既然找到了是什么中斷,那么把相應的中斷標志位清除,就應該可以了吧?

USART_ClearITPendingBit(USART1, USART_IT_ORE);

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

6.問題解決

為什么清除不掉?頭疼了,再找找資料,有發現,在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);

}

//正在處理上一條通訊,接收到數據不處理

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);

}

總結:

注意問題:

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()函數對USART_IT_ORE中斷的處理?也就是我只要打開了接收中斷,那么有ORE中斷時,我也能使用USART_GetITStatus(USART1,USART_IT_ORE)讀到。

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

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

英文P696如下圖:

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

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

    關注

    1

    文章

    262

    瀏覽量

    25034
  • USART
    +關注

    關注

    1

    文章

    195

    瀏覽量

    30969
收藏 人收藏

    評論

    相關推薦

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

    本用戶手冊,下載鏈接為:調研:、經過調研:1.1 客戶除了使用USART做串口通信,還開啟了定時器中斷來進行數據采集.1.2 定時器的優先級比串口接收的優先級高.1.3 定時器
    發表于 09-27 16:01

    STM32 USART 串口 DMA 接收和發送的源碼詳解

    的,產生的條件是這樣的,當清除IDLE標志位后,必須有接收到第個數據后,才開始觸發,接收的數據斷流,沒有接收到數據,即產生IDLE
    發表于 08-22 14:21

    如何實現STM32 USART DMA發送中斷接收?

    如何實現STM32 USART DMA發送中斷接收?
    發表于 12-10 07:37

    詳解MCS-51單片機的中斷系統

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

    STM32單片機的USART接收數據問題解決方案

    先使用USART中斷函數接收數據,判斷是否接收到每幀數據的起始標記字符。如果接收到就關閉USART
    發表于 12-06 15:36 ?6271次閱讀

    詳解藍牙模塊原理與結構

    電子發燒友網站提供《詳解藍牙模塊原理與結構.pdf》資料免費下載
    發表于 11-26 16:40 ?94次下載

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

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

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

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

    STM32串口中斷卡死主循環直進中斷問題分析

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

    2021-04-16 STM32F103 USART 接收數據不進中斷 以及 進中斷后數據接收問題

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

    USART空閑中斷

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

    GD32E23x的USART被斷點打斷后重新運行,會直進入中斷的問題

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

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

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

    串口接收中斷--并不是說不使能串口接受中斷就無法接收數據

    并不是說不使能串口接受中斷就無法接收數據,只是為了在串口接收數據的時候防止其程序打擾串口數據的接收,所以跑到中斷中去
    發表于 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>數據

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

    使用中斷 通過配置串口的接收作為中斷源,開啟中斷輸出控制,配置NVIC。開啟中斷通道。 //開啟中斷
    的頭像 發表于 11-10 16:33 ?669次閱讀
    如何通過配置串口的<b class='flag-5'>接收</b>作為<b class='flag-5'>中斷</b>源
    简阳市| 百家乐官网国际娱乐城| 百家乐巴厘岛娱乐城| 百家乐官网赢钱皇冠| 水果机破解器多少钱| 百家乐出千赌具| 新澳博百家乐官网娱乐城| 天马娱乐城| 百家乐翻天| 诚信百家乐在线平台| 怎么看百家乐官网路单| 同乐城备用网址| 长赢百家乐赌徒| 澳门百家乐官网博牌| 锦州市| 赌场风云主题曲| 大发888开户注册| 百家乐直揽经验| 菲律宾百家乐太阳城| 百家乐官网是娱乐场| 百家乐官网遥控洗牌器| 百家乐官网在线直播| 宝龙线上娱乐城| TT娱乐城投注,| 大嘴棋牌手机版| 运城百家乐蓝盾| 百家乐楼梯缆大全| 属鸡和属猪做生意好吗| 百家乐官网凯时赌场娱乐网规则 | 皇冠投注網| 博彩e族字谜专区| 大发888游戏下载平台| 百家乐博彩破解论坛| 威尼斯人娱乐城真人百家乐| 五星百家乐的玩法技巧和规则 | 百家乐娱乐城有几家| 百家乐没有必胜| 百家乐机器二手| 做生意门口怎么摆放| 免费百家乐游戏机| 钱隆百家乐智能|