Я использую STM32F103C8T6 (он же синяя таблетка).
GPIO Init и обработчик прерываний:
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);
}
Проблема в том, что обработчик прерывания (EXTI0_IRQHandler) никогда не вызывается. Я пробовал и с другими контактами (например, с помощью EXTI15_10_IRQHandler). Я проверил переключатель и светодиод отдельно (в основной функции), и они работают. Я также пробовал с PULLUP и PULLDOWN (без разницы).
Нужно ли что-то еще для запуска функции прерывания?
Выполните шаги из моего комментария. Вот пример кода. У меня были другие аппаратные соединения, поэтому я использовал другие контакты.
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;
}
}
один контакт включает светодиод, другой выключается
I program in higher level languages
?? Микроконтроллеры? C или C++ идеально подходят для программирования с открытым регистром.
Маркус Мюллер
EXTI0_IRQn
константой или должно быть что-то вродеEXTI0_IRQ0
?Мишель Кейзерс
Мишель Кейзерс
0___________
Маркус Мюллер
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.
у этих двоих нет ничего общего. Эти определения являются частью CMSIS, используемой кодировщиками с открытым регистром.