各位大侠好,
我的芯片是STM32F103ZC,
采用DMA从串口接收数据,配置成循环模式以及配置接收缓冲区大小为16字节,当接收满之后就在
中断处理函数中将数据取走,当传输几 K 数据时能正常接收,但是当数据大了之后(比如几百 K )
就会产生有时候能正常接收,有时候会出现 DMA 卡死的现象,也就是再也接收不到数据了,
查看寄存器的值发现 USART 的 DMA 接收使能位(DMAR)还是使能的,但是 DMA 的使能位就被清
除了,我在程序中初始化 DMA 并使能之后就再也没有再屏蔽过它,难道硬件遇到特殊情况下会自动
屏蔽 DMA 。于是查看参考手册的 DMA 错误管理,发现如果 DMA 产生传输错误时硬件会自动屏蔽
DMA,然后将错误标志位挂起。为了验证传输过程中是否产生了错误,于是打开了传输错误中断,
在调试过程中发现当DMA接收的数据不正确时确实进入了DMA错误中断,但是为什么会产生错误中
断呢???
继续查看手册,发现这是因为产生了总线错误。这个就很难明白了,我并没有对被保护的内存块进
行操作,为什么会产生总线错误呢??而且在调试 DMA 从 USART 接收数据的时候是有时候能正常
接收,而有时候就接收失败。
大侠帮我分析分析问题出在哪里啊??
先先谢谢了。 |