打印

采用DMA从串口接收较大数据后DMA就被屏蔽了,为什么???

[复制链接]
3008|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zfm850722|  楼主 | 2009-10-19 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠好,
我的芯片是STM32F103ZC,
采用DMA从串口接收数据,配置成循环模式以及配置接收缓冲区大小为16字节,当接收满之后就在
中断处理函数中将数据取走,当传输几 K 数据时能正常接收,但是当数据大了之后(比如几百 K )
就会产生有时候能正常接收,有时候会出现 DMA 卡死的现象,也就是再也接收不到数据了,
查看寄存器的值发现 USART 的 DMA 接收使能位(DMAR)还是使能的,但是 DMA 的使能位就被清
除了,我在程序中初始化 DMA 并使能之后就再也没有再屏蔽过它,难道硬件遇到特殊情况下会自动
屏蔽 DMA 。于是查看参考手册的 DMA 错误管理,发现如果 DMA 产生传输错误时硬件会自动屏蔽
DMA,然后将错误标志位挂起。为了验证传输过程中是否产生了错误,于是打开了传输错误中断,
在调试过程中发现当DMA接收的数据不正确时确实进入了DMA错误中断,但是为什么会产生错误中
断呢???
继续查看手册,发现这是因为产生了总线错误。这个就很难明白了,我并没有对被保护的内存块进
行操作,为什么会产生总线错误呢??而且在调试 DMA 从 USART 接收数据的时候是有时候能正常
接收,而有时候就接收失败。
大侠帮我分析分析问题出在哪里啊??
先先谢谢了。
沙发
ST_ARM| | 2009-10-20 13:50 | 只看该作者
造成总线错误原因有很多,不一定是对保护的内存块进行操作产生总线错误。这个原因要根据你的整个系统来查看,你可以先将你的串口的接收程序独立出来,使用DMA接收数据,不做其他任何操作,再进行测试,看看是否出现同样的错误?

使用特权

评论回复
板凳
zfm850722|  楼主 | 2009-10-20 14:13 | 只看该作者
谢谢楼上的
按照你的方式我重新做了一遍,另外添加了DMA传输错误中断处理,在DMA传输错误中断处理函数中重新使能了DMA(因为在这个时候硬件会自动禁能DMA),然后清除错误中断标志位。但是添加了这些处理之后系统居然出现了 HardFault 异常。这是为什么啊???
好急啊,烦死了,DMA这个问题卡了差不多一个星期了。

使用特权

评论回复
地板
zfm850722|  楼主 | 2009-10-21 08:42 | 只看该作者
请大侠指点迷津

使用特权

评论回复
5
yybj| | 2009-10-21 10:57 | 只看该作者
为了避免这种现象,你是可以通过清错误标志位来解决的

使用特权

评论回复
6
香水城| | 2009-10-21 11:07 | 只看该作者
如果你的DMA缓冲区不是在片内的SRAM,而是使用FSMC扩展的RAM,则可能是碰到了FSMC的一个Bug,这个问题在ST发布的勘误手册中有描述。

使用特权

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

本版积分规则

10

主题

27

帖子

0

粉丝