Loading...
 

Zephyr project on STM32

   Zephyr Workbench, a VSCode extension to manage Zephyr on STM32.
It enables users to easily create, develop, and debug Zephyr applications.
Main features:
  • Install host dependencies.
  • Import toolchain and SDK.
  • Create, configure, build and manage apps.
  • Debug STM32.
You can directly download it from the VSCode marketplace
For more details, visit the Zephyr Workbench

System Workbench for STM32


ADC3 DMA issue on STM32H743II

Hi all,
I am struggling with ADC3 in DMA mode( actually BDMA mode) in STM32H743II.

I have tested ADC channels in polling and interrupt mode, everything is working fine. This proves my ADC is running properly.I have also worked on other controller like stm32F767ZI and on that ADC in DMA mode is working properly . Same way I am trying to configure on STM32H743II but struggle to get things done.

Here is the code snippet of the configuration which I setting :
void MX_ADC3_Init(void)
{
ADC_ChannelConfTypeDef sConfig;

/**Common config
*/
hadc3.Instance = ADC3;
hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc3.Init.LowPowerAutoWait = DISABLE;
hadc3.Init.ContinuousConvMode = ENABLE;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.NbrOfDiscConversion = 1;
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc3.Init.BoostMode = DISABLE;
hadc3.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc3) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

/**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(&hadc3, &sConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(adcHandle->Instance==ADC3)
{
/* USER CODE BEGIN ADC3_MspInit 0 */

/* USER CODE END ADC3_MspInit 0 */
/* ADC3 clock enable */
__HAL_RCC_ADC3_CLK_ENABLE();

/**ADC3 GPIO Configuration
PF7 --> ADC3_INP3
*/
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

/* ADC3 DMA Init */
/* ADC3 Init */
hdma_adc3.Instance = BDMA_Channel5;
hdma_adc3.Init.Request = BDMA_REQUEST_ADC3;
hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc3.Init.Mode = DMA_NORMAL;
hdma_adc3.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_adc3) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);

/* USER CODE BEGIN ADC3_MspInit 1 */

/* USER CODE END ADC3_MspInit 1 */
}
}

After this I wrote my callback functions, Instead of getting in complete conversion or half conversion callback method, the interrupt occur at error callback method.

I have tried with all BDMA channel but still got no positive result .I am badly stuck on this. Please provide any solution to this.

Thanks,
Nimish Jain

Did you ever find a solution to this? I’m having the exact same problem.. my suspicion is that it’s related to the bdma being on a different bus. However, when I declare the buffer to SRAM4 that will be the destination for the ADC DMA transfer,

attribute(0x38000000)uint32_t pAdcBuffer 1024  = {0};

OR..

  1. define SRAM4_BDAM_BUFFER attribute((section(“RAM_D3”)))

SRAM4_BDAM_BUFFER uint32_t pAdcBuffer 1024  = {0};

OR...

STM32H743ZITX_RAM.ld:
._ramd3_aka_sram4(NOLOAD) :
{
. = ALIGN(4);
*(._ramd3_aka_sram4*)
} >RAM_D3

mainc.c:
attribute((section(“_ramd3_aka_sram4”), used))
uint32_t pAdcBuffer 1024  = {0};


it compiles, but doesnt’ work, as I still get a DMA error code of 1 (transfer error) when I start:
HAL_ADC_Start_DMA (&hadc3 , (uint32_t*)pAdcBuffer, 256 );

Otherwise, if not a memory map issue, what else could be the problem?


 

Newest Forum Posts

  1. Монтаж камина с грилем в Москве - установка и барбекю by KpddomErorb, 2025-05-10 18:28
  2. SPI on Nucleo_STMH533RE by royjamil, 2025-05-04 20:13
  3. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-25 07:37
  4. SPI on Nucleo_STMH533RE by royjamil, 2025-03-23 11:31
  5. SPI on Nucleo_STMH533RE by higginsa1, 2025-03-23 09:33
  6. Configuring DMA for ADC in SW? by sam.hodgson, 2025-03-04 12:58
  7. Build a project in "release" mode by info@creosrl.it, 2025-02-20 18:12
  8. Build a project in "release" mode by info@creosrl.it, 2025-02-20 17:05
  9. Build a project in "release" mode by tang, 2025-02-20 10:36
  10. Build a project in "release" mode by info@creosrl.it, 2025-02-19 17:35

Last-Modified Blogs