中级会员
 
- 积分
- 273
- 金钱
- 273
- 注册时间
- 2017-7-19
- 在线时间
- 89 小时
|
2金钱
定时器触发ADC,用DMA来传输,采样频率比较高40KHz,一次传输的数据有几百个。DMA传输完成的中断来后我马上用memcpy拷贝到缓存数组里,但对比两边的数据发现都不一样(这是Debug里用断点运行一次的结果)
能不能手动触发DMA传输?等拷贝完数据后再启用DMA??
另外,DMA是等ADC完成转换后再传输这个新数据,还是未转换完也继续传输(这样可能会传相同的数据)。
[mw_shl_code=c,true]DMA_initstructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_ADDR;//ADC1的DR寄存器地址为外设基地址
DMA_initstructure.DMA_MemoryBaseAddr = (u32)adc_dat; //数组首地址为内存基地址
DMA_initstructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设传进内存
DMA_initstructure.DMA_BufferSize = N;
DMA_initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不递增
DMA_initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增
DMA_initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//ADC传数据是12位,按半字(16bit)处理
DMA_initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //传来的数据也按半字来存
DMA_initstructure.DMA_Mode = DMA_Mode_Circular; //进行循环传输,当传输完规定数量的数据后,BufferSize重置,MemoryBaseAddr变回数组首地址
DMA_initstructure.DMA_Priority = DMA_Priority_High;//优先级高
DMA_initstructure.DMA_M2M = DMA_M2M_Disable; //不进行内存到内存传输
DMA_Init(DMA1_Channel1,&DMA_initstructure); //ADC1是通道1的
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//设置DMA1通道1的传输完成中断
DMA_ClearFlag(DMA1_FLAG_TC1); //清除一下中断标志
DMA_ClearITPendingBit(DMA1_IT_TC1);[/mw_shl_code]
|
|