本帖最后由 gurong60 于 2013-9-13 12:26 编辑
之前做了adc采集,用了定时中断,后来听坛子里大侠说用dma,我也改用dma
可是问题来了,我开了俩个dma,一个接收,一个固定发送,接收的dma中断里面搞了两个缓存选择,具体细节如附件这篇**
基于stm32的双缓冲的实现.zip
(216 KB)
而今出现了一个怪现象,dma中断正常,中断如下
void DMA1_Channel2_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!= RESET)
{
DMA_ClearFlag(DMA1_FLAG_TC2);
mark=0;
if( mark_R==0 )
{
// GPIO_SetBits(GPIOB, GPIO_Pin_8);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Rx0;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
mark_R=1;
for(i=0;i<32;i++)
{
adc_out_b[2*i]=(((SPI1_Buffer_Rx1[3*i])<<3)&0xf8)+(((SPI1_Buffer_Rx1[3*i+1])>>5)&0x07);
adc_out_b[2*i+1]=(((SPI1_Buffer_Rx1[3*i+1])<<3)&0xf8)+(((SPI1_Buffer_Rx1[3*i+2]>>5))&0x07);
}
}
else if( mark_R == 1 )
{
// GPIO_ResetBits(GPIOB, GPIO_Pin_8);
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Rx1;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
mark_R=0;
for(i=0;i<32;i++)
{
adc_out_a[2*i]=(((SPI1_Buffer_Rx0[3*i])<<3)&0xf8)+(((SPI1_Buffer_Rx0[3*i+1])>>5)&0x07);
adc_out_a[2*i+1]=(((SPI1_Buffer_Rx0[3*i+1])<<3)&0xf8)+(((SPI1_Buffer_Rx0[3*i+2]>>5))&0x07);
}
}
}
}
红色为我加的调试指示灯,结果是周期,稳定性,高低脉宽都正常,说明数据采集没有问题
但在主函数里面调试的指示灯就不正常,出现断续连接不上,usb接收到的数据用示波器看有丢数据,
可以肯定是数据发送没有跟得上
while(1)
{
while(mark==1);
mark=1;
if(mark_R==0)
{
GPIO_SetBits(GPIOB, GPIO_Pin_8);
USB_SIL_Write(EP1_IN, &adc_out_a[0],64);
}
else if(mark_R==1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
USB_SIL_Write(EP1_IN, &adc_out_b[0],64);
}
}
帮忙分析分析,采样率93k左右,16位ad,数据量应该是93k*2 目前分析到问题是USB数据发送导致主函数的判断出现间断性不连续 设置DMA中断优先级为最高,中断中调试GPIOB-9脚波形正常,主函数里面的GPIO-8脚的波形应该跟9脚一致,但是出现间断性不连续,USB发送一包的耗时最大应该在100us(根据USB bulk的传输,640k/s的数据没有问题,我在主函数里面循环发送最高可到718k/s,)DMA中断之间间隔为三百多us,USB发送中断不会影响DMA中断。根据usb的bulk的速度,我想采样率达到300k也应该没有问题,可现在不知道这个问题时在哪里 @香水城 @王紫豪 @airwill
|