硬汉嵌入式论坛

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

[DFSDM] 使用H743的DFSDM+DMA采集IMD73D122硅麦PDM数据

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2025-7-1 17:46:11 | 显示全部楼层 |阅读模式
现在已经调通硅麦CLK和DATA线,H743程序也配置了DMA,使用DMA循环模式,中断正常可以触发。
当前问题:
当使用HAL_DFSDM_FilterRegularMsbStart_DMA()函数开启采集,DMA数据只有第1个字节有变化,其余为0;
当使用HAL_DFSDM_FilterRegularStart_DMA()函数开启采集,DMA数据全为0;
以上两个函数均可以进入到DMA半完成中断和全完成中断回调。

请问原因为何?

以下为代码:----------------------------------------------------------------------------------------------------------------------------
int16_t Buf_Mic0[4096] __attribute__((section(".ARM.__at_0x30020000")));DMA搬运音频数据存放的位置。RAM3.


void Start_Audio_Collection(void)//开启采集
{       
        HAL_DFSDM_FilterRegularMsbStart_DMA(&haudio_in_dfsdm_filter,Buf_Mic0,4096);//这个函数只能读16bit,想读其余bit用不带Msb的此函数
        //HAL_DFSDM_FilterRegularStart_DMA(&haudio_in_dfsdm_filter,Buf_Mic0,4096);
       
}


中断回调:

void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)//半完成
{
        Set_Audio_Half_DMA_Finish(Now_TimeStampMS());
        __HAL_DMA_CLEAR_FLAG(&hdma_dfsdm1_flt0,DMA_IT_DME);//清除DMA直接模式错误标记
        __HAL_DMA_CLEAR_FLAG(&hdma_dfsdm1_flt0,DMA_IT_TE);//清除DMA传输错误标记
        __HAL_DMA_ENABLE_IT(&hdma_dfsdm1_flt0,DMA_IT_HT);//开启DMA半传输中断
        __HAL_DMA_ENABLE(&hdma_dfsdm1_flt0);       
}

void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)//全完成
{
        Set_Audio_Full_DMA_Finish(Now_TimeStampMS());
        __HAL_DMA_CLEAR_FLAG(&hdma_dfsdm1_flt0,DMA_IT_DME);//清除直接模式错误标记
        __HAL_DMA_CLEAR_FLAG(&hdma_dfsdm1_flt0,DMA_IT_TE);//清除传输错误标记
        __HAL_DMA_ENABLE_IT(&hdma_dfsdm1_flt0,DMA_IT_TC);//开启DMA传输完成中断
        __HAL_DMA_ENABLE(&hdma_dfsdm1_flt0);
}


DFSDM_Filter配置:
{

  hDfsdmFilter->Instance                                  = DFSDM1_Filter0;
  hDfsdmFilter->Init.RegularParam.Trigger          = DFSDM_FILTER_SW_TRIGGER;
  hDfsdmFilter->Init.RegularParam.FastMode       = ENABLE;
  hDfsdmFilter->Init.RegularParam.DmaMode         = ENABLE;
  hDfsdmFilter->Init.InjectedParam.DmaMode        = DISABLE;
  hDfsdmFilter->Init.FilterParam.SincOrder        = DFSDM_FILTER_SINC4_ORDER;
  hDfsdmFilter->Init.FilterParam.Oversampling     = 128;
  hDfsdmFilter->Init.FilterParam.IntOversampling  = 1;

}

DFSDM_Channel配置:
{

  hDfsdmChannel->Instance                      = DFSDM1_Channel0;
  hDfsdmChannel->Init.OutputClock.Activation   = ENABLE;
  hDfsdmChannel->Init.OutputClock.Selection    = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
  hDfsdmChannel->Init.OutputClock.Divider      = 64;
  hDfsdmChannel->Init.Input.Multiplexer        = DFSDM_CHANNEL_EXTERNAL_INPUTS;
  hDfsdmChannel->Init.Input.DataPacking        = DFSDM_CHANNEL_STANDARD_MODE;
  hDfsdmChannel->Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
  hDfsdmChannel->Init.Awd.FilterOrder          = DFSDM_CHANNEL_FASTSINC_ORDER;
  hDfsdmChannel->Init.Awd.Oversampling         = 1;
  hDfsdmChannel->Init.Offset                   = 0;
  hDfsdmChannel->Init.RightBitShift            = 0x00;//default0x05
  hDfsdmChannel->Init.Input.Pins               = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
  hDfsdmChannel->Init.SerialInterface.Type     = DFSDM_CHANNEL_SPI_RISING;

}

