Hallo,
ich experimentiere gerade mit der DMA-Einheit auf meinem
STM32F103-Evalboard.
Im Debugger klappt alles, in Echt schreibt die DMA wild im Speicher
herum.
Mir ist aufgefallen, dass bei der DMA im CR1 das DIR-Bit, welches ja
festlegt, ob von Peripherie nach RAM oder umgekehrt kopiert werden soll,
gelöscht ist. D.h., die DMA schreibt tatsächlich im RAM herum.
Selstsam daran ist, dass ich dieses Bit bei der Initialisierung gesetzt
habe:
1 | RCC->AHBENR |= RCC_AHBENR_DMA1EN;
|
2 | DMA1_Channel3->CCR = DMA_CCR3_PSIZE_1 | DMA_CCR3_DIR;
|
3 | DMA1_Channel3->CNDTR = 0;
|
4 | // ...
|
Wenn ich im Debugger durchsteppe, ist das Bit im Register auch
tatsächlich gesetzt. Wenn ich das Programm aber durchlaufen lasse und
hinter der Initialisierung anhalte, ist das Bit nicht gesetzt.
In einem der HAL-Headerdateien von ST finde ich folgende Notiz:
> A delay between an RCC peripheral clock enable and the effective
> peripheral enabling should be taken into account in order to manage
> the peripheral read/write from/to registers.
> (+) This delay depends on the peripheral mapping.
> (++) AHB & APB peripherals, 1 dummy read is necessary
Und tatsächlich funktioniert alles wieder, wenn ich hinter die Zeile mit
dem RCC->AHBENR ein DSB oder ein NOP einfüge...
Die Notiz in der HAL-Headerdatei finde ich weder im Reference Manual,
noch im Erratum (sie steht aber im Erratum einiger Prozessoren aus der
F4-Reihe).
Ist das nun Pech oder hab ich was überlesen?
Danke und Grüße,
N