OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3451|回复: 3

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

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-23
在线时间
4 小时
发表于 2019-4-29 20:45:52 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 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\r\n",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\r\n",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\r\n",j,temp);
        //a[j]=temp ;
}

出来的结果就正常,依旧是正弦波,打印出来的也正常,打印出了完整的256个点
ad4.png ad3.png

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



最佳答案

查看完整内容[请看2#楼]

你这种现象很可能是栈溢出了,你去查下.s文件中你分配的stack的大小是多少,还有函数内不建议定义大数组,改成全局静态变量不是更好分析些。 float a[512]; extern volatile u16 adcx[256][6]; 这都是局部变量
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2019-4-29 20:45:53 | 显示全部楼层
你这种现象很可能是栈溢出了,你去查下.s文件中你分配的stack的大小是多少,还有函数内不建议定义大数组,改成全局静态变量不是更好分析些。
float a[512];
extern volatile u16 adcx[256][6];
这都是局部变量
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-4-30 01:21:29 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-23
在线时间
4 小时
 楼主| 发表于 2019-4-30 17:10:23 | 显示全部楼层
zc123 发表于 2019-4-30 13:54
你这种现象很可能是栈溢出了,你去查下.s文件中你分配的stack的大小是多少,还有函数内不建议定义大数组, ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表