Funktionen aus libATSAM7S256.h

Gast #694073
Lesenswert?

Moin.
Habe da so eine Verständnisfrage.
Manche Funktionen aus libATSAM7S256.h erscheinen mir nicht ganz 
richtig(oder mache ich einen Denkfehler?). So z.B.
1
__inline void AT91F_PIO_SetOutput(
2
  AT91PS_PIO pPio,   // \arg  pointer to a PIO controller
3
  unsigned int flag) // \arg  output to be set
4
{
5
  pPio->PIO_SODR = flag;
6
}
Mit AT91F_PIO_SetOutput(AT91C_PIO_PA28) wir PA28 HIGH gesetzt. 
AT91C_PIO_PA28 ist ja (1<<28), d.h. (1<<28)=0x10000000. Was wiederum 
heist,  dass alle zuvor gesetzten Pins LOW werden(?). Muss es nicht so
1
 pPio->PIO_SODR | = flag;
 sein?

Oder in
1
__inline void AT91F_PIO_CfgPeriph(
2
  AT91PS_PIO pPio,             // \arg pointer to a PIO controller
3
  unsigned int periphAEnable,  // \arg PERIPH A to enable
4
  unsigned int periphBEnable)  // \arg PERIPH B to enable
5

6
{
7
  pPio->PIO_ASR = periphAEnable;
8
  pPio->PIO_BSR = periphBEnable;
9
  pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode
10
}
wird hier nicht auch die zuvor eingestellte Peräpherie deaktiviert?
#694088
Lesenswert?

Hi,

nein, es muss kein |= sein. Beim dem ARM gibt es jeweils extra ein 
Register zum Setzen und ein Register zum Zurücksetzen (SODR = Set output 
data register oder so, das Gegenstück wäre CODR = clear output data 
register). Schreibst Du ein Bit in SODR, geht der Ausgang auf high, 
schreibst Du das entsprechende Bit in CODR, geht der Ausgang auf Low. 
Nullen schreiben ändert nix...
Ist bei vielen Peripherie-Registern so...

MfG
 Deejay

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