Прерывание STM32 не срабатывает

Я использую 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 (без разницы).

Нужно ли что-то еще для запуска функции прерывания?

не уверен, но, возможно, необходимо глобально включить прерывания или назначить приоритет вашему конкретному прерыванию? Является EXTI0_IRQnконстантой или должно быть что-то вроде EXTI0_IRQ0?
@MarcusMüller Это константа, и я проверю установку приоритета, спасибо за замечание.
@PeterJ Спасибо... Я проверю, __HAL_RCC_GPIOA_CLK_ENABLE(); Я уже сделал (также для GPIOC и GPIOD.
@Маркус Мюллер - у тебя когда-нибудь был контакт с этими микробами? Я думаю, ты не
@PeterJ Я не знаю, почему ты такой грубый, я явно выразил смутное подозрение. Да, я раньше работал с stm32f1, но без корявой библиотеки HAL. Извините, если у меня нет документов на все микроконтроллеры, с которыми я работал в своей голове.
@Маркус Мюллер, это общие сведения о микроконтроллерах STM. 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, используемой кодировщиками с открытым регистром.

Ответы (1)

Выполните шаги из моего комментария. Вот пример кода. У меня были другие аппаратные соединения, поэтому я использовал другие контакты.

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;            
    }
}

один контакт включает светодиод, другой выключается

Спасибо за этот комментарий, я использую HAL, поэтому сначала мне нужно выяснить, что означают все эти числа (хорошее упражнение для меня). Кстати, есть ли причина, по которой вы используете PC13 в качестве входа, поскольку для моей платы PC13 подключен к выходу (встроенный светодиод)?
У меня только одна плата со 103, так как это устаревшее семейство микро. И на этой плате у меня другие подключения, чем на "блюпиле". Просто поменяйте на тот, что у вас есть. Я просто хотел дать вам рабочий пример, поэтому я проверил его на своем реальном оборудовании.
Когда я пришел домой, он внезапно заработал (единственное изменение: я взял макетную плату, включая stm32, на машине) ... так что, возможно, это была какая-то электронная проблема (ослабленный провод). Но я изучу ваш пример, чтобы увидеть разницу между Хэлом и «прямыми звонками».
Я честно советую путь голых регистров.
Вы имеете в виду "во всех случаях"? Обычно я программирую на языках более высокого уровня, и до сих пор мне нравится, как работает Хэл, но я действительно только начал... если это вызвано какой-то "странной особенностью" Хэла, то, вероятно, скоро я уже не буду так доволен Хэлом. .
I program in higher level languages?? Микроконтроллеры? C или C++ идеально подходят для программирования с открытым регистром.
Я не это имел в виду... Я имею в виду, что Хэл выглядит намного проще (и, конечно, он скрывает за собой немного мыслей). С февраля я начал с Arduino (IDE), с прошлого месяца STM32, я становлюсь все глубже и глубже (в этом нет ничего плохого, просто мой «первоначальный предполагаемый проект» кажется все дальше и дальше. Ваш код - это периферийная библиотека?
Ни один SPL не мертв и не поддерживается годами. Просто включите заголовки CMSIS, скачайте Справочное руководство и наслаждайтесь :)
Я проверю (извините пока не исключаю HAL/CubeMx)
Для тех, кто хочет прочитать объяснение этого ответа: embedded-lab.com/blog/stm32-external-interrupt