Как отключение JTAG может (не перезапустить, а) разморозить устройство, ранее замороженное до подключения JTAG? - PullRequest
1 голос
/ 12 апреля 2019

Мы запрограммировали STM32L072, используя для нижних уровней библиотеку HAL, сгенерированную из cubeMX.

Обратите внимание, что «стиль программирования» на моем предприятии не предусматривает включение сторожевого таймера во встроенные устройства.Без комментариев.

Во время одного конкретного полевого теста (из многих) устройство перестало работать (т. Е. Зависание экрана и отсутствие ответа на шине связи, но драйвер ШИМ работал) .

Устройство было перезапущено, и после нескольких минут работы зависание произошло снова.Это случилось несколько раз, прежде чем мы прибыли.

Мы подключили JTAG / ST-LinkV2, и ничего не изменилось на шине или экране.Как только мы отключили флэшер, устройство возобновило работу без сброса (мы могли бы распознать шаблон инициализации, если бы это произошло).

  • Я не понимаю, как спецификация JTAG могла объяснить это поведение(то есть разморозка)?
  • Кстати, что может вызвать замораживание, которое может быть разморозлено отключением JTAG?Осциллятор остановлен?Авто спальные режимы?аппаратная точка останова?программная точка останова?Прерывания отключены?

EDIT - Ответ на комментарии и резюме:

  • Не является причиной генератора, поскольку ШИМ все еще работает.
  • Программная точка останова?маловероятно, поскольку ни один из них не был установлен до перепрограммирования программы.
  • Что касается прерываний, я думаю, что это интересное преимущество, но как JTAG может что-то изменить, отключив его?

1 Ответ

2 голосов
/ 12 апреля 2019

Трудно определить, не зная больше о вашем программном обеспечении.Если ШИМ работает, генератор явно не остановился.Похоже, в коде может быть встроенная программная команда точки остановаОтладка на кристалле по умолчанию не останавливает периферийные часы при достижении точки останова.

Такие инструкции следует защищать, чтобы блокировать только при подключенном отладчике host (т. Е. Программном обеспечении отладчика, а не только физическом оборудовании JTAG), например:

if (CoreDebug->DHCSR & 1) __BKPT(0);

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

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

...