STM32串口DMA接收出现ORE错误

1.事件背景

STM32中,使用USART配合DMA进行接收, 以标准库为例

//USART初始化

Void  Usart_Init(void)

{

        RCC_APB1PeriphClockCmd();//开启对应时钟

        RCC_APB2PeriphClockCmd();//开启对应时钟

        GPIO_Init();  //配置GPIO

        USART_Init();  //配置USART

        USART_ITConfig();  //配置中断

        USART_Cmd(USART1,ENABLE);//  使能USART,CR寄存器的UE位

}

//DMA初始化

Void  UsartRecDma_Init(void)

{

        RCC_APB1PeriphClockCmd();//开启对应时钟

        RCC_APB2PeriphClockCmd();//开启对应时钟

        DMA_Init();  //初始化DMA

        USART_DMACmd();  //USART和DMA链接

        DMA_ITConfig();  //配置中断

        DMA_Cmd();    //使能DMA

}

//主函数

Void main(void)

{

        Usart_Init();

        UsartRecDma_Init();

}

当Usart_Init()执行完后,外部设备向STM32的该串口发送一串字符,发送字符完成后再执行UsartRecDma_Init(),则导致STM32串口模块死机,且串口后续无法正常接收数据。

2.原因分析

STM32出现ORE过载错误,即USART_SR寄存器的ORE寄存器被置为1

3.解决方案

方案1:调整初始化顺序,USART的CR寄存器UE位开关留到最后打开,即完成USART和DMA的所有配置初始化后再使能USART。

//USART初始化

Void  Usart_Init(void)

{

        RCC_APB1PeriphClockCmd();//开启对应时钟

        RCC_APB2PeriphClockCmd();//开启对应时钟

        GPIO_Init();  //配置GPIO

        USART_Init();  //配置USART

        USART_ITConfig();  //配置中断

        USART_Cmd(USART1,DISABLE);//  关闭USART

}

//DMA初始化

Void  UsartRecDma_Init(void)

{

        RCC_APB1PeriphClockCmd();//开启对应时钟

        RCC_APB2PeriphClockCmd();//开启对应时钟

        DMA_Init();  //初始化DMA

        USART_DMACmd();  //USART和DMA链接

        DMA_ITConfig();  //配置中断

        DMA_Cmd();    //使能DMA

        USART_Cmd(USART1,ENABLE);//  使能USART,CR寄存器的UE位

}

//主函数

Void main(void)

{

        Usart_Init();

        UsartRecDma_Init();

}

方案2:定期检测ORE溢出错误,当出现ORE时通过读取寄存器,清空ORE标志。

//主函数

__IO  u16  reg = 0;

Void main(void)

{

        Usart_Init();

        UsartRecDma_Init();

        While(1)

        {

                if(0x08 == (USART1->SR & 0x08))

                {

                        reg = USART1->SR;

                        reg = USART1->DR;

                }

        }

}

方案3:在串口和DMA初始化的过程中,避免接收数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值