|
现在已经调通硅麦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这个参数不知道哪来的,我没赋值
|
|