Estoy usando un STM32F103C8T6 (también conocido como píldora azul).
GPIO Init y manejador de interrupciones:
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
/*Configure GPIO pins : PC13 PC15 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while(1);
}
void EXTI0_IRQHandler(void)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_14);
}
El problema es que nunca se llama al manejador de interrupciones (EXTI0_IRQHandler). Probé también con otros pines (por ejemplo, usando EXTI15_10_IRQHandler). Revisé el interruptor y el LED por separado (en la función principal) y funcionan. También probé con PULLUP y PULLDOWN (que no hace ninguna diferencia).
¿Se necesita más para activar la función de interrupción?
Siga los pasos de mi comentario. Aquí está el código de muestra. Tenía conexiones de hardware diferentes, así que usé pines diferentes.
int main(void) {
RCC->APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
//confure PB2 PC13 as inputs, PB0 output
AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI2_PB;
AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PC;
EXTI->IMR = EXTI_IMR_MR2 | EXTI_IMR_MR13;
EXTI->RTSR = EXTI_RTSR_TR2;
EXTI->FTSR = EXTI_FTSR_TR13;
NVIC_EnableIRQ(EXTI2_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
while (1);
}
void EXTI2_IRQHandler(void) {
if (EXTI->PR & EXTI_PR_PR2) {
EXTI->PR = EXTI_PR_PR2;
GPIOB -> ODR |= GPIO_ODR_0;
}
}
void EXTI15_10_IRQHandler(void) {
if (EXTI->PR & EXTI_PR_PR13) {
EXTI->PR = EXTI_PR_PR13;
GPIOB -> ODR &= ~GPIO_ODR_0;
}
}
un pin enciende el led otro se apaga
I program in higher level languages
?? ¿Microcontroladores? C o C ++ son perfectos para la programación de registros desnudos
marcus muller
EXTI0_IRQn
una constante o debería ser algo comoEXTI0_IRQ0
?michel keijzers
michel keijzers
0___________
marcus muller
0___________
EXTI0_IRQn a constant or should it be something like EXTI0_IRQ0
????I've been working with stm32f0 before, but without the clunky HAL lib.
esos dos no tienen nada en común. Esas definiciones son parte del CMSIS utilizado por los codificadores de registro simple.