GPIO Initiering/programmering digital I/O

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 */
}