Thread Sicheres Bit Setzen und Löschen auf den GPIO's (der Vollständigkeit halber)
Nun funktioniert es endlich
Code:
#define BITBAND_SRAM(a,b) ((volatile U32 *)((0x22000000 + ((U32)(a)-0x20000000)*32)))[b]
#define BIT_SET_GPIO(port,bit) BITBAND_SRAM(&port,bit) = 1; __asm("DSB")
#define BIT_CLR_GPIO(port,bit) BITBAND_SRAM(&port,bit) = 0; __asm("DSB")
Nun kann mit folgendem Code ein einzelnes Bit verändert werden OHNE dass ein Interrupt
oder anderer Task während der Sequenz auch das Bit verändert. Wir haben einen atomaren Code, der auch einigermaßen übersichtlich ist.
Beispiele:
BIT_SET_GPIO(LPC_FIO1PIN,31); /* setze Bit 31 vom Port P1 */
BIT_CLR_GPIO(LPC_FIO1PIN,31); /* lösche Bit 31 vom Port P1 */
BIT_SET_GPIO(LPC_FIO0PIN,12); /* setze Bit 12 vom Port P0 */
BIT_CLR_GPIO(LPC_FIO0PIN,12); /* lösche Bit 12 vom Port P0 */
Lesezeichen