Что-то мне кажется, что это случай "виноват компилятор". Просто баг
в коде, и программа творит дикости, затирает коэффициенты ФАПЧ и
выводит из режима тактовый генератор. Тактирование сбоит и падает.
А виноват чип... Уточните, при RESET ОЗУ затирается или сохраняется? Если сохраняется, то при входе в функцию, пишите массив ячееек номер функции и метку времени по таймеру, когда происходил переход.
Можете отдельно записывать вход и выход, если это прерывания.
Когда завистнет, перегружайте. В стартапе защитите упомянутые ячейки от затирания и изучите состояние. Так локализуете хотя бы фнукцию, где происходит сбой, если дело в коде. Может, и не лоаклизуете, если баг более сложный и действительно связан с кристаллом.
В крайнем случае, настройте порт, несколько бит, на выход и пишите в порт код функции, в которую случился переход. И захватывайте сигналы внешним логическим анализатором. Хотя бы чтобы выяснить, в одном ли месте происходит сбой.
Ещё, если есть нюансы с тактированием памяти, WAIT STATES и подобным - перепроверьте. Если память настроена нештатно, то могут быть аппаратные сбои и особенно при повышенной нагрузке на шины, когда исполняется код после LTO.
P.S. Все предупреждения в компиляторе включены? Типа -Wall и -Werror (синтаксис навскидку).