Ich verwende einen STM32F103C8T6 (auch bekannt als blaue Pille).
GPIO-Init und Interrupt-Handler:
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);
}
Das Problem ist, dass der Interrupt-Handler (EXTI0_IRQHandler) nie aufgerufen wird. Ich habe es auch mit anderen Pins versucht (zB mit EXTI15_10_IRQHandler). Ich habe den Schalter und die LED separat geprüft (in der Hauptfunktion) und die funktionieren. Ich habe es auch mit PULLUP und PULLDOWN versucht (was keinen Unterschied macht).
Wird mehr benötigt, um die Interrupt-Funktion auszulösen?
Führen Sie die Schritte aus meinem Kommentar aus. Hier ist der Beispielcode. Ich hatte eine andere Hardware-Verbindung, also habe ich andere Pins verwendet.
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;
}
}
Ein Pin schaltet auf ein anderes führt aus
I program in higher level languages
?? Mikrocontroller? C oder C++ sind perfekt für die Bare-Register-Programmierung
Markus Müller
EXTI0_IRQn
eine Konstante oder sollte es so etwas seinEXTI0_IRQ0
?Michel Keijzers
Michel Keijzers
0___________
Markus Müller
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.
die beiden haben nichts gemeinsam. Diese Definitionen sind Teil des CMSIS, das von den Bare-Register-Codierern verwendet wird.