Внешние прерывания stm32f100ret6b

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
supercelt
Открыл глаза
Сообщения: 68
Зарегистрирован: Вс авг 02, 2015 18:02:38

Внешние прерывания stm32f100ret6b

Сообщение supercelt »

Помогите с внешними прерываниями.
Совсем запутался, потмогие плз. Везде в уроках рассматривают прерывания на 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();
}
}
Подаю на пины pb11, 12,13,14 и светодиод (PD2) не загорается. В прерывание не входит. Делаю в кеиле5. Запустил отладчик, смотрю регистр NVIC. в регистрах ISPR1 и ICPR1 появляется значение 0x100 и на этом всё (
Реклама
supercelt
Открыл глаза
Сообщения: 68
Зарегистрирован: Вс авг 02, 2015 18:02:38

Re: Внешние прерывания stm32f100ret6b

Сообщение supercelt »

кому пригодиться. Решение проблемы:

Код: Выделить всё

void EXTI15_10_IRQHandler(void)
{
EXTI->PR |= EXTI_PR_PR11 | EXTI_PR_PR12 | EXTI_PR_PR13 | EXTI_PR_PR14;
GPIOD->ODR ^= 0x4;
}
Поменять местами строчки. Сначало сбрасывать PR, потом делать всё остальное. Это баг ARM, о котором все молчат ©
Реклама
Ответить

Вернуться в «Разные вопросы по МК»