Hi, ich versuche gerade erfolglos, bei einem ATSAMD51 einen externen Interrupt abzufragen (genau IRQ0 für PB05 und PB06). Das erzeugt mir ATMEL Start als Initialisierungscode: void EXTERNAL_IRQ_0_init(void) { hri_gclk_write_PCHCTRL_reg(GCLK, EIC_GCLK_ID, CONF_GCLK_EIC_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos)); hri_mclk_set_APBAMASK_EIC_bit(MCLK); // Set pin direction to input gpio_set_pin_direction(CLKY, GPIO_DIRECTION_IN); gpio_set_pin_pull_mode(CLKY, // <y> Pull configuration // <id> pad_pull_config // <GPIO_PULL_OFF"> Off // <GPIO_PULL_UP"> Pull-up // <GPIO_PULL_DOWN"> Pull-down GPIO_PULL_OFF); gpio_set_pin_function(CLKY, PINMUX_PA05A_EIC_EXTINT5); // Set pin direction to input gpio_set_pin_direction(SYNCY, GPIO_DIRECTION_IN); gpio_set_pin_pull_mode(SYNCY, // <y> Pull configuration // <id> pad_pull_config // <GPIO_PULL_OFF"> Off // <GPIO_PULL_UP"> Pull-up // <GPIO_PULL_DOWN"> Pull-down GPIO_PULL_OFF); gpio_set_pin_function(SYNCY, PINMUX_PA06A_EIC_EXTINT6); ext_irq_init(); } Meine ISRs sehen so aus (gleichnamige Funktionen innerhalb des ATMEL-Start-Codes habe ich entfernt): void EIC_5_Handler(void) { if(EIC->INTFLAG.reg & (1<<5)) { EIC->INTFLAG.reg=(1<<5); } else { /* spurious interrupt?, clear all interrupt flags */ EIC->INTFLAG.reg = EIC->INTFLAG.reg; /* clear all EIC interrupt flags */ } } void EIC_6_Handler(void) { if(EIC->INTFLAG.reg & (1<<6)) { EIC->INTFLAG.reg = (1<<6); } else { /* spurious interrupt?, clear all interrupt flags */ EIC->INTFLAG.reg = EIC->INTFLAG.reg; /* clear all EIC interrupt flags */ } } Mein Problem: keine der ISRs wird jemals angesprungen, noch nicht mal ein einziges mal. Ein Hardwaresignal ist vorhanden, in ATMEL Start habe ich dne EIC mit einem 120 Mhz-Clock verbunden, die beiden Interrupts 5 und 6 sind enabled und es ist Fallende/Beide Flanken für diese eingetragen. Was könnte da noch fehlen? Danke!
Weiß nicht, was die da unter der Haube zusammen zaubern. Ist der Interrupt im NVIC freigegeben worden?
Also es wird innerhalb des Start-Codes zumindest das hier aufgerufen: hri_eic_set_CTRLA_ENABLE_bit(EIC); NVIC_DisableIRQ(EIC_5_IRQn); NVIC_ClearPendingIRQ(EIC_5_IRQn); NVIC_EnableIRQ(EIC_5_IRQn); NVIC_DisableIRQ(EIC_6_IRQn); NVIC_ClearPendingIRQ(EIC_6_IRQn); NVIC_EnableIRQ(EIC_6_IRQn);
Das hier steht bei uns in SAMR21-Code drin (SAMD21 + AT86RF233):
1 | PM->APBAMASK.reg |= PM_APBAMASK_EIC; |
2 | GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_EIC | GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(0); |
3 | EIC->CTRL.bit.ENABLE = 0; |
4 | while (EIC->STATUS.bit.SYNCBUSY); |
5 | EIC->CONFIG[0].bit.SENSE0 = EIC_CONFIG_SENSE0_HIGH_Val; |
6 | EIC->INTENSET.bit.EXTINT0 = 1; |
7 | EIC->CTRL.bit.ENABLE = 1; |
8 | while (EIC->STATUS.bit.SYNCBUSY); |
9 | |
10 | NVIC_EnableIRQ(EIC_IRQn); |
Ich müsste jetzt auch im Datenblatt nachlesen gehen, was das alles genau macht …
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.