Avbrott Demonstration och konsultation Arbetsbokens avsnitt 7 Händelsestyrt processbyte Förberedande inför laboration 4 Demonstrationsövning 5 1
Arbetsbok avsnitt 7: Undantag, avbrott - Uppgift 41 + enable_interrupt + disable_interrupt - Uppgift 43 + irq_handler + app_init + main Demonstrationsövning 5 2
Demonstrationsövning 5 3
Enable/Disable Interrupts Demonstrationsövning 5 4
Demonstrationsövning 5 5
Konfigurera för att kunna hantera interrupts (app_init): - Hårdvaran: syscfg clock ska slås på! - Port E bit 3 skall konfigureras som external interrupt. - Interrupt Mask Register skall konfigureras for att aktivera avbrott på avbrottslinan av intresse. - Konfigurera för avbrott på negativ flank. - Lägg in en funktions pekare i avbrotts vektor tabellen. - konfigurera Nested Vectored Interrupt Controller Demonstrationsövning 5 6
SYSCFG clock on: Demonstrationsövning 5 7
Port E b3 EXTI3 Demonstrationsövning 5 8
Aktivera avbrott på avbrottslinan av intresse Demonstrationsövning 5 9
Konfigurera för avbrott på fallande flank Demonstrationsövning 5 10
Avbrotts vektor tabellen (irq_handler funktions pekaren?) Demonstrationsövning 5 11
Konfigurera NVIC Demonstrationsövning 5 12
Konfigurera NVIC: SETENA[9] skall sättas. Demonstrationsövning 5 13
irq_handler: Demonstrationsövning 5 14
EXTI Pending Register Demonstrationsövning 5 15
Kod Demonstrationsövning 5 16
#define SYSCFG_BASE 0x40013800 volatile unsigned int* syscfg_exticr1 = (volatile unsigned int*) (SYSCFG_BASE + 8); volatile unsigned int* rcc_apb2enr = (volatile unsigned int*) (0x40023844); #define EXTI_BASE 0x40013C00 volatile unsigned int *exti_imr = (volatile unsigned int*) EXTI_BASE; /* interrupt mask register */ volatile unsigned int *exti_emr = (volatile unsigned int*) (EXTI_BASE + 4); /* Event mask register */ volatile unsigned int *exti_rtsr = (volatile unsigned int*) (EXTI_BASE + 8); /* rising trigger */ volatile unsigned int *exti_ftsr = (volatile unsigned int*) (EXTI_BASE + 0xC); /* falling trigger */ volatile unsigned int *exti_pr = (volatile unsigned int*) (EXTI_BASE + 0x14); /* pending register */ #define EXTI3_IRQVEC 0x2001C064 Demonstrationsövning 5 17
volatile unsigned int *nvic_iser0 = (volatile unsigned int*) (0xE000E100); volatile unsigned int *nvic_ipr0 = (volatile unsigned int*) (0xE000E400); Demonstrationsövning 5 18
#define PORT_BG_BASE 0x40020C00 /* Port D */ #define PORT_FF_BASE 0x40021000 /* port E */ volatile unsigned int *p_ff_moder = (volatile unsigned int*) PORT_FF_BASE; volatile unsigned short *p_ff_otyper = (volatile unsigned short*) (PORT_FF_BASE + 0x4); volatile unsigned int *p_ff_ospeedr = (volatile unsigned int*) (PORT_FF_BASE + 0x8); volatile unsigned int *p_ff_pupdr = (volatile unsigned int*) (PORT_FF_BASE + 0xC); volatile unsigned char *p_ff_idrlow = (volatile unsigned char*) (PORT_FF_BASE + 0x10); volatile unsigned char *p_ff_odrlow = (volatile unsigned char*) (PORT_FF_BASE + 0x14); volatile unsigned int *p_bg_moder = (volatile unsigned int*) (PORT_BG_BASE); volatile unsigned short *p_bg_otyper = (volatile unsigned short*) (PORT_BG_BASE + 0x4); volatile unsigned int *p_bg_ospeedr = (volatile unsigned int*) (PORT_BG_BASE + 0x8); volatile unsigned char *p_bg_odrlow = (volatile unsigned char*) (PORT_BG_BASE + 0x14); Demonstrationsövning 5 19
void enable_interrupt( void ){ asm volatile( " cpsie i\n" ); } void disable_interrupt( void ){ asm volatile( "cpsid i\n" ); } Demonstrationsövning 5 20
/* global räknare */ char count; void irq_handler(void){ if (*exti_pr & 0x8){ /* kolla bit 3 */ count ++; *exti_pr = 0x8; /* ränsa interrupt */ } } Demonstrationsövning 5 21
void app_init(void){ /* bar graph output */ /* bits 0-7 utgångar */ *p_bg_moder = 0x00005555; *p_bg_ospeedr = 0x00005555; /* medium speed */ /*avbrotts generator plattan*/ *p_ff_moder = 0x00005500; /* b 7-4 ut, b 3-0 in */ *p_ff_ospeedr = 0x0000FF00; /* hög fart */ count = 1; /* FORTSÄTTER NÄSTA SLIDE */ Demonstrationsövning 5 22
/* port E bit 3 interrupt input, negativ flank */ *rcc_apb2enr = 0x4000; /*syscfg clock på*/ *syscfg_exticr1 = 0x4000; /* PE3 -> EXTI3 */ /* konfigurera mask */ *exti_imr = 0x8; /* konfigurera fallande flank */ *exti_ftsr = 0x8; *exti_rtsr &= ~0x8; /* set vektor */ *((void (**)(void) ) EXTI3_IRQVEC) = irq_handler; } *nvic_iser0 = (1 << 9); Demonstrationsövning 5 23
int main(void) { app_init(); enable_interrupt(); while(1) { *p_bg_odrlow = count; } } Demonstrationsövning 5 24
Extra: Inför labben Demonstrationsövning 5 25
/* global räknare */ char count; void irq_handler(void){ if (*exti_pr & 0x8){ /* kolla bit 3 */ count ++; *exti_pr = 0x8; /* ränsa interrupt */ } } *p_ff_odrlow = 0x70; *p_ff_odrlow &= ~0x70; Demonstrationsövning 5 26