硬汉嵌入式论坛

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

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

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 3 天前 | 显示全部楼层 |阅读模式
现在已经调通硅麦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

积分
116747
QQ
发表于 前天 08:01 | 显示全部楼层
优先屏蔽Cache影响,调用SCB_DisableDCache();关闭Cache。

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

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

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


微信截图_20250702104911.png

微信截图_20250702104839.png

微信截图_20250702105226.png

回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 前天 14:36 | 显示全部楼层


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

微信截图_20250702143519.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 18:39 , Processed in 0.307244 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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