打印
[STM32F4]

如何消除串口接收溢出(ORE)中断造成的假死机?

[复制链接]
4867|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2017-9-15 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F407系统,软件有向FLASH写数据的要求,在操作FLASH期间串口有数据接收,由于不能及时读取串口接收数据而发生ORE中断从而导致假死机,本人在操作FLASH函数中有如下做法:
void FlashPageWrite(Uint32 SectorNum,Uint32 *SourceBuf,Uint32 Len)
{
        Uint32 Cnt = 0;
        __disable_irq() ;                                                                                                                                 //关闭总中断
        FLASH_Unlock();
        FlashSectorErase(SectorNum<<3);
        for(Cnt = 0;Cnt < Len;Cnt++)
        {
                FLASH_ProgramWord(FlashAddressTab[SectorNum]+Cnt*4,*(SourceBuf+Cnt));
                if(*(Uint32 *)(FlashAddressTab[SectorNum]+Cnt*4) != *(SourceBuf+Cnt))
                {
                        break;
                }
        }
        FLASH_Lock();
       
        USART_ClearITPendingBit(USART6,USART_IT_ORE);                                                                        //清除ORE中断
        Cnt = USART_ReceiveData(USART6);
        __enable_irq() ;                                                                                                                                 //使能总中断
}

以上做法在DEBUG状态下全速运行,能够解决问题,但是脱离仿真器就不能有效避免ORE中断的影响,这是为什么?
有没有更好的方法解决这个问题?谢谢!!!
沙发
feelhyq| | 2017-9-15 14:05 | 只看该作者
开辟一段缓存,也就是建立一个数组,数据来了后产生中断,利用中断将接收到的数据放入数组中就行了。  不要利用查询的方式,利用中断

使用特权

评论回复
板凳
mmuuss586| | 2017-9-15 14:17 | 只看该作者
1、中断程序里,清除相关中断寄存器;
2、读写FLASH数据时间,尽量降低,可以把1组数据分断读写;

使用特权

评论回复
地板
airwill| | 2017-9-16 07:16 | 只看该作者
由于 MCU 在写 FLASH 的时候, 会有暂停 FLASH 的读操作, 除了使用缓冲和 DMA 方式外, 你可以考虑串口通信通过握手协议来解决

使用特权

评论回复
5
huotou| | 2017-9-16 07:57 | 只看该作者
1.在串口中断里加入判断是否有溢出标志位,调用USART_GetFlagStatus()不要调用USART_GetITStatus()函数
2.如有过载溢出标志位,清溢出标志位,可通过如下语句:
(void)USARTx->SR;
(vois)USARTx->DR; //先读SR再读DR寄存器

长期测试,基本很稳定

使用特权

评论回复
6
yzzly|  楼主 | 2017-9-16 09:39 | 只看该作者
本帖最后由 yzzly 于 2017-9-16 09:42 编辑

我的写FLASH问题,目前的做法基本能够解决问题!由于串口连接的485总线每隔150毫秒就有一包数据,虽然在串口中断函数内有:
if(USART_GetFlagStatus(USART6,USART_FLAG_ORE))
{
        USART_ClearITPendingBit(USART6,USART_IT_ORE);
        RxdData = USART_ReceiveData(USART6);
}
语句,但是感觉不可靠,一旦出现死机USART6->SR=0xF8并且进入“HardFault_Handler”状态。

使用特权

评论回复
7
kingkits| | 2017-9-19 17:42 | 只看该作者
你在
HardFault_Handler里处理串口错误,再强制中断返回试一试

使用特权

评论回复
8
wuhuikai| | 2017-9-19 18:14 | 只看该作者
把cr3的eie禁止,那样ore禁止中断

使用特权

评论回复
9
runningwzf| | 2017-9-19 21:03 | 只看该作者
5楼的正解
大家最好去看一下ST的局限性文档说明

使用特权

评论回复
10
IICeeprom| | 2017-9-21 11:16 | 只看该作者
这个只是接收中断里没有做好清除状态位吧,如果是和写Flash冲突,就看二楼所说,建立一个二级缓存,专门用来存放串口过来的数据,这样不影响你的接收问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

1178

帖子

3

粉丝