STM32 uC после выхода из режима DFU не возвращается в нормальное состояние, но имеет точки останова - PullRequest
0 голосов
/ 04 июля 2019

Я вхожу в режим DFU STM32 без использования физического контакта Boot0. Я делаю это, отправляя команду через UART и переключаю UC в режим DFU. Я использую STM32F042G6U6.

Но он не перезапускается, когда я использую инструменты ST для выхода из режима DFU.

Приведенный ниже код - это то, что я использую, чтобы загрузить мой ОК в режим DFU

#define SYSMEM_RESET_VECTOR         0x1FFFC404 //Offset +4
#define RESET_TO_BOOTLOADER_CODE    0xDEADBEEF
#define BOOTLOADER_STACK_POINTER    0x20001800

void __initialize_hardware_early(void)
{
    *((unsigned long *)0x20001600) =  0xCAFEFEED;

    void (*SysMemBootJump)(void);
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(SYSMEM_RESET_VECTOR)));

    __set_MSP(BOOTLOADER_STACK_POINTER);
    SysMemBootJump();
}

void dfu_run_bootloader()
{
    *((unsigned long *)0x20001600) = RESET_TO_BOOTLOADER_CODE;
    NVIC_SystemReset();
}

dfu_run_bootloader вызывается из функции приема UART. __initialize_hardware_early был помещен внутрь SystemInit.

void SystemInit(void)
{
    if (*((unsigned long *)0x20001600) == 0xDEADBEEF) {
        __initialize_hardware_early();
    }
... // The rest of the SystemInit() function

После нажатия «Выйти из режима DFU» Я ожидаю, что устройство вернется в нормальное состояние. Но это не так.

Dfuse demo

Когда я присоединяю отладчик, он сообщает о точке останова в двух местах. Все как на картинках ниже. Устройство начинает работать правильно, когда я нажимаю кнопку возобновления.

breakpoint 1

breakpoint 2

...