Пробую сделать внешнее прерывание по изменению состояния на выводе порта B (пробовал на выводах 3, 6, 7). Делаю вроде все как "по учебнику", но в обработчик прерывания не входит. Хотя если изменить состояние вывода порта А (при запрограммированном прерывании на порт B ) срабатывает обработчик прерывания. Проверял на STM32F100R и на STM32F103R, на обеих контроллерах та же история.
Компилятор CooCox CoIDE (Toolchain arm-2011.03-coocox).
Делаю так:
Код
NVIC_InitTypeDef v;
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef e;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Peri
ph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
v.NVIC_IRQChannel = EXTI3_IRQn;
v.NVIC_IRQChannelCmd = ENABLE;
v.NVIC_IRQChannelPreemptionPriority = 0;
v.NVIC_IRQChannelSubPriority = 0;
NVIC_Init (&v);
e.EXTI_Line = EXTI_Line3;
e.EXTI_LineCmd = ENABLE;
e.EXTI_Mode = EXTI_Mode_Interrupt;
e.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&e);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef e;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Peri
ph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
v.NVIC_IRQChannel = EXTI3_IRQn;
v.NVIC_IRQChannelCmd = ENABLE;
v.NVIC_IRQChannelPreemptionPriority = 0;
v.NVIC_IRQChannelSubPriority = 0;
NVIC_Init (&v);
e.EXTI_Line = EXTI_Line3;
e.EXTI_LineCmd = ENABLE;
e.EXTI_Mode = EXTI_Mode_Interrupt;
e.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&e);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
Обработчик прерывания:
Код
void EXTI3_IRQHandler()
{
LED_PORT->ODR ^= GPIO_Pin_9;
UARTSend("Privet\r\n");
EXTI_ClearITPendingBit (EXTI_Line3);
}
{
LED_PORT->ODR ^= GPIO_Pin_9;
UARTSend("Privet\r\n");
EXTI_ClearITPendingBit (EXTI_Line3);
}