STM32CubeIDE HAL — генерируемые прерывания EXTI не будут срабатывать — STM32F4

#arm #stm32 #stm32f4 #stm32cubeide

Вопрос:

Я создал (до сих пор) простой проект для микроконтроллера STM32F411 в STM32CubeIDE. При использовании графического конфигуратора для включения аппаратного прерывания EXTI для моих выводов (изначально я хотел использовать вывод PB5, но добавил, PB8, а просто торчит на моей печатной плате и PA0, так как имеет кнопку, прикрепленную между ним и землей) он генерирует код конфигурации для моего main.cpp (для поколения я переименовать его в основной.с таким конфигуратор видит его), он создал правильные обработчики событий, к которому я добавил метод HAL_GPIO_EXTI_Callback , согласно инструкции stm32f4xx_hal_gpio.c , однако, прерывает не уволили. Точки останова не заданы, последовательный вывод отсутствует.

Я настроил эти контакты на использование EXTI, настроил их соответствующие подтягивания/опускания и т. Д. В соответствии с моими потребностями (хотя пытался изменить это безрезультатно). Я включил эти прерывания (EXTI line0 и EXTI line[9:5]) на странице NVIC, последовал бесчисленным руководствам по этой проблеме (например, этому: https://www.waveshare.com/wiki/STM32CubeMX_Tutorial_Series:_EXTI, также официальный youtube-канал ST Electronics).

Моя плата-китайская черная таблетка на основе STM32F411CEU. Полный код можно посмотреть здесь: https://github.com/domints/LoadCellCWManipulator (последняя фиксация, для дальнейшего использования f4330cd6066f227f5cf3d3ea619adcc810025b72 ).

Может быть, я чего-то не понимаю? Весь остальной код, который я пробовал до сих пор, работает без проблем. Может быть, в CubeIDE чего-то не хватает во время генерации, и мне нужно что-то написать от руки?

Я пытаюсь использовать C (хотя в IDE предположительно есть такие опции, что это усложняет задачу), так как я исхожу из более высокого уровня фона.

Комментарии:

1. Код библиотеки-C, основной-C , поэтому HAL_GPIO_EXTI_Callback его следует объявить как extern "C" . Без этого слабый заглушка из библиотеки вызывается из прерывания

2. @Flexz, я попробую это, спасибо, хотя меня беспокоит то, что точки EXTI9_5_IRQHandler доступа и EXTI0_IRQHandler методы stm32f4xx_it.c также не срабатывают, а код, вставленный между комментариями USER CODE BEGIN EXTI9_5_IRQn 1 , также не выполняется 🙁 ПРАВКА: я добавил эти внешние HAL_GPIO_EXTI_Callback элементы, и он даже остановился на точках останова stm32f4xx_it.c … Странный…

3. @Flexz Я удалил эти внешние эффекты сейчас, и это все еще работает. Вчера я перепробовал все, включая перезагрузку ПК, повторное подключение как ST-Link, так и Blue Pill, но безуспешно. Сегодня я начал свой день с создания этого вопроса, и теперь, хотя все работало и было подключено в течение всей ночи, по какой-то причине это работает. Это обычный способ работы с STMS? Это то, к чему тебе просто нужно привыкнуть? РЕДАКТИРОВАТЬ: Одна вещь, которую я помню, я мог бы сделать сегодня, а не вчера — для очистки git я удалил папку отладки…

4. Я просмотрел stm32f4xx_hal_gpio.h файл, и HAL_GPIO_EXTI_Callback там объявлен прототип, с. extern "C" Поэтому указывать его в исходном файле не требуется, если заголовок включен прямо или косвенно. STMs редко создает странные проблемы, и их библиотеки могут быть уродливыми, но не прослушиваться. Ваша проблема может быть связана с переименованием main.c в main.cpp и обратно, это может каким — то образом нарушить систему сборки-вот почему помогла очистка старых встроенных файлов.