STM32F3xx с Eclipse IDE, Hardfault_Handler из-за сбоя выборки таблицы векторов

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

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

Отладчик зависает при инициализации USB в функции MX_USB_Init(), что приводит к HardFault_handler. При отладке в пошаговом режиме большинство функций в MX_USB_init() выполняются успешно, за исключением USBD_Start(&hUsbDeviceFS). При переходе в USBD_Start(...) он попадает в цикл while(1) HardFault_handler. При отладке в режиме возобновления (ни один шаг), отладчик также повесить бы на предыдущих функций, которые работают должным образом в пошаговом режиме, как HAL_PCD_Init(&hpcd_USB_FS), HAL_PCDEx_PMAConfig, USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC), USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) и снова USBD_Start(&hUsbDeviceFS).

РЕДАКТИРОВАТЬ: я смог уточнить проблему, но еще не решил ее. Я закомментировал пустую функцию 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, который указывает, что Hard Fault вызван неудачной выборкой таблицы векторов. Объяснение таково:

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

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

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

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

0 ответов

Другие вопросы по тегам