Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
3555
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

B. Руководство по поиску и устранению неисправностей

766

Микропрограмма работает только в режиме отладки

Это происходит потому, что по умолчанию для проектов, созданных с помощью плагина GNU MCU Eclipse, включена поддержка полухостинга. Как описано в Главе 5, полухостинг ARM основан на инструкции BKPT ассемблера ARM, которая останавливает выполнение ЦПУ в ожидании действий отладчика. Даже если мы не используем ни одну из процедур трассировки, предоставляемых цепочкой инструментов, startup-процедуры запуска, написанные Ливиу Ионеску, используют полухостинг для вывода регистров ЦПУ при запуске микропрограммы (вы можете взглянуть на процедуру _start() в файле system/src/newlib/_startup.c). Поэтому чтобы избежать остановки микроконтроллера, когда он не находится в сеансе отладки, мы можем отключить полухостинг, удалив макрос OS_USE_SEMIHOSTING на уровне проекта, как описано в Главе 5.

Проблемы, связанные с STM32

В этом разделе содержится список часто возникающих проблем, связанных с программированием микроконтроллеров STM32.

Микроконтроллер не загружается корректно

Хотя это может показаться странным, существует довольно длинный перечень причин, по которым STM32 отказывается запускаться должным образом. Эта проблема обычно имеет следующие симптомы:

микропрограмма не запускается

Счетчик команд указывает на полностью недопустимый адрес (обычно 0xfffffffd или 0xfffffffe, но возможны и другие адреса в 4 ГБ области памяти), как показывает Eclipse во время сеанса отладки.

Чтобы решить эту проблему, нам нужно различать два случая: вы разрабатываете микропрограммное обеспечение для отладочной платы, такой как Nucleo, или для разработанной вами платы (это различие просто для упрощения анализа).

Если вы разрабатываете микропрограмму, используя отладочную плату, особенно если вы новичок в этой платформе (но усталость может сыграть неприятную шутку даже с опытными пользователями...), вероятно, могут быть неправильными два момента:

B. Руководство по поиску и устранению неисправностей

767

Определение секций памяти в файле mem.ld скрипта компоновщика неверно ни для области Flash-памяти, ни для области SRAM (обычно область Flash-памяти всего на всего не начинается с 0x08000000).

Неправильный startup-файл запуска или вы просто забыли переименовать его расширение со строчной .s на заглавную .S.

Если вместо этого вы разрабатываете микропрограмму для собственной платы, то помимо контроля двух предыдущих пунктов вы также должны проверить следующее:

Правильность конфигурации выводов BOOT (по крайней мере, вывод BOOT0 точно заземлен, а BOOT1 плавающий).

Вывод NRST правильно развязан с помощью конденсатора емкостью 100 нФ.

Иногда бывает так, что даже если все предыдущие пункты верны, микроконтроллер все равно отказывается запускаться. Это часто происходит внезапно после сеанса отладки или после тестирования микропрограммы с багами, написанной с использованием записи во внутреннюю Flash-память. Еще один узнаваемый симптом в том, что ни один OpenOCD не может загрузить микропрограмму на микроконтроллер. Если это так, вероятно, у вас повреждена область памяти байтов конфигурации (Option bytes). STM32CubeProgrammer может очень помочь вам в отладке такой ситуации. После того, как вы подключите отладчик ST-LINK, перейдите в раздел Option bytes и убедитесь, что конфигурация BOOT (в разделе User configuration) правильно соответствует вашему микроконтроллеру.

В конце концов, иногда полное стирание чипа также может помочь в решении непонятных проблем с зупуском ;-)

B. Руководство по поиску и устранению неисправностей

768

Невозможно загрузить микропрограмму или отладить микроконтроллер

Иногда бывает, что не удается загрузить микропрограмму на микроконтроллер или отладить его с помощью OpenOCD. Еще один узнаваемый симптом в том, что светодиод LD1 отладчика ST-LINK (тот, который попеременно мигает красным и зеленым, пока плата находится в процессе отладки) перестает мигать и остается замороженным, когда оба светодиода включены.

Когда это происходит, это означает, что отладчик ST-LINK не может получить доступ к порту отладки (через интерфейс SWD) целевого микроконтроллера или Flash-память заблокирована, предотвращая ее доступ к отладчику. Обычно существует две причины, которые приводят к этому неисправному состоянию:

Выводы SWD были сконфигурированы как GPIO общего назначения (это часто случается, если мы выполняем сброс конфигурации выводов в CubeMX).

Микроконтроллер находится в режиме глубокого сна с пониженным энергопотреблением, который отключает порт отладки.

Что-то не так с конфигурацией байтов конфигурации (возможно, Flash-память защищена от записи или включен уровень 1 защиты от чтения).

Чтобы решить эту проблему, мы должны заставить отладчик ST-LINK подключиться к целевому микроконтроллеру, сохраняя при этом низкий уровень на выводе nRST. Эта операция называется подключением при сбросе (connection under reset), и ее можно выполнить с помощью инструмента STM32CubeProgrammer, выбрав режим аппаратного сброса Hardware reset выпадающем списке Reset mode, как показано ниже.

Эту же операцию можно выполнить в OpenOCD, но с несколькими дополнительными шагами. Прежде всего, мы должны сказать OpenOCD «подключиться при сбросе», изменив файл конфигурации нашей платы (например, для Nucleo-F0 мы должны изменить файл board/st_nucleo_f0.cfg). В этом файле вы найдете команду reset_config, которую нужно вызывать другим способом:

reset_config srst_only connect_assert_srst

Затем мы должны запустить OpenOCD и подключиться к консоли telnet через порт 4444 и ввести команду reset halt:

$telnet localhost 4444 > reset halt

Теперь появится возможность снова перепрограммировать микроконтроллер или, в конечном итоге, выполнить массовое стирание.