Externa avbrott

6.2.1 Förbered en enkel applikation som använder PE2 hos MD407 som avbrottsingång. Beskriv initieringsfunktion och avbrottshantering, dvs. färdigställ följande:

void irq_handler ( void )
{
	// Om avbrott från EXTI2:
		 // kvittera avbrott från EXTI2 */
}

void app_init ( void )
{
	// Koppla PE2 till avbrottslina EXTI2;

	// Konfigurera EXTI2 för att generera avbrott;
	// Konfigurera för avbrott på negativ flank
	
	// Sätt upp avbrottsvektor
     
   	// Konfigurera de bitar i NVIC som kontrollerar den avbrottslina som EXTI2 kopplats till
}

Visa hur preprocessordirektiv och ev. typdeklarationer används för att skapa begriplig programkod. Typkonverteringar ska göras på sådant sätt som rekommenderats i kursen.

/* Anm: EXTI2 har vektornummer 8. */
#define SYSCFG_EXTICR1	0x40013808
#define EXTI_IMR	0x40013C00
#define EXTI_FTSR	0x40013C0C
#define EXTI_PR		0x40013C14
#define EXTI2_IRQ_BPOS  (1<<2)
#define NVIC_ISER0	0xE000E100
#define EXTI2_IRQVEC	0x2001C060
#define NVIC_EXTI2_IRQ_BPOS  (1<<8)

void irq_handler ( void )
{
	/* Om avbrott från EXTI2:
		kvittera avbrott från EXTI2 */
	if(   *((unsigned int *) EXTI_PR) & EXTI2_IRQ_BPOS )
	{
           *((unsigned int *) EXTI_PR) |= EXTI2_IRQ_BPOS;
 	}
}

void app_init ( void )
{
	/* Koppla PE2 till avbrottslina EXTI2 */
  	 *((unsigned int *) SYSCFG_EXTICR1) |= 0x0400;
	/* Konfigurera EXTI2 för att generera avbrott */
  	 *((unsigned int *) EXTI_IMR) |= EXTI2_IRQ_BPOS;
	/* Konfigurera för avbrott på negativ flank */
 	 *((unsigned int *) EXTI_FTSR) |= EXTI2_IRQ_BPOS;		
	/* Sätt upp avbrottsvektor */
  	 *((void (**)(void) ) EXTI2_IRQVEC ) = irq_handler;     
   	/* Konfigurera den bit i NVIC som kontrollerar den avbrottslina som EXTI2 kopplats till */
    	*((unsigned int *) NVIC_ISER0) |= NVIC_EXTI2_IRQ_BPOS; 
}


6.2.2 Förbered en enkel applikation som använder PD1 hos MD407 som avbrottsingång. Beskriv initieringsfunktion och avbrottshantering, dvs. färdigställ följande:

void irq_handler ( void )
{
	// Om avbrott från EXTI1:
		 // kvittera avbrott från EXTI1 */
}

void app_init ( void )
{
	// Koppla PD1 till avbrottslina EXTI1;

	// Konfigurera EXTI1 för att generera avbrott;
	// Konfigurera för avbrott på negativ flank
	
	// Sätt upp avbrottsvektor
     
   	// Konfigurera de bitar i NVIC som kontrollerar den avbrottslina som EXTI1 kopplats till
}

Visa hur preprocessordirektiv och ev. typdeklarationer används för att skapa begriplig programkod. Typkonverteringar ska göras på sådant sätt som rekommenderats i kursen.

/* Anm: EXTI1 har vektornummer 7. */
#define SYSCFG_EXTICR1		0x40013808
#define EXTI_IMR				0x40013C00
#define EXTI_FTSR			0x40013C0C
#define EXTI_PR				0x40013C14
#define NVIC_	ISER0			0xE000E100
#define EXTI1_IRQ_BPOS		1<<1
#define EXTI1_IRQVEC		0x2001C05C
#define NVIC_EXTI1_IRQ_BPOS  (1<<7)

void irq_handler ( void )
{
	/* Om avbrott från EXTI1:
		kvittera avbrott från EXTI1 */
	if(   *((unsigned int *) EXTI_PR) & EXTI1_IRQ_BPOS )
	{
		*((unsigned int *) EXTI_PR) |= EXTI1_IRQ_BPOS;
 	}
}

void app_init ( void )
{
	/* Koppla PD1 till avbrottslina EXTI1 */
  	 *((unsigned int *) SYSCFG_EXTICR1) |= 0x0030;
	/* Konfigurera EXTI1 för att generera avbrott */
  	 *((unsigned int *) EXTI_IMR) |= EXTI1_IRQ_BPOS;
	/* Konfigurera för avbrott på negativ flank */
 	 *((unsigned int *) EXTI_FTSR) |= EXTI1_IRQ_BPOS;		
	/* Sätt upp avbrottsvektor */
  	 *((void (**)(void) ) EXTI1_IRQVEC ) = irq_handler;     
   	/* Konfigurera den bit i NVIC som kontrollerar den avbrottslina som EXTI1 kopplats till */
    	*((unsigned int *) NVIC_ISER0) |= NVIC_EXTI1_IRQ_BPOS; 
}