Filter和Channel关联配置:
HAL_DFSDM_FilterConfigRegChannel(hDfsdmFilter, DFSDM_CHANNEL_0, DFSDM_CONTINUOUS_CONV_ON);

DMA配置:
{
  hdma_dfsdm1_flt0.Instance = DMA1_Stream0;

  hdma_dfsdm1_flt0.Init.Request = DMA_REQUEST_DFSDM1_FLT0;
  hdma_dfsdm1_flt0.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_dfsdm1_flt0.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_dfsdm1_flt0.Init.MemInc = DMA_MINC_ENABLE;
  hdma_dfsdm1_flt0.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  hdma_dfsdm1_flt0.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  hdma_dfsdm1_flt0.Init.Mode = DMA_CIRCULAR;
  hdma_dfsdm1_flt0.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  hdma_dfsdm1_flt0.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

}


Link函数:
__HAL_LINKDMA(hdfsdm_filter,hdmaReg,hdma_dfsdm1_flt0);//这里面hdmaReg这个参数不知道哪来的,我没赋值
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-2 08:01:44 | 显示全部楼层
优先屏蔽Cache影响,调用SCB_DisableDCache();关闭Cache。

然后看map文件,确定你的Buf_Mic0分配到RAM3了
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-2 10:54:53 | 显示全部楼层
已经关闭Cache。
查看map文件和debug模式memory监测也已经确保Buf_Mic0分配到RAM3了。


微信截图_20250702104911.png

微信截图_20250702104839.png

微信截图_20250702105226.png

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-2 14:36:30 | 显示全部楼层


跟我设置MPU这一段有关系吗?
我对MPU设置这一段具体有何作用目前还不太清楚。

微信截图_20250702143519.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-3 08:49:02 | 显示全部楼层
DDDEAD 发表于 2025-7-2 14:36
跟我设置MPU这一段有关系吗?
我对MPU设置这一段具体有何作用目前还不太清楚。

这个地方不影响,还有个地方可以看下,调试状态全速运行,看下DMA的NDTR传输个数寄存器动态变化不,也就是一直在搬运处理了没
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-8 14:03:21 | 显示全部楼层
本帖最后由 DDDEAD 于 2025-7-8 18:03 编辑
eric2013 发表于 2025-7-3 08:49
这个地方不影响,还有个地方可以看下,调试状态全速运行,看下DMA的NDTR传输个数寄存器动态变化不,也就 ...

1.png


嗯 有在动态变化。我觉得DMA这里没问题。

-----------------------------------------------------------------------------------------------------------------------------------------
目前矛头我指向了DFSDM的CHCFC3R1这一个寄存器,一直都是0x0000FFFF和0x00000001切换;
以及DFSDM3_RDATAR这个寄存器,我配的是DFSDM1_Channel0,但不知道为什么这个DFSDM3反而一直在变。
2.png
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-8 17:55:40 | 显示全部楼层
本帖最后由 DDDEAD 于 2025-7-8 18:04 编辑

3.png 4.png

目前看感觉是这里的问题,DFSDM0_ISR里面的REOCF没有置1,只有置1,RDATAR这个寄存器里的值才会表示有效,DMA才会搬运。

DMA循环的话因为是靠计数来统计half或full,所以它搬第一个字节之后还能继续搬无效的0。
然后在循环half或full的时候,进了中断给REOCF置1,然后DMA读1字节之后(我这里DMA配置的是2字节,但一直只能读出1字节,挠头),REOCF清0,后续也没有再置1.

我再研究研究。



回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-8 17:59:06 | 显示全部楼层


手册也说了用MSB这个函数读会REOFC清0.

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-7-9 10:50:58 | 显示全部楼层
破案了,把DMA时钟使能放到这一堆初始化之前就好了。
直接用CUBEMAX生成的话DMA时钟使能在初始化之后。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-10 08:11:55 | 显示全部楼层
DDDEAD 发表于 2025-7-9 10:50
破案了,把DMA时钟使能放到这一堆初始化之前就好了。
直接用CUBEMAX生成的话DMA时钟使能在初始化之后。

谢谢告知最终原因
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 05:59 , Processed in 0.054646 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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