STM32F091 probleem met interrupt handler

Hallo iedereen,

Ik zit met een probleem bij de programmatie van de STM32F091.
Ik wil namelijk een LED aan laten schakelen via een drukknop aangesloten op PB0 en een LED laten doven via PC1, het moeilijke hieraan is dat dit moet gebeuren via interrupt handlers, ik kan beide drukknoppen aanspreken maar er het is slecht bij het drukken op de drukknop aan PB0 dat er iets gebeurd bij PC1 doet hij niks.

PC1:

c code:


//PC1 ==> SW4
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PC;
EXTI->IMR = EXTI_IMR_MR1;
EXTI->RTSR = EXTI_RTSR_TR1;
EXTI->FTSR = EXTI_RTSR_TR1; /* (5) */

PB0:

c code:


//PB0 ==> SW3
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB;
EXTI->IMR = EXTI_IMR_MR0; 
EXTI->RTSR = EXTI_RTSR_TR0;
EXTI->FTSR = EXTI_RTSR_TR0; /* (5) */

En dan roep ik onder deze code de interrupt handler op maar het probleem is dat hij enkel de code uitvoert van PC0, terwijl ik ook een if structuur gemaakt heb voor PC1 kan iemand mij hiermee helpen

c code:


NVIC_EnableIRQ(EXTI0_1_IRQn); /* (6) */
NVIC_SetPriority(EXTI0_1_IRQn,0); /* (7) */

De code die ik laat uitvoeren in de handler is puur als test er zou een ledje moeten togglen als ik op 1 van de 2 drukknoppen druk maar dit werkt in mijn geval enkel bij SW3.

Code Handler:

c code:


void EXTI0_1_IRQHandler(void)
{
  if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1)  /* Check line 0 has triggered the IT */
  {
    EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */
    GPIOC->ODR ^= (1<<0); /* Toggle green led on PC9 */
  }
  if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0)  /* Check line 0 has triggered the IT */
  {
    EXTI->PR = EXTI_PR_PR0; /* Clear the pending bit */
    GPIOC->ODR ^= (1<<0); /* Toggle green led on PC9 */
  }
}

Het volledige zip bestand van dit project kan u vinden via deze link op mijn dropbox.

Alvast Bedankt,
Mvg Sandeerius

Je overschrijft mogelijks de register waarden, i.e. je gebruikt = waar je |= moet gebruiken.

c code:


//PC1 ==> SW4
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PC;
EXTI->IMR = EXTI_IMR_MR1;
EXTI->RTSR = EXTI_RTSR_TR1;
EXTI->FTSR = EXTI_RTSR_TR1; /* (5) */

//PB0 ==> SW3
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB;
EXTI->IMR |= EXTI_IMR_MR0; 
EXTI->RTSR |= EXTI_RTSR_TR0;
EXTI->FTSR |= EXTI_RTSR_TR0; /* (5) */
 

Daarnaast lijkt het resetten van de interrupt flag ook niet 100%.

c code:


EXTI->PR &= !EXTI_PR_PR1;

Dank je wel voor de tip nu werkt alles weer ! :p