Skip to main content
Associate II
Jul 17, 2025 2:31 PM UTC
Question

STM32G474+HRTIM+PWM+DMA+SINE

Dear reader, 
I attempted to adapt the tutorial outlined in STM32F3348-DISCO HRTIM DMA PWM Sine Wave - STMicroelectronics Community to my STM32G474E-DPOW1 board to create a PWM signal with sinusoidally varying duty cycle using a look up table.

Attached is my main.c with the MX_HRTIM1_Init function. If there's any more information required please let me know

Any help would be greatly appreciated, thankyou

Oliver

This topic has been closed for replies.

3 replies

KDJEM.1
ST Technical Moderator
Jul 18, 2025 10:55 AM UTC

Hello @Oli98;

 

Could you please refer to Getting started with HRTIM - stm32mcu wiki and get inspired to create your own project. This wiki helps you learn about HRTIM and provides a simple application to create a single PWM.

 

Thank you.

Kaouthar

To give better visibility on the answered topics, please click on "Best answer" on the reply which solved your issue or answered your question.
Oli98Author
Associate II
Jul 21, 2025 10:55 AM UTC

Hi Kaouthar,

I began trying to adapt  this example from https://wiki.st.com/stm32mcu/wiki/Getting_started_with_HRTIM for the burst dma mode section by changing the reg_update as follows:

static uint32_t Reg_Update [] =

{

PERIOD/16, PERIOD/8, PERIOD/4, PERIOD/2, PERIOD,

};

 I also changed HAL_HRTIM_MspInit as per the tutorial and updated as follows for continuous dma updates:

hdma_hrtim1_a.Instance = DMA1_Channel1;

hdma_hrtim1_a.Init.Request = DMA_REQUEST_HRTIM1_A;

hdma_hrtim1_a.Init.Direction = DMA_MEMORY_TO_MEMORY;

hdma_hrtim1_a.Init.PeriphInc = DMA_PINC_DISABLE;

hdma_hrtim1_a.Init.MemInc = DMA_MINC_ENABLE;

hdma_hrtim1_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

hdma_hrtim1_a.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

hdma_hrtim1_a.Init.Mode = DMA_CIRCULAR;

hdma_hrtim1_a.Init.Priority = DMA_PRIORITY_LOW;

Visitor II
Jul 31, 2025 3:48 PM UTC

I am stuck trying to do the same thing. Tutorial works fine but not when doing the period 

I am just trying to update the period 

uint32_t Reg_Update [] =

{

59999

};

 

if(HAL_HRTIM_BurstDMATransfer(&hhrtim, HRTIM_TIMERID_TIMER_B, (uint32_t) Reg_Update, sizeof(Reg_Update)/sizeof(uint32_t)) != HAL_OK) //Add a breakpoint here

{

Error_Handler();

}

 

 

I am able to do the Compare 1 reg just like the tutorial, but I cannot do it for the period.