cancel
Showing results for 
Search instead for 
Did you mean: 

Changing filter and channel properties during the run

lFurm.1
Associate II

Hi,

I'm using DFSDM on NUCLEO-L476RG, the DFSDM configured as follows:

static void MX_DFSDM1_Init(void)
{
 
  /* USER CODE BEGIN DFSDM1_Init 0 */
 
  /* USER CODE END DFSDM1_Init 0 */
 
  /* USER CODE BEGIN DFSDM1_Init 1 */
 
  /* USER CODE END DFSDM1_Init 1 */
  hdfsdm1_filter0.Instance = DFSDM1_Filter0;
  hdfsdm1_filter0.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
  hdfsdm1_filter0.Init.RegularParam.FastMode = DISABLE;
  hdfsdm1_filter0.Init.RegularParam.DmaMode = ENABLE;
  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC2_ORDER;
  hdfsdm1_filter0.Init.FilterParam.Oversampling = 500;
  hdfsdm1_filter0.Init.FilterParam.IntOversampling = 100;
  if (HAL_DFSDM_FilterInit(&hdfsdm1_filter0) != HAL_OK)
  {
    Error_Handler();
  }
  hdfsdm1_channel0.Instance = DFSDM1_Channel0;
  hdfsdm1_channel0.Init.OutputClock.Activation = DISABLE;
  hdfsdm1_channel0.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM;
  hdfsdm1_channel0.Init.OutputClock.Divider = 2;
  hdfsdm1_channel0.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
  hdfsdm1_channel0.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
  hdfsdm1_channel0.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
  hdfsdm1_channel0.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
  hdfsdm1_channel0.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
  hdfsdm1_channel0.Init.Awd.FilterOrder = DFSDM_CHANNEL_FASTSINC_ORDER;
  hdfsdm1_channel0.Init.Awd.Oversampling = 1;
  hdfsdm1_channel0.Init.Offset = 0;
  hdfsdm1_channel0.Init.RightBitShift = 2;
  if (HAL_DFSDM_ChannelInit(&hdfsdm1_channel0) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_DFSDM_FilterConfigRegChannel(&hdfsdm1_filter0, DFSDM_CHANNEL_0, DFSDM_CONTINUOUS_CONV_ON) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DFSDM1_Init 2 */
 
  /* USER CODE END DFSDM1_Init 2 */
 
}

I need to change the filter and channel parameters based on some events (for evaluation, I'm using the blue button as that event).

from what i understand, the correct way to do so is:

  1. Stop DFSDM (in my case DMA)
  2. Deinit filter
  3. Deinit channel
  4. configure filter
  5. init filter
  6. configure channel
  7. init channel
  8. HAL_DFSDM_FilterConfigRegChannel
  9. HAL_DFSDM_FilterRegularStart_DMA

I'm using the following code for that:

	if (HAL_DFSDM_FilterRegularStop_DMA(&hdfsdm1_filter0) != HAL_OK)
	  {
	    Error_Handler();
	  }
 
	while (HAL_DFSDM_ChannelGetState(&hdfsdm1_channel0) != HAL_DFSDM_CHANNEL_STATE_READY);
 
	if (HAL_DFSDM_ChannelDeInit(&hdfsdm1_channel0) != HAL_OK)
	  {
	    Error_Handler();
	  }
 
 
	if (HAL_DFSDM_FilterDeInit(&hdfsdm1_filter0) != HAL_OK)
	  {
	    Error_Handler();
	  }
	  hdfsdm1_filter0.Instance = DFSDM1_Filter0;
	  hdfsdm1_filter0.Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
	  hdfsdm1_filter0.Init.RegularParam.FastMode = DISABLE;
	  hdfsdm1_filter0.Init.RegularParam.DmaMode = DISABLE;
	  if (ford==1)
		  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC1_ORDER;
	  else if (ford==2)
	  	  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC2_ORDER;
	  else if (ford==3)
		  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC3_ORDER;
	  else if (ford==4)
	  	  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC4_ORDER;
	  else if (ford==5)
	  	  hdfsdm1_filter0.Init.FilterParam.SincOrder = DFSDM_FILTER_SINC5_ORDER;
	  hdfsdm1_filter0.Init.FilterParam.Oversampling = fosr;
	  hdfsdm1_filter0.Init.FilterParam.IntOversampling = iosr;
	  if (HAL_DFSDM_FilterInit(&hdfsdm1_filter0) != HAL_OK)
	  {
	    Error_Handler();
	  }
	  hdfsdm1_channel0.Instance = DFSDM1_Channel0;
	  hdfsdm1_channel0.Init.OutputClock.Activation = DISABLE;
	  hdfsdm1_channel0.Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM;
	  hdfsdm1_channel0.Init.OutputClock.Divider = 2;
	  hdfsdm1_channel0.Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
	  hdfsdm1_channel0.Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
	  hdfsdm1_channel0.Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
	  hdfsdm1_channel0.Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
	  hdfsdm1_channel0.Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL;
	  hdfsdm1_channel0.Init.Awd.FilterOrder = DFSDM_CHANNEL_FASTSINC_ORDER;
	  hdfsdm1_channel0.Init.Awd.Oversampling = 1;
	  hdfsdm1_channel0.Init.Offset = 0;
	  hdfsdm1_channel0.Init.RightBitShift = rShif;
 
	  if (HAL_DFSDM_ChannelInit(&hdfsdm1_channel0) != HAL_OK)
	  {
	    Error_Handler();
	  }
	  if (HAL_DFSDM_FilterConfigRegChannel(&hdfsdm1_filter0, DFSDM_CHANNEL_0, DFSDM_CONTINUOUS_CONV_ON) != HAL_OK)
	  {
	    Error_Handler();
	  }
 
 
	  if (HAL_DFSDM_FilterRegularStart_DMA(&hdfsdm1_filter0,dda, 10) != HAL_OK)
		  {
		    Error_Handler();
		  }

No matter what I try, ChannelDeInit returns HAL_ERROR.

During debugging, i've noticed that the channel instance changes with each interrupt, and then the ChannelDeInit doesn't "recognize" the channel.

Can you help please with how to solve this?

This discussion is locked. Please start a new topic to ask your question.
1 REPLY 1
lFurm.1
Associate II

Can someone help with it please?

@Imen DAHMEN​