eddy_em: (Default)
[personal profile] eddy_em
Получил намедни платки очередной управлялки ШД. Сдуру не завел BOOT0 на какую-нибудь ногу (+кондер) — понадеялся на возможность программного вызова USB-DFU. А вот фигвам! Вот такой код:
void Jump2Boot(){
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x1FFFC800;
//    sysreset();
    // Enable the SYSCFG peripheral.
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    // reset systick
    SysTick->CTRL = 0;
    // disable all interrupts
//    __disable_irq();
//    __DSB();__ISB();
    // remap memory to 0 (only for STM32F0)
    SYSCFG->CFGR1 = 0x01;
    __DSB();__ISB();
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
    // set main stack pointer
    __set_MSP(*((uint32_t *)addr));
    SysMemBootJump();
}

при разных модификациях не работает! Несмотря на уйму ссылок в интернетах, где люди пишут, что у них все ОК.
Эх, так надеялся отладкой заниматься без всяких лишних приблуд. А придется, похоже, подпаивать разъемчик и втыкать st-link (который, кстати, почему-то несмотря на опцию --reset, после прошивки МК не сбрасывает).
Кстати, с утра бесполезно время убивал по другой причине: казалось бы один и тот же Makefile (но с немного разным порядком опций) давал совершенно иной результат, и прошивка не работала! А стоило опции поменять местами, как все пошло-поехало. Ну я просто вообще не понимаю…

Благодаря помощи на "радиокоте", все заработало:
void Jump2Boot(){
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x1FFFC800;
    // reset systick
    SysTick->CTRL = 0;
    // reset clocks
    RCC->APB1RSTR = RCC_APB1RSTR_CECRST    | RCC_APB1RSTR_DACRST    | RCC_APB1RSTR_PWRRST    | RCC_APB1RSTR_CRSRST  |
                    RCC_APB1RSTR_CANRST    | RCC_APB1RSTR_USBRST    | RCC_APB1RSTR_I2C2RST   | RCC_APB1RSTR_I2C1RST |
                    RCC_APB1RSTR_USART4RST | RCC_APB1RSTR_USART3RST | RCC_APB1RSTR_USART2RST | RCC_APB1RSTR_SPI2RST |
                    RCC_APB1RSTR_WWDGRST   | RCC_APB1RSTR_TIM14RST  | RCC_APB1RSTR_TIM7RST   | RCC_APB1RSTR_TIM6RST |
                    RCC_APB1RSTR_TIM3RST   | RCC_APB1RSTR_TIM2RST;
    RCC->APB2RSTR = RCC_APB2RSTR_DBGMCURST | RCC_APB2RSTR_TIM17RST | RCC_APB2RSTR_TIM16RST | RCC_APB2RSTR_TIM15RST |
                    RCC_APB2RSTR_USART1RST | RCC_APB2RSTR_SPI1RST  | RCC_APB2RSTR_TIM1RST  | RCC_APB2RSTR_ADCRST   | RCC_APB2RSTR_SYSCFGRST;
    RCC->AHBRSTR = 0;
    RCC->APB1RSTR = 0;
    RCC->APB2RSTR = 0;
    // Enable the SYSCFG peripheral.
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    // remap memory to 0 (only for STM32F0)
    SYSCFG->CFGR1 = 0x01; __DSB(); __ISB();
    SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
    // set main stack pointer
    __set_MSP(*((uint32_t *)addr));
    // jump to bootloader
    SysMemBootJump();
}

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 24th, 2026 02:08 pm
Powered by Dreamwidth Studios