stm32f407 uart + dma高频率一段时间后不接收,假死,但MCU工作正常的BUG
使用场景及情况
- 硬件:stm32f407
- 使用CUsart类进行实例化该串口(这个类是前辈写的)
- 声明一个uint8_t的数组,长度比实际收到的值要大一点(对象实例的时候用到)
- 例如测试程序里面的长度是5,我实际发送的是1个字节
- 用普通的串口工具发送,波特率等等都是对的情况下,连续发送,间隔为20ms, 过几秒, 该usart挂掉了,收不到数据了,而且我的判断是,收到0xAA, 就回复0x05, 0x04, 0x03, 0x02, 0x01,结果收不到回复,但是407还在继续工作,我在收到的判断后面通过udp抛出收到的字节,开始收得到,后面也不行了。
- 数组的地址给到DMA的地址寄存器,数组的长度给到NDTR传输数目寄存器。
- 综合判断该串口挂掉了,具体原因开始查。
change1
- 将数组长度改为20,其他条件不变,连续发送,不挂。
- 但是发现了奇怪的地方
change2
- 保持change1条件,更改发送时间间隔为10ms,usart挂掉。
阅读手册1
- 软件优先级,可以给陀螺仪的优先级高一点。
- 重新使能数据流的时候,应该将所有的中断状态寄存器中的位为1的置0
寄存器打印
- 对应的寄存器的位,是半传输中断标志
- 继续狂发,发现如下
示波器观察
- 已经排除IC的问题,用示波器在407和IC之间的RX线上,发现有数据,但是NTDR寄存器以然不递减,各个EN位重新使能进行数据流再次更新,但是无数据
打印USART6-DR
- 打印DR寄存器,发现数据在死掉的时候是不变的
- 如果我发送AA,没有问题,因为这时候我的测试程序还要进行发送,还要用到DR(20ms也不会死掉了),但是不发AA,即我的程序不返回,用到TX,那么程序还是会死掉。
bug解决
- 读完SR再读DR,无论发什么都可以了
阅读手册2
- 我们并没有对这个DMAR位软件清零