STM32F3xx с Eclipse IDE, Hardfault_Handler из-за неудачной выборки векторных таблиц - PullRequest
0 голосов
/ 04 февраля 2020

Сначала я хочу сказать, что я новичок ie в этой области. Я пытаюсь загрузить и отладить код на плате, изготовленной на заказ на основе чипа STM32F303CB, через плату NUCLEO-F446RE. Я использую Eclipse IDE (2019-12), набор инструментов GNU и программное обеспечение для отладки S-GGER J-Link.

Код успешно создается без ошибок, в любом случае при запуске отладки вызывается HardFault_handler. Код был написан не мной. Я сомневаюсь, что проблема в самом коде (он строит), и скорее думаю, что некоторые настройки инструментов не верны (поправьте меня, если я ошибаюсь). Я также попробовал ту же процедуру на нескольких платах, поэтому я бы исключил также проблему с оборудованием.

Отладчик зависает при инициализации USB в функции MX_USB_Init () , что приводит к HardFault_handler , При отладке в одношаговом режиме большинство функций в MX_USB_init () выполняются успешно, за исключением USBD_Start (& hUsbDeviceFS) . При входе в USBD_Start (...) он прибывает в то время как (1) l oop из HardFault_handler. При отладке в режиме возобновления (без одного шага) отладчик также зависает на предыдущих функциях, которые правильно работают в одношаговом режиме, таких как HAL_PCD_Init (& hpcd_USB_FS) , HAL_PCDEx_PMAConfig , USBD_RegisterClass (& hUsbDeviceFS, & USBD_CD C) , USBD_CDC_RegisterInterface (& hUsbDeviceFS, & USBD_Interface_fops_FS) и снова USBD_Start (& hS * 101 * * * * * * * * * *) * 101 * 10 * 8 * 8 * 9: 8 * 9 * 9 * 9 * 9: 9 * 9 * 9 * 9 * 9: 9D9: 9 * 8 * 9: 9D9: 9109: 9109: 9109: 98: 99: 9 * 8 * 9: 9 * 9 * 99D9) 9 1022 * Я смог уточнить проблему, но пока не решил ее. Я закомментировал пустую функцию Hardfault_Handler () в stm32f3xx_it. c, сгенерированную CubeMX, и вызвал вызов функции CMSIS Hardfault_Handler () по умолчанию в обработчиках exception_handlers. c. Делая это в консоли отладки, я получаю значения нескольких регистров:

 SEGGER J-Link GDB Server V6.60f - Terminal output channel
[HardFault]
Stack frame:
 R0 =  00000000
 R1 =  0000BF00
 R2 =  40005C00
 R3 =  00000001
 R12 = 0000E000
 LR =  FFFFFFF9
 PC =  F3EF8008
 PSR = 6000005B
FSR/FAR:
 CFSR =  00000001
 HFSR =  40000000
 DFSR =  00000000
 AFSR =  00000000
Misc
 LR/EXC_RETURN= FFFFFFF1
Connection closed by the GDB server.

Затем в книге «Освоение STM32» я читаю о следующих значениях приведенных выше значений регистров:

LR = FFFF FFF9 - ЦП выполнял «обычный код» (ЦП находился в режиме потока), когда вызывалось исключение Hard Fault. Это не было прерыванием. Использовался стек MSP, модуль FPU отключен.

HFSR = 4000 0000 - установлен бит VECTBL, который указывает, что неисправность вызвана неудачной выборкой таблицы векторов . Объяснение следующее:

Ошибка шины, полученная при выборке таблицы векторов. Это происходит потому, что таблица векторов недопустима (в большинстве случаев мы забыли включить файл сборки, предоставленный ST, или забыли изменить его расширение с нижнего .s на прописной .S).

В моем проекте нет файла .s или .S, и ни одна функция не ссылается на такой файл. Это заставляет меня думать, что, возможно, программист пытается записать неправильный адрес в памяти, потому что нет подходящего файла запуска. Имеет ли это смысл для вас?

Заранее спасибо!

РЕШЕНИЕ: Оказалось, что файл .S действительно отсутствует. Я решил проблему, создав новый фиктивный проект для моего MCU с использованием CubeMX и сгенерировав код для других IDE (GPDS C). Затем я скопировал сгенерированный файл .s (в моем случае startup_stm32f303x c .s) в папку system-> sr c -> cmsis исходного проекта и удалил файлы system_DEVICE. c и vectors_DEVICE. * 1054. *. Я изменил расширение файла с маленького .s на прописной .S, скомпилировал проект, и затем мне удалось набрать sh и успешно отладить микроконтроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...