本帖最后由 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); |