Port access Indtil nu har vi anvendt færdige metoder til at tænde og slukke for LEDs, men den metode virker kun så længe vi arbejde med Keil boardet. I det efterfølgende vil vi i stedet prøve at tilgå portene direkte. I øvelsen vil vi tænde og slukke for LED 1
Find port i diagram LED 1 er forbundet til pin 8 på Port E
Find register For at skrive til et bit af gangen vil vi anvende GPIOx_BSRR til set og GPIOx_BRR til reset. Alternativt kunne vi skrive til GPIOx_ODR hvor vi kan sætte alle 16 bit på en gang
Find pin 8 configurations register For at kunne anvende GPIOE som output eller input skal vi skrive det i configurations registeret CRH. Pin 8 ligger på bit 0-3 i CRH registeret. Vi vil sætte MODE til 11 (Output max speed) CNF til 00 (GPO push pull) Bemærk at betydningen af CFN afhænger af værdien i MODE
Find IOPE Enable i APB2ENR For at kunne anvende PORT E skal den enables. Det sker i APB2ENR registeret IOPE ligger på pin 6 i APB2ENR
Kode #include int main (void) { const unsigned long led_mask = 1<<15; int i; /* Setup GPIO for LEDs */ RCC->APB2ENR |= 1 << 6; /* Enable GPIOE clock */ GPIOE->CRH = 0x ; /* Configure the GPIO for LEDs */ for (;;) { /* Loop forever */ for (i = 0; i < ; i++){} GPIOE->BSRR = led_mask; /* Turn LED on */ for (i = 0; i < ; i++){} GPIOE->BRR = led_mask; /* Turn LED off */ } Koden her anvender de registre som i forvejen er defineret.Afprøv koden. Prøv på samme måde at lave kode som aflæser input keys
Tilgå adresser med pointers I stedet for at anvende de predefinerede GPIO adresser kunne vi også finde dem i databladet og skrive til dem direkte.
Find adresse på Port E Port E starter på adresse 0x
Find offset adresse på BSRR og CRH BSRR offset er 0x10, CRH på 0x04
Find adresse på RCC_APB2ENR
#include //For at dette virker skal projektet importere ARM:CMSIS:CORE under Runtime environment Device, Startup #define GPIOE_CRH *((int *)0x ) //GPIOE address + CRH offset #define GPIOE_BSRR *((int *)0x ) //GPIOE address + BSRR offset #define GPIOE_BRR *((int *)0x ) //GPIOE address + BSRR offset #define RCC_APB2ENR *((int *)0x ) //Reset register til af GPIO int main (void) { const unsigned long led_mask = 1<<8; int i; /* Setup GPIO for LEDs */ RCC_APB2ENR |= 1 << 6; /* Enable GPIOE clock */ GPIOE_CRH = 0x ; /* Configure the GPIO for LEDs */ for (;;) { /* Loop forever */ for (i = 0; i < ; i++){} GPIOE_BSRR = led_mask; /* Turn LED on */ for (i = 0; i < ; i++){} GPIOE_BRR = led_mask; /* Turn LED off */ } Kode Koden her skriver direkte til portenes hex adresser.Afprøv koden. Prøv på samme måde at lave kode som aflæser input keys