各位大侠好,
我的芯片是STM32F103ZC,
采用DMA从串口接收数据,配置成循环模式以及配置接收缓冲区大小为16字节,当接收满之后就在
中断处理函数中将数据取走,当传输几 K 数据时能正常接收,但是当数据大了之后(比如几百 K )
就会产生有时候能正常接收,有时候会出现 DMA 卡死的现象,也就是再也接收不到数据了,
查看寄存器的值发现 USART 的 DMA 接收使能位(DMAR)还是使能的,但是 DMA 的使能位就被清
除了,我在程序中初始化 DMA 并使能之后就再也没有再屏蔽过它,难道硬件遇到特殊情况下会自动
屏蔽 DMA 。于是查看参考手册的 DMA 错误管理,发现如果 DMA 产生传输错误时硬件会自动屏蔽
DMA,然后将错误标志位挂起。为了验证传输过程中是否产生了错误,于是打开了传输错误中断,
在调试过程中发现当DMA接收的数据不正确时确实进入了DMA错误中断,但是为什么会产生错误中
断呢???
继续查看手册,发现这是因为产生了总线错误。这个就很难明白了,我并没有对被保护的内存块进
行操作,为什么会产生总线错误呢??而且在调试 DMA 从 USART 接收数据的时候是有时候能正常
接收,而有时候就接收失败。
大侠帮我分析分析问题出在哪里啊??
先先谢谢了。
造成总线错误原因有很多,不一定是对保护的内存块进行操作产生总线错误。这个原因要根据你的整个系统来查看,你可以先将你的串口的接收程序独立出来,使用DMA接收数据,不做其他任何操作,再进行测试,看看是否出现同样的错误?
谢谢楼上的
按照你的方式我重新做了一遍,另外添加了DMA传输错误中断处理,在DMA传输错误中断处理函数中重新使能了DMA(因为在这个时候硬件会自动禁能DMA),然后清除错误中断标志位。但是添加了这些处理之后系统居然出现了 HardFault 异常。这是为什么啊???
好急啊,烦死了,DMA这个问题卡了差不多一个星期了。
为了避免这种现象,你是可以通过清错误标志位来解决的
如果你的DMA缓冲区不是在片内的SRAM,而是使用FSMC扩展的RAM,则可能是碰到了FSMC的一个Bug,这个问题在ST发布的勘误手册中有描述。