新手入门
积分 7
金钱 7
注册时间 2017-9-12
在线时间 8 小时
17 金钱
如题:
我使用STM32F4的DFSDM功能,采集MP34DT02芯片的声源数据,设置如下:
[mw_shl_code=c,true]
void MX_DFSDM1_Init(void)
{
hdfsdm1_filter0.Instance = DFSDM1_Filter0;
hdfsdm1_filter0.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
hdfsdm1_filter0.Init.RegularParam.FastMode = ENABLE;
hdfsdm1_filter0.Init.RegularParam.DmaMode = ENABLE;
hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
hdfsdm1_filter0.Init.FilterParam.Oversampling = 64;
hdfsdm1_filter0.Init.FilterParam.IntOversampling = 1;
if (HAL_DFSDM_FilterInit(&hdfsdm1_filter0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
hdfsdm1_channel3.Instance = DFSDM1_Channel3;
hdfsdm1_channel3.Init.OutputClock.Activation = ENABLE;
hdfsdm1_channel3.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
hdfsdm1_channel3.Init.OutputClock.Divider = 4;
hdfsdm1_channel3.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
hdfsdm1_channel3.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
hdfsdm1_channel3.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
hdfsdm1_channel3.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
hdfsdm1_channel3.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
hdfsdm1_channel3.Init.Awd.FilterOrder = DFSDM_CHANNEL_FASTSINC_ORDER;
hdfsdm1_channel3.Init.Awd.Oversampling = 1;
hdfsdm1_channel3.Init.Offset = 0;
hdfsdm1_channel3.Init.RightBitShift = 0x00;
if (HAL_DFSDM_ChannelInit(&hdfsdm1_channel3) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
if (HAL_DFSDM_FilterConfigRegChannel(&hdfsdm1_filter0, DFSDM_CHANNEL_3, DFSDM_CONTINUOUS_CONV_ON) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
[/mw_shl_code]
设置为24位数据采样,但是设置DMA的时候却需要设置位16位数据宽度,才可以正常采集PCM数据,使用32位数据宽度,数据不正常,这是什么原因呢?
DMA代码如下:
[mw_shl_code=c,true] hdma_dfsdm1_flt0.Instance = DMA1_Channel4;
hdma_dfsdm1_flt0.Init.Request = DMA_REQUEST_0;
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_WORD;
hdma_dfsdm1_flt0.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_dfsdm1_flt0.Init.Mode = DMA_CIRCULAR;
hdma_dfsdm1_flt0.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_dfsdm1_flt0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/* Several peripheral DMA handle pointers point to the same DMA handle.
Be aware that there is only one channel to perform all the requested DMAs. */
__HAL_LINKDMA(dfsdm_filterHandle,hdmaInj,hdma_dfsdm1_flt0);
__HAL_LINKDMA(dfsdm_filterHandle,hdmaReg,hdma_dfsdm1_flt0);
}[/mw_shl_code]
完整代码如果需要,可以私信我一下,这是一个STM32的录音程序,利用MP34DT02TR音频芯片进行录音
我来回答