6.2.3 Förbered en enkel applikation som använder PE3 hos MD407 som avbrottsingång. Beskriv initieringsfunktion och avbrottshantering, dvs. färdigställ följande:

void irq_handler ( void )
{
	// Om avbrott från EXTI3:
		// kvittera avbrott från EXTI3
}

void app_init ( void )
{
	// Koppla PE3 till avbrottslina EXTI3;

	// Konfigurera EXTI3 för att generera avbrott;
	// Konfigurera för avbrott på negativ flank
	
	// Sätt upp avbrottsvektor
     
   	// Konfigurera de bitar i NVIC som kontrollerar den avbrottslina som EXTI3 kopplats till
}

Visa hur preprocessordirektiv och ev. typdeklarationer används för att skapa begriplig programkod. Typkonverteringar ska göras på sådant sätt som rekommenderats i kursen.

/* Anm: EXTI3 har vektornummer 9. */

#define SYSCFG_EXTICR1	0x40013808
#define EXTI_IMR	0x40013C00
#define EXTI_FTSR	0x40013C0C
#define EXTI_PR	0x40013C14
#define NVIC_ISER0	0xE000E100
#define EXTI3_IRQ_BPOS	(1<<3)
#define EXTI3_IRQVEC	0x2001C064
#define NVIC_EXTI3_IRQ_BPOS	(1<<9)

void irq_handler ( void )
{
	/* Om avbrott från EXTI3:
		kvittera avbrott från EXTI3 */
	if(   *((unsigned int *) EXTI_PR) & EXTI3_IRQ_BPOS )
	{
       *((unsigned int *) EXTI_PR) |= EXTI3_IRQ_BPOS;
 	}
}

void app_init ( void )
{
	/* Koppla PE3 till avbrottslina EXTI3 */
  	 *((unsigned int *) SYSCFG_EXTICR1) |= 0x4000;
	/* Konfigurera EXTI3 för att generera avbrott */
  	 *((unsigned int *) EXTI_IMR) |= EXTI3_IRQ_BPOS;
	/* Konfigurera för avbrott på negativ flank */
 	 *((unsigned int *) EXTI_FTSR) |= EXTI3_IRQ_BPOS;		
	/* Sätt upp avbrottsvektor */
  	 *((void (**)(void) ) EXTI3_IRQVEC ) = irq_handler;     
   	/* Konfigurera den bit i NVIC som kontrollerar den avbrottslina som EXTI3 kopplats till */
     *((unsigned int *) NVIC_ISER0) |= NVIC_EXTI3_IRQ_BPOS; 
}


6.2.4 Förbered en enkel applikation som använder PD15 hos MD407 som avbrottsingång. Dvs, skriv, i C, en sekvens som:

Ange också den vektor som ska initieras för avbrottet.
Observera att andra eventuella EXTI-konfigurationer inte får ändras av din programsekvens.

Visa hur preprocessordirektiv och ev. typdeklarationer används för att skapa begriplig programkod. Typkonverteringar ska göras på sådant sätt som rekommenderats i kursen.

/* Anm: EXTI 10 t.o.m 15 har vektornummer 40. */

#define SYSCFG_EXTICR4	0x40013814
#define EXTI_IMR	0x40013C00
#define EXTI_FTSR	0x40013C0C
#define EXTI_RTSR	0x40013C0C
#define EXTI_PR	0x40013C14
#define NVIC_ISER1	0xE000E104

...
	*((unsigned int *) SYSCFG_EXTICR4) &= 0x0FFF;   	/* nollställ bitfält EXTI15 */ 
	*((unsigned int *) SYSCFG_EXTICR4) |= 0x3000;   	/* PD15->EXTI15  */ 
	*((unsigned int *) EXTI_IMR) |= (1<<15); 		/* aktivera avbrott EXTI15 */ 
	*((unsigned int *) EXTI_FTSR) |= (1<<15);		/* aktivera trigger på negativ flank */ 
	*((unsigned int *) EXTI_RTSR) &= ~(1<<15);		/* deaktivera trigger på positiv flank */ 
	*((unsigned int *) NVIC_ISER1) |= (1<<8);		/* aktivera avbrott i NVIC */  

Vektor nummer 40 (offset 0xE0)


6.2.5 Förbered en enkel applikation som använder PD10 hos MD407 som avbrottsingång. Dvs, skriv, i C, en sekvens som:

