Возможно, у вас большая цепочка вызовов функций, при том что RAM и так занят, а там еще какое-нибудь прерывание стэк жрет - и в какой-то момент стэка однажды не хватает? Далее возможны варианты. Если у вас стэк был НАД переменными - вообще скажите спасибо что упало в hard fault а не просто глючило, перетерев стэком область переменных.
И не знаю как в кейле а gcc умеет репортить использование стэка и показывать наиболее прожорливые по стэку функции, вот как раз на такие случаи. Может прошляпить что-нибудь типа рекурсии или VLA, но так делать не надо. Наверное и в кейле что-то такое есть? Ну и как-то странно вы 7 лет эти штуки программили что не можете убедить их стэк константой заполнить. А "Как всё-таки окрасить стек, куда правильно воткнуть эту функцию?" - ответ на этот вопрос требует как минмум знания лэйаута RAM и понимания кто и что делает до и после вызова этой функции. И как это в кейле.
Я бы вообще
1) сперва проверил что ваша конструкция вменяемое значение адреса стэка в принципе возвращает.
2) а потом - что начало и конец стэка не перепутаны, что из вашего описания не совсем очевидно. А start действительно меньше top?
3) и хрен его знает насколько там оптимизатор прикалывается, оптимизатор на раз видит что результат нигде не используется и норовит забить на всю операцию. Формально volatile есть но лучше проверить что код по факту сгенерился и вызывается.
4) кто-нибудь опосля может что-то инициализировать наверное.
А так - я например стэк повесил в самом низу, если переполняется - hard fault сразу, за факт обращения ниже 0x20000000, еще на моменте сохранения в стэк процом. Порушиться соответственно не успевает (однако часть стэкфрейма потеряна, корректно вернуться нельзя, равно как и трейс будет инопланетный). А у handler'ов на такой случай я свой стэк в msp, выше основного сделал, так они свой стэк получат в любом случае. В L15x наверное можно MPU и без этого обойтись, но в F1xx MPU нету...
Перешёл по этому адресу, а там космос,
При переполнении стэка код дуреет а состояние системы разрушено. Может быть что угодно - состояние системы нельзя считать достоверным. Бывает и похуже чем harffault, у тойот например водитель отпускал педальку - а авто уходило в разгон, потому что стэк вырос ниже области переменныз, перетер переменные - и вообще красота. С тех пор некоторые стали класть переменные выше стэка - harffault лучше чем это. А как у вас - кто ж его знает, весь layout не видно. А куда указывает тот или иной адрес по идее в map-файле пишется. Если кейл конечно умеет что-то такое генерить. Наверное должен, это почти любой вменяемый компилятор умеет.