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?

1 REPLY 1
lFurm.1
Associate II

Can someone help with it please?

@Imen DAHMEN​