Ange också den vektor som ska initieras för avbrottet.
Observera att andra eventuella EXTI-konfigurationer inte får ändras av din programsekvens.

Visa hur preprocessordirektiv och ev. typdeklarationer används för att skapa begriplig programkod. Typkonverteringar ska göras på sådant sätt som rekommenderats i kursen.

/* Anm: EXTI 10 t.o.m 15 har vektornummer 40. */
/* Endast de bitar som konfigurerar EXTI10 får/ska initieras. */
#define	SYSCFG_EXTICR3 0x40013810
#define	EXTI_IMR 		0x40013C00
#define	EXTI_FTSR 		0x40013C0C
#define	EXTI_RTSR 		0x40013C08
#define	NVIC_ISER1 		0xE000E104

*((volatile unsigned short *) SYSCFG_EXTICR3) &= 0xF0FF;   	/* nollställ bitfält EXTI10 */ 
*((volatile unsigned short *) SYSCFG_EXTICR3) |= 0x0300;   	/* PD10->EXTI10  */ 
*((volatile unsigned int *) 	EXTI_IMR) |= (1<<10); 			/* aktivera avbrott EXTI10 */ 
*((volatile unsigned int *) 	EXTI_FTSR) |= (1<<10);			/* aktivera trigger på negativ flank */ 
*((volatile unsigned int *) 	EXTI_RTSR) &= ~(1<<10);		/* deaktivera trigger på positiv flank */ 
*((volatile unsigned int *) 	NVIC_ISER1) |= (1<<8);			/* aktivera avbrott i NVIC */  

Vektor nummer 40 (offset 0xE0)


6.2.6 En avbrottsvippa kopplas till MD407 enligt följande figur:


Den externa avbrottsmekanismen (EXTI) ska användas för att detektera knapptryckningar. Ingen hänsyn behöver tas till eventuella kontaktstudsar.

  1. Visa med en funktion app_init hur avbrottsmekanismerna initieras, dvs. IO-pinnar konfigureras, EXTI och NVIC initieras. Du får förutsätta att inga andra IO-pinnar i port C ska användas.
  2. Visa en komplett avbrottsrutin irq_handler som kvitterar (återställer) avbrott efter en knappnedtryckning så att systemet kan detektera nästa nedtryckning. Du får förutsätta att inga andra avbrott förekommer.
  3. Var, i MD407, (vilken adress) ska adressen till avbrottsrutinen placeras?

För full poäng krävs att din lösning är tydlig, fullständig och att du använt lämpliga makrodefinitioner för registeradresser.

Av figuren framgår att vippans inverterade utgång är ansluten till bit 3, port C.
Därav följer att avbrott ska genereras på negativ flank, PC3.
Återställning av vippan sker genom att PC4 "togglas".
Alltså måste portpinne C3 sättas till ingång (flytande eller pull-up)
och portpinne C4 sättas till utgång, push-pull.

#define NVIC_EXTI3_IRQ_BPOS	(1<<9)
#define EXTI3_IRQ_BPOS  		(1<<3)

#define GPIOC_MODER 	((volatile unsigned int *)		0x40020800)
#define GPIOC_OTYPER	((volatile unsigned short *)	0x40020804)
#define GPIOC_PUPDR		((volatile unsigned int *)		0x4002080C)
#define GPIOC_ODRLOW 	((volatile unsigned char *)	0x40020814)

#define SYSCFG_EXTICR1	((volatile unsigned short *)	0x40013808)
#define EXTI_IMR			((volatile unsigned int *)		0x40013C00)
#define EXTI_RTSR     	((volatile unsigned int *)		0x40013C08)
#define EXTI_FTSR     	((volatile unsigned int *)		0x40013C0C)
#define EXTI_PR       	((volatile unsigned int *)		0x40013C14)

#define NVIC_ISER0 		((volatile unsigned int *)		0xE000E100) 

void app_init( void )
{
	*GPIOC_MODER = 0x100;		/* Data direction digital io */	
	*GPIOC_PUPDR = 0;			/* Input floating */	
	*GPIOC_OTYPER = 0;			/* Output push/pull */	

	*GPIOC_ODRLOW = 0x10;		/* RESET Flipflop */
	*GPIOC_ODRLOW = ~0x10;   

  	*SYSCFG_EXTICR) |= 0x2000;     /* PC3->EXTI3  */ 
	*EXTI_IMR |= EXTI3_IRQ_BPOS; 
	*EXTI_FTSR |= EXTI3_IRQ_BPOS;		 
	*EXTI_RTSR &= ~EXTI3_IRQ_BPOS;		 

*NVIC_ISER0 |= NVIC_EXTI3_IRQ_BPOS; 
}