从DMA缓存数组复制数据出来时出错

2019-07-20 02:14发布

本帖最后由 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 ;
}
结果串口出来了乱码,不是我期望的数据

ad1.png ad2.png


我以为是从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个点
ad4.png ad3.png

所以相当于是这样子的,AD采样没问题,DMA也没问题,数据也正常,数据类型转化也没问题,但是一旦把数据从adcx转移到另外的数组,就出现了错误,为什么?折腾一天了,跪求大神解答



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zc123
1楼-- · 2019-07-20 03:12
你这种现象很可能是栈溢出了,你去查下.s文件中你分配的stack的大小是多少,还有函数内不建议定义大数组,改成全局静态变量不是更好分析些。
float a[512];
extern volatile u16 adcx[256][6];
这都是局部变量
正点原子
2楼-- · 2019-07-20 09:12
 精彩回答 2  元偷偷看……
scutsrg
3楼-- · 2019-07-20 12:23
zc123 发表于 2019-4-30 13:54
你这种现象很可能是栈溢出了,你去查下.s文件中你分配的stack的大小是多少,还有函数内不建议定义大数组, ...

大兄弟真的6,就是堆栈溢出了,多谢

一周热门 更多>