LightElf (10.08.2019 14:28 - 14:31, просмотров: 525) ответил Make_Pic на Началось все с того, что поставили в надежность на испытания, там и заметили сброс по WDT, потом его отключили для поиска петли. Выяснилось, что "на столе" виснет, но значительно реже. Вроде бы аппаратная природа зависона, но дальнейшее
Ну тады надо начать с того, что именно у вас прописано в вектора исключений и в неиспользуемые вектора прерываний. Туда часто впихивают что-то типа  
void default_isr(void)
{
    for (;;);
}
Вот туда программа влетает и крутится до срабатывания WDT. Что, в общем, в плане поиска проблемы нисколечко не помогает. 
Подобный вариант заметно лучше:
#pragma pack(push,1)
// кадр стека, создаваемый исключением
typedef struct fault_frame_s
{
    uint32_t   stacked_R0;
    uint32_t   stacked_R1;
    uint32_t   stacked_R2;
    uint32_t   stacked_R3;
    uint32_t   stacked_R12;
    uint32_t   stacked_LR;
    uint32_t   stacked_PC;
    uint32_t   stacked_xPSR;
} fault_frame_t;
#pragma pack(pop)
// кадр исключения (для отладки)
__no_init __root fault_frame_t fault_frame;
__no_init __root uint32_t      fault_icsr;
__no_init __root uint32_t      fault_flag;
void default_isr(void)                        
{                                             
    if (__get_CONTROL() & 2)
    {
        memcpy(&fault_frame, __get_PSP(), sizeof(fault_frame));
    }
    else
    {
        memcpy(&fault_frame, __get_MSP(), sizeof(fault_frame));    
    }   
    fault_icsr = SCB->ICSR;
    fault_flag = 0xdeadbeaf;
    __DSB();
    SCB->AIRCR = 0x05FA0004;
    while(1)                                  
    {                                         
    }                                         
}                                             
При старте проверяем fault_flag на предмет магического значения. Если присутствует - сохраняем во флеше fault_frame и fault_icsr. Обнуляем fault_flag. 
Дальше развиваем по вкусу.
Не надо делать мне как лучше, оставьте мне как хорошо