本帖最后由 scutsrg 于 2019-4-29 20:58 编辑
最近在使用多重ADC+DMA时出现了一个奇怪的BUG,ADC和DMA采集的数据很正常,是我想要的波形,但是一旦把DMA的缓存数据copy到另外数组的时候,就出错,具体如下:用串口来把ADC采样得到的数据发送出来,当串口收到任意东西时,就开启发送,其中adcx是储存AD转换数据的数组,也是DMA的内存目标,串口代码如下:
void USART1_IRQHandler(void)
{
u8 Res;
u16 i;
u16 j;
float a[512];
volatile float temp;
extern volatile u16 adcx[256][6];
#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
{
for(j=0;j<256;j++)
{
printf("%d
",adcx[j][0]);
}
TIM_Cmd(TIM2,ENABLE);
Res= USART_ReceiveData(USART1);
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
到这里一切正常,输出出来的就是我想要的ad数据,但是因为我要把adcx的部分数据提取出来做FFT,所以需要复制部分数据到另外的数组float a[512],所以又加了端代码在for的下边
先将adcx储存的u16数据转化成float,然后打印出来看是否正确,然后把数据转移到数组a,具体代码如下:
for(j=0;j<256;j++)
{
temp=(float)(adcx[j][0]);
printf("%d::%f
",j,temp);
a[j]
=temp ;
}
结果串口出来了乱码,不是我期望的数据
我以为是从u16到float的转换出现了错误,我就把a[j]=temp ;这一句注释掉,相当于代码如下
for(j=0;j<256;j++)
{
temp=(float)(adcx[j][0]);
printf("%d::%f
",j,temp);
//a[j]=temp ;
}
出来的结果就正常,依旧是正弦波,打印出来的也正常,打印出了完整的256个点
所以相当于是这样子的,AD采样没问题,DMA也没问题,数据也正常,数据类型转化也没问题,但是一旦把数据从adcx转移到另外的数组,就出现了错误,为什么?折腾一天了,跪求大神解答
float a[512];
extern volatile u16 adcx[256][6];
这都是局部变量
大兄弟真的6,就是堆栈溢出了,多谢
一周热门 更多>