4.1.1 Skriv en funktion void init_app( void ); som sätter upp port D, bit 0 som utsignal, push-pull. Övriga inställningar i porten ska behållas, dvs. får inte ändras av initieringen.
#define GPIO_D_MODER ((volatile unsigned int *)(0x40020C00)) #define GPIO_D_OTYPER ((volatile unsigned int *)(0x40020C04)) void init_app( void ) { /* PORT D */ * GPIO_D_MODER &= ~3; /* återställ bit 0 mode */ * GPIO_D_MODER |= 1; /* bit 0 sätts som utgång */ * GPIO_D_OTYPER &= ~1; /* återställ bit 0 typ, är nu push/pull */ }
4.1.2
En ljusdiod har anslutits till en pinne hos port D enligt följande figur:
Funktionerna
void init_app( void )
som sätter upp port D, bit 0 som utsignal, push-pull och
void delay_1ms( void)
som ger en (blockerande) fördröjning om 1ms finns givna och får användas.
Skriv ett program, i C, som kontinuerligt tänder dioden under en halv sekund
och därefter släcker den under en halv sekund.
Du får förutsätta att inga andra pinnar i porten används.
#define GPIO_D_ODR_LOW ((volatile unsigned char *)(0x40020C14)) void main(void) { int i; init_app(); while(1) { *GPIO_D_ODR_LOW = 0; for(i=0;i<500;i++) delay_1ms(); *GPIO_D_ODR_LOW = 1; for(i=0;i<500;i++) delay_1ms(); } }
4.1.3
Två DIL-strömbrytare och en 7-segments display kopplas enligt:
DIL1 till Port E (0-7)
DIL2 till Port E (8-15)
Display till port D (0-7)
Skriv ett program i ARM/Thumb assemblerspråk som:
Initierar portar D och E.
Kontinuerlig läser de inställda värdena från DIL-strömbrytarna, adderar dessa och skriver resultatet till displayen. Om summan är större än 255 ska FF skrivas till displayen.
start: @ initiera port D0-D7 som utport LDR R0,=0x00005555 LDR R1,=0x40020C00 STR R0,[R1] @ initiera port E0-E15 som inport LDR R0,=0 LDR R1,=0x40021000 STR R0,[R1] @ adressen till port D:s ut-dataregister till R5 LDR R5,=0x40020C14 @ adressen till port E:s in-dataregister till R6 LDR R6,=0x40021010 main: LDRB R0,[R6] LDRB R1,[R6,#1] ADD R0,R0,R1 CMP R0,#255 BLE main_2 MOVW R0,#0xFF main_2: STRB R0,[R5] B main
4.1.4
Två DIL-strömbrytare och en Double hexadecimal display kopplas enligt:
DIL1 till Port E (0-7),
DIL2 till Port E (8-15)
Display till port D (0-7):
Skriv ett program i ARM/Thumb assemblerspråk som:
Initierar portar D och E.
Kontinuerlig läser de inställda värdena från DIL-strömbrytarna, multiplicerar dessa och skriver de 8 minst signifikanta bitarna av resultatet till displayen. De avlästa värdena ska betraktas som tal utan tecken.
start: @ initiera port D0-D7 som utport LDR R0,=0x00005555 LDR R1,=0x40020C00 STR R0,[R1] @ initiera port E0-E15 som inport LDR R0,=0 LDR R1,=0x40021000 STR R0,[R1] @ adressen till port D:s ut-dataregister till R5 LDR R5,=0x40020C14 @ adressen till port E:s in-dataregister till R6 LDR R6,=0x40021010 main: LDRB R1,[R6] LDRB R0,[R6,#1] MUL R0,R0,R1 STRB R0,[R5] B main
4.1.5
En periferienhet med ett 8 bitars gränssnitt ska anslutas till ett MD407-system.
Från RESET är bit S=0, medan bit D och VAL-bitarna är odefinierade.
Periferienheten styrs och fungerar på följande sätt:
Tillsammans med en strömställare och en diodramp ansluts periferienheten till MD407 på följande sätt:
Konstruera en initieringsfunktion
void init_app( void )
, där du visar hur portarna D och E ska initieras. Alla utgångar ska vara push-pull.
Alla ingångar ska vara pull-down. IO-pinnar som inte används kan anses vara odefinierade.
Samtliga register (portar) ska deklareras med typkonverterande makron
så som vi rekommenderat i kursen.
#define PORT_D_BASE 0x40020C00 #define GPIO_D_MODER ((volatile unsigned int *) (PORT_D_BASE)) #define GPIO_D_OTYPER ((volatile unsigned short *) (PORT_D_BASE+0x4)) #define GPIO_D_PUPDR ((volatile unsigned int *) (PORT_D_BASE+0xC)) #define GPIO_D_HIGH_IDR ((volatile unsigned char *) (PORT_D_BASE+0x11)) #define GPIO_D_LOW_ODR ((volatile unsigned char *) (PORT_D_BASE+0x14)) #define PORT_E_BASE 0x40021000 #define GPIO_E_MODER ((volatile unsigned int *) (PORT_E_BASE)) #define GPIO_E_OTYPER ((volatile unsigned short *) (PORT_E_BASE+0x4)) #define GPIO_E_PUPDR ((volatile unsigned int *) (PORT_E_BASE+0xC)) #define GPIO_E_LOW_IDR ((volatile unsigned char *) (PORT_E_BASE+0x10)) a) void init_app( void ) { /* PORT D, b15-8 ingångar, b7-b0 utgångar */ *GPIO_D_MODER = 0x00005555; *GPIO_D_PUPDR = 0xAAAA0000; /* pull down */ *GPIO_D_OTYPER = 0x00000000; /* push/pull */ /* PORT E, b7 utgång , b6-0 ingångar */ *GPIO_E_MODER = 0x4000; *GPIO_E_PUPDR = 0x2AAA; /* b6-0 pull down */ *GPIO_E_OTYPER = 0x0000; /* b7 push/pull */ }