Forum: Mikrocontroller und Digitale Elektronik lib_AT91SAMS256.h


von Max (Gast)


Lesenswert?

Hallo.
Habe eine Verständnisfrage.
Mir erscheinen einige Funktionen in lib_ATSAM7S256.h nicht ganz richtig 
zu sein(oder habe ich einen Denkfehler gemacht). 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_BASE_PIOA,AT91C_PIO_PA5) wird PA5 HIGH. 
AT91C_PIO_PA5 ist im Prinzip (1<<5), d.h. 0x00000020 was wiederum 
bedeutet dass die zuvor gesetzten Pins deaktiviert werden.
Muss es nicht verodert werden? So
1
  pPio->PIO_SODR | = flag;

So auch in
1
 
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 die zuvor aktivierte Periphärie wieder deaktiviert(?).

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

nö. Die ARMs arbeiten typischerweise mit Set/Clear/Status Registern. Das 
heißt mit dem Schreiben einer '1' in das Set Register wird das 
entsprechende Bit gesetzt, mit dem Schreiben einer '1' in das Clear 
Register gelöscht und aus dem Statusregister kann der aktuelle Wert 
gelesen werden. Set/Clear sind dabei nur beschreibbar und das 
entsprechende Statusregiser nur lesbar. Das Ganze hat den immensen 
Vorteil das mehrere Tasks unterschiedliche Bits im selben Register 
setzen und rücksetzen können ohne dabei besondere Maßnahmen zur 
Synchronisierung treffen zu müssen.

Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.