硬汉嵌入式论坛

 找回密码
 立即注册
查看: 312|回复: 3
收起左侧

STM32F4298+AD7606 DMA双缓冲读取!16*1024数据大部分都是零

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2024-3-26 16:53:21 | 显示全部楼层 |阅读模式
各位大哥请求帮助,程序参考的【STM32F429开发板用户手册】第36章 STM32F429的FMC总线应用之DMA双缓冲驱动AD7606(8通道同步采样, 16bit, 正负10V) - 安富莱电子 - 博客园 (cnblogs.com)

项目想通过STM32F4298+AD7606实现DMA双缓冲对AD7606其中的四个通道数据进行采集,每个通道采集1024个数据后进行一次FFT解算,现在有点迷惑,程序一方面说每次UP事件会触发一次DMA传输,连续读取总线地址上的AD数据。我理解的是每次DMA中断只读取了一次8通道结果,存入DMA缓冲区,下文说可以设置BUF的size从而实现数据采集和数据处理同时进行,当Bufsize半满时触发半满函数,全满触发DMA回调函数。

所以我将bufsize设置为16*1024,这样就可以8通道读取1024次数据后触发一下半满回调函数,16*1024后再触发DMA完成。

但是实际测试发现g_sAd7606Buf半满回调是只存储了8*几十个数据而已,DMA完成函数中的数据都是零。请问是我搞错了bufsize么,DMA缓冲的bufsize不是这个AD 7606_BUFSIZE么?
半满回调函数和DMA完成函数如下所示:

void AD7606_DmaHalfCplCb(DMA_HandleTypeDef *hdma)
{
uint32_t SourceData_0[SAMPLE_NUM]={0};//0-1-2-3分别表示DMA半满读取AD7606通道1-2-3-4
uint32_t SourceData_1[SAMPLE_NUM]={0};
uint32_t SourceData_2[SAMPLE_NUM]={0};
uint32_t SourceData_3[SAMPLE_NUM]={0};
uint32_t OutData_0[SAMPLE_NUM]={0};
uint32_t OutData_1[SAMPLE_NUM]={0};
uint32_t OutData_2[SAMPLE_NUM]={0};
uint32_t OutData_3[SAMPLE_NUM]={0};
        HalfReduDis++;
        if(HalfReduDis==40000000)HalfReduDis=1;//用于降低打印频次
       
        for(i = 0; i < 1024;i++)
        {
                SourceData_0 = (uint32_t)(g_sAd7606Buf[i * 8+ 0]);
                SourceData_1 = (uint32_t)(g_sAd7606Buf[i * 8+ 1]);
                SourceData_2 = (uint32_t)(g_sAd7606Buf[i * 8+ 2]);
                SourceData_3 = (uint32_t)(g_sAd7606Buf[i * 8+ 3]);
        }
        if(HalfReduDis%19==0)//降低打印频次
        {if(SourceData_0[80]==0&&SourceData_0[81]==0&&SourceData_0[82]==0){printf("SourceData_0[%d]=0\n",kf);}}

}

void AD7606_DmaCplCb(DMA_HandleTypeDef *hdma)
{
uint32_t SourceData_4[SAMPLE_NUM]={0};//4-5-6-7分别表示DMA溢满读取AD7606通道1-2-3-4
uint32_t SourceData_5[SAMPLE_NUM]={0};
uint32_t SourceData_6[SAMPLE_NUM]={0};
uint32_t SourceData_7[SAMPLE_NUM]={0};
uint32_t OutData_4[SAMPLE_NUM]={0};
uint32_t OutData_5[SAMPLE_NUM]={0};
uint32_t OutData_6[SAMPLE_NUM]={0};
uint32_t OutData_7[SAMPLE_NUM]={0};
        int16_t i;
        ReduDis++;
        if(ReduDis==40000000)ReduDis=1;
       
        for(i = 0; i < 1024; i++)
        {
               
                SourceData_4 = (uint32_t)(g_sAd7606Buf[(i + 1024) * 8+ 0]);
                SourceData_5 = (uint32_t)(g_sAd7606Buf[(i + 1024) * 8+ 1]);
                SourceData_6 = (uint32_t)(g_sAd7606Buf[(i + 1024) * 8+ 2]);
                SourceData_7 = (uint32_t)(g_sAd7606Buf[(i + 1024) * 8+ 3]);
        }
        if(ReduDis%19==0)//降低打印频次
        {if(SourceData_4[1]==0&&SourceData_4[2]==0&&SourceData_4[3]==0){printf("SourceData_4[%d]=0\n",kt);}}

}

期待各位兄弟姐妹的回复。谢谢!
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-3-26 16:56:21 | 显示全部楼层
         /* 初始化DMA */
        if(HAL_DMA_Init(&TIMDMA) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);     
        }
       
        /* 关联DMA句柄到TIM */
        //__HAL_LINKDMA(&TimHandle, hdma[TIM_DMA_ID_UPDATE], TIMDMA);       
       
        /* 配置DMA中断 */
        HAL_NVIC_SetPriority(TIMx_UP_DMA_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(TIMx_UP_DMA_IRQn);
       
        /* 注册半传输完成中断和传输完成中断 */
        HAL_DMA_RegisterCallback(&TIMDMA, HAL_DMA_XFER_CPLT_CB_ID, AD7606_DmaCplCb);
        HAL_DMA_RegisterCallback(&TIMDMA, HAL_DMA_XFER_HALFCPLT_CB_ID, AD7606_DmaHalfCplCb);
       
        /* 启动DMA传输 */
        HAL_DMA_Start_IT(&TIMDMA, (uint32_t)AD7606_BASE, (uint32_t)g_sAd7606Buf, AD7606_BUFSIZE);
        //这里就是数据传输的地方,AD7606_BASE是FMC总线地址,g_sAd7606BufAD数据存储位置
        //g_sAd7606Buf 是一个 int16_t 类型的数组,强制转换为 uint32_t 类型并不会改变数组的内容或长度,只是在传递给函数时,将数组的地址以 32 位整数的形式进行了传递
设置AD7606_BUFSIZE为16*1024
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-3-26 17:25:13 | 显示全部楼层
半满回调函数中
g_sAd7606Buf[10]=8691
g_sAd7606Buf[100]=8195
g_sAd7606Buf[500]=0
g_sAd7606Buf[1000]=0
g_sAd7606Buf[1024]=0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2024-3-27 09:46:00 | 显示全部楼层
方法是对的,应该是你的实现还点问题,查查是怎么回事。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 01:58 , Processed in 0.279443 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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