Совсем запутался, потмогие плз. Везде в уроках рассматривают прерывания на 0, максимум 1 пинах, но если надо повесить на пины больше 10, уже путанница.
Надо зажигать светодиод, когда на пинах PB11, 12,13,14 лог 1.
Код: Выделить всё
void EXTI3_IRQHandler(void)
{
GPIOD->ODR ^= 0x4;
EXTI->PR |= EXTI_PR_PR11;
}
void EXTI4_IRQHandler(void)
{
GPIOD->ODR ^= 0x4;
EXTI->PR |= EXTI_PR_PR11 | EXTI_PR_PR12 | EXTI_PR_PR13 | EXTI_PR_PR14;
}
int main(void){
RCC->APB2ENR |= RCC_APB2ENR_IOPDEN; //PORT D CMD
GPIOD->CRL &= ~GPIO_CRL_CNF2_0;
GPIOD->CRL |= GPIO_CRL_MODE2_1;
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;
GPIOB->CRH &= ~(GPIO_CRH_CNF11_0 | GPIO_CRH_CNF12_0 | GPIO_CRH_CNF13_0 | GPIO_CRH_CNF14_0);//Scan Pins: PB11, PB12, PB13, PB14.
GPIOB->CRH |= GPIO_CRH_CNF11_1 | GPIO_CRH_CNF12_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1; //Input Push-down.
GPIOB->CRL &= ~(GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0); //Generate Pins: PB5, PB6, PB7, PB8.
GPIOB->CRH &= ~GPIO_CRH_CNF8_0;
GPIOB->CRL |= GPIO_CRL_MODE5_1 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1; //Output Push-pull.
GPIOB->CRH |= GPIO_CRH_MODE8_1;
GPIOB->BSRR |= 0x1E0;
//-------Setup EXTI-------------------------------
AFIO->EXTICR[2] |= AFIO_EXTICR3_EXTI11_PB;
AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI12_PB | AFIO_EXTICR4_EXTI13_PB | AFIO_EXTICR4_EXTI14_PB | AFIO_EXTICR4_EXTI15_PB;
EXTI->RTSR |= EXTI_RTSR_TR11 | EXTI_RTSR_TR12 | EXTI_RTSR_TR13 | EXTI_RTSR_TR14;
EXTI->IMR |= EXTI_IMR_MR11 | EXTI_IMR_MR12 | EXTI_IMR_MR13 | EXTI_IMR_MR14;
NVIC_EnableIRQ(EXTI3_IRQn);
NVIC_EnableIRQ(EXTI4_IRQn);
__enable_irq();
//------------------------------------------------
while(1){
__NOP();
}
}
