打印

dma的缓冲区是否支持一边存储数据一边修改数据呢?

[复制链接]
1689|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzfbillie|  楼主 | 2013-5-17 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lzfbillie 于 2013-5-21 16:45 编辑

使用stm32 的芯片stm32f103RCT6
问题是这样的,我用usart+dma接收数据,缓冲区是Rxbuffer

当缓冲区不是0的时候,证明此时收到数据,开始对收到的数据进行处理,处理完了之后清0。
这样就变成了一边接收数据,一边处理,能提高效率。
但是现在出现了丢帧的情况,我想问问这个丢帧和我一边处理一边存储有关系吗?

dma是否支持一边存储一边修改数据呢?
【注】修改的数据肯定是存储之后的,也就是说修改的速度肯定比存储的慢

补充:其实可以用DMA的正常模式,先接收再处理数据,但是不知道为什么我的DMA只能启动一次,第二次启动不了,下面是我的代码
初始化部分:
#define USART2_RX_Address    0x40004404
u8  Rxbuffer[999]={0};

void DMA_Config(DMA_Channel_TypeDef* DMA1_Channelx,u32 cpar,u32 cmar,u16 cndtr,u32 config)
{
        DMAReset(DMA1_Channelx);//DMA复位
        DMA1_Channelx->CPAR=cpar;       //DMA1 外设地址
       DMA1_Channelx->CMAR=(u32)cmar;  //DMA1,存储器地址,DMA内存中的数据存到什么地方
       //DMA1_MEM_LEN=cndtr;       //保存DMA传输数据量
       DMA1_Channelx->CNDTR=cndtr;     //DMA1,传输数据量
               
        DMA1_Channelx->CCR|=config;
        DMA1_Channelx->CCR|=1;
}
调用该函数:DMA_Config(DMA1_Channel6,USART2_RX_Address,(u32)Rxbuffer,999,0x00003082);

第二次启动:
            DMA1_Channel6->CCR&=0xfffffffe;
            DMA1_Channel6->CPAR=0x40004404;
            DMA1_Channel6->CMAR=(u32)Rxbuffer;//需要重新设置内存地址
            Delay(5);
            DMA1_Channel6->CNDTR=600;
            Delay(5);
            DMA1_Channel6->CCR|=1;
            Delay(5);
沙发
lxyppc| | 2013-5-17 11:30 | 只看该作者
别这样设计,因为数据溢出时,你的程序感觉不到
DMA好像有个半满中断,可以考虑用这个来作

使用特权

评论回复
板凳
香水城| | 2013-5-17 16:52 | 只看该作者
LZ都没有说明使用的是ST的哪款芯片。

STM32Fx,有的芯片有DMA的双缓冲区呀~

使用特权

评论回复
地板
hawksabre| | 2013-5-17 19:14 | 只看该作者
型号很重要   不同的型号    堆栈不一样   楼主  建议将问题讲的清楚一点  

使用特权

评论回复
5
huangxz| | 2013-5-17 19:54 | 只看该作者
学习了

使用特权

评论回复
6
lzfbillie|  楼主 | 2013-5-21 16:40 | 只看该作者
香水城 发表于 2013-5-17 16:52
LZ都没有说明使用的是ST的哪款芯片。

STM32Fx,有的芯片有DMA的双缓冲区呀~

我用的芯片是stm32f103RCT6

使用特权

评论回复
7
hawksabre| | 2013-5-21 19:08 | 只看该作者
查一查  技术手册   应该有对应的解决方法  这个问题不大   仔细研究研究技术手册   相信自己

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