Skip to main content
Associate
November 11, 2025
Question

STM32H7 DMA1

  • November 11, 2025
  • 7 replies
  • 357 views
 

Good day!

I use TIM15 and DMA1, channel 5 in STM32H743. If DMA and data have a size of 32-bit, then everything works fine. If you configure DMA on 16-bit data, then 32-bit data is still written to the TIM5 registers.

In order to save memory, I want to write 16-bit values ​​to the timer. In the documentation I read that DMA1 works only in 32-bit data mode.

Is there any way to force DMA1 to transfer data to the timer in 16-bit mode, or even better in 8-bit?


Andrey.

7 replies

AScha.3
Super User
November 11, 2025

Hi,

so you want write 16b to a timer register ? 

And you set data and destination to 16b ?

AScha3_0-1762892521881.png

then..?

"If you feel a post has answered your question, please click ""Accept as Solution""."
waclawek.jan
Super User
November 11, 2025

This won't work and you cannot save memory, the data for TIM5 have to be 32-bit.

DMA1 is a dual-port DMA (i.e. the same as in'F2/'F4/'F7), and does not zero-extend the data. It means, that if you set it to 16-bit at the memory side and 32-bit at peripheral side, it will assemble (concatenate) two halfwords from memory to a word tp output to the timer. If you set 16-bit at both memory and peripheral side, it will indeed write only 16 bits onto the AHB bus towards TIM5, but the AHB/APB bridge will copy the lower 16 bits to the upper 16 bits and both halves will be written to the timer.

At least this is what happens in 'F4; I don't use the'H7. Try.

JW

AScha.3
Super User
November 11, 2025

@waclawek.jan  , 

but Tim15 is 16b timer, so register with 16b write should work - or not ?

AScha3_0-1762897816961.png

 

"If you feel a post has answered your question, please click ""Accept as Solution""."
waclawek.jan
Super User
November 11, 2025

For TIM15 yes, but OP mentioned both TIM15 and TIM5.

JW

waclawek.jan
Super User
November 13, 2025

> When I write a 16-bit value to TIM15 using DMA1 in HalfWord mode, a 32-bit value consisting of two 16-bit values ​​is written to the register.

So, do you work with TIM5 or TIM15?

If TIM15, then question is, which register are you trying to write to, as TIM15 is a 16-bit timer. 

 

> While studying the manual, I found a note that says the AHB bus only works in 32-bit format.

waclawekjan_0-1763044980641.png

This is not related to your problem. This says, that DMA's registers can't be accessed in other than 32-bit way, i.e. the processor has to write DMA's registers only using instructions with 32 bit data; this does not say, how DMA accesses other peripherals.

 

> I'd like to know if it's possible to preserve memory and send 16-bit values ​​(ideally 8-bit) to the timer instead of 32-bit values?

No, it is not possible.

JW

marseneyAuthor
Associate
November 13, 2025

Thanks for the reply. I'm working with TIM15. I'm writing three register values ​​(ARR, RCR, CCR1) to the DMAR register.

waclawek.jan
Super User
November 13, 2025

And what effect do you observe due to the "lower halfword duplicated to upper halfword"?

Can you please post the read-out content of those registers after such write occured?

JW

marseneyAuthor
Associate
November 14, 2025

Thanks for your help. I figured out the problem. The peripheral register size was incorrectly specified (32 bits instead of 16 bits) and the RCR register value for timer 15 was incorrect.

Andrey.