cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H743 Dual mode ADC in 8 bit resolution

JShro
Associate III

Hi Experts!

 

Summary: 

Question: Anyone know if the dual 8bit ADC mode is broken on the STM32H743 or what I could be doing wrong?

Details:

I am trying to get 8 bit dual mode ADC working on the STM32H743. 

I see one post on here that seems to indicate some inconsistency with the documentation 

https://community.st.com/t5/stm32-mcus-products/stm32h7-adc-8-bit-dual-mode-with-damdf-0b11-is-ambiguous-in/m-p/236582

However what I am seeing is something really wierd... 

Just as background - I am able to get the 16 bit dual mode working just fine using the below setup for ADC1 & ADC2 (Channel 3 on ADC1 and Channel 4 on ADC2) - I am using circular mode DMA...

 

 

static void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;

hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure the ADC multi-mode
*/
multimode.Mode = ADC_DUALMODE_REGSIMULT;
multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;//ADC_DUALMODEDATAFORMAT_8_BITS;//
multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */

/* USER CODE END ADC1_Init 2 */

}

static void MX_ADC2_Init(void)
{

  /* USER CODE BEGIN ADC2_Init 0 */

  /* USER CODE END ADC2_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC2_Init 1 */

  /* USER CODE END ADC2_Init 1 */
  /** Common config 
  */
  hadc2.Instance = ADC2;
	hadc2.Init=hadc1.Init;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  hadc2.Init.Resolution = ADC_RESOLUTION_16B;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = DISABLE;
  hadc2.Init.NbrOfConversion = 1;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc2.Init.OversamplingMode = DISABLE;
	hadc2.Init.ExternalTrigConv  = ADC_SOFTWARE_START;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC2_Init 2 */

  /* USER CODE END ADC2_Init 2 */

}

 

With the above config - I get the ADC Channel 3 data in CDR register bits [0..15] and ADC Channel 4 in CDR [15..32] - as expected.

I can scale it down to 8 bits, but if I can get down to 8 bit resolution it would be ideal - 

Per  RM0433 if I set DAMDF=0b11 (8 bit mode) I am supposed to get 

 

image.png

And then the 1st DMA request would be generated.

However I never get the full word populated I only seem to get the lower 16 bits in CDR and the Slave channel appears to have junk.

 

There is an ADC errata https://www.st.com/resource/en/errata_sheet/es0392-stm32h742xig-stm32h743xig-stm32h750xb-stm32h753xi-device-errata-stmicroelectronics.pdf

That seems to mention 

image.png

 It seems sort of related but the workaround did not fix anything.

Question: Anyone know if the 8bit ADC mode is broken on the STM32H743 or what I could be doing wrong?

Thanks for any and all help!

 

 

 

2 REPLIES 2
SofLit
ST Employee

Hello,


@JShro wrote:

However what I am seeing is something really wierd... 


But you didn't tell what is that "weird behavior"!

Also better to share your code/project that reproduces the behavior. No one here have a crystal ball to find what you did.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

@SofLit wrote:

Hello,


@JShro wrote:

However what I am seeing is something really wierd... 


But you didn't tell what is that "weird behavior"!

Also better to share your code/project that reproduces the behavior. No one here have a crystal ball to find what you did.


@SofLit You would not have a crystal ball to find out what I did so if you scroll past what you quoted - you will see the code sample and also a detailed description of what I believe is "weird" looks like you were too anxious to just yell at a paying customer rather than reading further :(