Я вхожу в режим 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» Я ожидаю, что устройство вернется в нормальное состояние. Но это не так.
Когда я присоединяю отладчик, он сообщает о точке останова в двух местах. Все как на картинках ниже. Устройство начинает работать правильно, когда я нажимаю кнопку возобновления.