Здесь надо уточнить - что понимаете под "зависанием". Чем, по
вашему, МК при этом занят?
В 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.