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.
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; }