En mi proyecto basado en stm32F107, uso cuatro pines (PINE 12-15) para alcanzar un nivel creciente en ellos.
Mi problema: dos pines siempre producen interrupciones externas pero no hay un nivel ascendente en ellas y otros dos pines nunca responden a un nivel creciente.
Mi pregunta: estoy buscando algunas formas de depuración y pueden ser consejos. Puede que leer algunos registros en la rutina de interrupción ayude a resolver mi problema.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
// KeyI_0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_Pin_12);
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
EXTI_Init(&EXTI_InitStructure);
// KeyI_1
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_Pin_13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_Init(&EXTI_InitStructure);
// KeyI_2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_Pin_14);
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_Init(&EXTI_InitStructure);
// KeyI_3
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_Pin_15);
EXTI_InitStructure.EXTI_Line = EXTI_Line15;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_Init(&NVIC_InitStructure);
void EXTI15_10_IRQHandler(void)
{
printf("exti\n");
if (EXTI_GetFlagStatus(EXTI_Line12) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line12);
printf("key1\n");
//keyboard_StringStart(0);
} else if (EXTI_GetFlagStatus(EXTI_Line13) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line13);
printf("key2\n");
//keyboard_StringStart(2);
} else if (EXTI_GetFlagStatus(EXTI_Line14) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line14);
printf("key3\n");
//keyboard_StringStart(3);
} else if (EXTI_GetFlagStatus(EXTI_Line15) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line15);
printf("key4\n");
//keyboard_StringStart(1);
}
}