Atsam3X8E DMA Config Key

OP #7935645
Lesenswert?

Ich versuche gerade bei einem Arduino Due die DMA anzuwerfen. Ein Problem, dass eigentlich jeder in der Situation gehabt haben muss finde ich weder bei Microchip noch bei Google.

Teile der Einstellungen sind gegen verändern geschützt, bis man einen Key in ein SFR schreibt. Im Datenblatt (Atmel-11057C-ATARM-SAM3X-SAM3A-Datasheet_23-Mar-15 Seite 380 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf) steht ein 4 Byte langer Key für 24 Bit Platz im SFR -> WTF!

Ein Errata finde ich nicht auf der Atmel Seite.

In einem anderen Forum habe ich einen Code-Schnipsel gefunden. Da schreibt einer die ASCII Codes für "PIO" in den Platz für den Key. Das klingt verdächtig nach Copy-And-Paste, denn so entsperrt man die SFRs der GPIO.

Frage : Wie lautet folgende Code-Zeile korrekt ?

1
  DMAC->DMAC_WPMR = 0x444D414300UL;  // Disable Write Protection
OP #7935722
Lesenswert?

Eben ! Genau darum geht es. Ich muss den Schlüssel und die Nullbits für kein Schutz gewünscht in ein 32-bitiges Special Function Register schreiben, aber der Schlüssel allein hat im Datenblatt schon 32 Bit.

Ich habe in Quelldateien vom ASF den Wert 0x444D41 für den Schlüssel entdeckt und werde damit mal einen Versuch starten.

: Bearbeitet durch User
#7935728
Lesenswert?

Die Doku ist offensichtlich bei WPKEY für DMAC fehlerhaft. Wie der WPKEY funktioniert sieht man ja ganz gut bei den Werten für die andere Peripherie, dort stehen dann auch nur drei Bytes.

Und konsistent sind sie in der Doku auch nicht, WPKEY heißt teilweise WP_KEY.

: Bearbeitet durch User
Beitrag #7938145 wurde vom Autor gelöscht.
Beitrag #7938150 wurde vom Autor gelöscht.
#7938156
Lesenswert?

Hier aus dem ASF.

Der Wert 0x444D41u wird um 8 Bit nach oben geshiftet, also die oberen 24 Bit. Aber hast recht, im Datenblatt stehen ganz andere Werte.

1
/**
2
* component_dmac.h
3
*/
4
/* -------- DMAC_WPMR : (DMAC Offset: 0x1E4) DMAC Write Protect Mode Register -------- */
5
#define DMAC_WPMR_WPEN (0x1u << 0) /**< \brief (DMAC_WPMR) Write Protect Enable */
6
#define DMAC_WPMR_WPKEY_Pos 8
7
#define DMAC_WPMR_WPKEY_Msk (0xffffffu << DMAC_WPMR_WPKEY_Pos) /**< \brief (DMAC_WPMR) Write Protect KEY */
8
#define DMAC_WPMR_WPKEY(value) ((DMAC_WPMR_WPKEY_Msk & ((value) << DMAC_WPMR_WPKEY_Pos)))
9

10

11
/**
12
* dmac.c
13
*/
14
#ifndef DMAC_WPMR_WPKEY_PASSWD
15
#  define DMAC_WPMR_WPKEY_PASSWD DMAC_WPMR_WPKEY(0x444D41u)
16
#endif
17

18
void dmac_set_writeprotect(Dmac *p_dmac, uint32_t ul_enable)
19
{
20
  /* Validate parameters. */
21
  Assert(p_dmac);
22
  
23
  if (ul_enable) {
24
    p_dmac->DMAC_WPMR = DMAC_WPMR_WPKEY_PASSWD | DMAC_WPMR_WPEN;
25
  } else {
26
    p_dmac->DMAC_WPMR = DMAC_WPMR_WPKEY_PASSWD;
27
  }
28
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren