Port access I det efterfølgende vil vi anvende databladsoplysninger frem for anvende de færdige metoder.
Find port i diagram LED 1 er forbundet til pin 8 på Port E
Find adresse på Port E Port E starter på adresse 0x
Find pin 8 configurations register Pin 8 ligger på bit 0-3 i CRH registeret, vi vil skrive 0x3 for at få General purpose output push-pull, 50MHz
Find offset adresse på BSRR og CRH BSRR offset er 0x10, CRH på 0x04
Koden /* myBlinky: Very Simple LED Flasher */ /* Dr. Mark Fisher, CMP, UEA, Norwich, UK. */ /* Last updated */ /**************************************************************/ #include #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) { int i; RCC_APB2ENR |= 1 << 6; //Enable IO Port E GPIOE_CRH = 0x ; //General purpose output push-pull, 50MHz for (;;) { /* Loop forever */ for (i = 0; i < ; i++) GPIOE_BSRR = 1 <<8; //Skriv til set register pin 8 for (i = 0; i < ; i++) GPIOE_BRR = 1 <<8; //Skriv til reset register pin 8 }
Opgave Afprøv foregående kode Prøv derefter at ændre koden så de andre LEDs slukkes Prøv at lave kode som kan aflæse keyboard på boardet – Find keys i diagrammet og deraf port og pin – Find adresse på porten – Opsæt porten til input – Enable porten i RCC_APB2ENR – Lav kode som aflæser porten
Alternativ port access /* myBlinky: Very Simple LED Flasher */ /* Dr. Mark Fisher, CMP, UEA, Norwich, UK. */ /* Last updated */ /**************************************************************/ #include int main (void) { const unsigned long led_mask = 1<<15; int i; int a; SystemInit(); /* 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->BSRR = led_mask << 16; /* Turn LED off */ a = GPIOE->BRR; } Koden her anvender de registre som i forvejen er defineret. Afprøv koden, og prøv på samme måde igen at lave kode som aflæser input keys