Здесь надо уточнить - что понимаете под "зависанием". Чем, по
вашему, МК при этом занят?
В 99% случаев сбой в работе приводит к исключению HardFault - вызывается HardFault_Handler. Любой проект содержит default обработчик, как правило лежит где-нибудь в startup и имеет аттрибут "weak", т.е. может быть переопределен где-то в другом месте проекта без переписывания default обработчика. deafult обработчик содержит глухой цикл - т.е. МК "зависает".
Вот из startup.s:
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
В другом месте свой обработчик:
extern "C" void HardFault_Handler(void)
{
NVIC_SystemReset();
HAL::pLed0.clear();
HAL::pLed1.clear();
HAL::pLed2.clear();
HAL::pLed3.clear();
while(1)
{
HAL::pLed0.set();
for(int i=0; i < (kLimit_10ms * 5); i++) __NOP();
HAL::pLed0.clear();
for(int i=0; i < (kLimit_10ms * 100); i++) __NOP();
HAL::pLed2.set();
for(int i=0; i < (kLimit_10ms * 5); i++) __NOP();
HAL::pLed2.clear();
for(int i=0; i < (kLimit_10ms * 100); i++) __NOP();
}
}
Здесь модификатор extern "C" потому что определен в файле *.cpp.