stm32 复位到内部bootloader
程序员文章站
2024-02-23 22:52:22
...
sm32的bootloader一般是通过开机时设置boot0=1来实现的。下面是通过程序来实现:
原来的startup文件是直接把flash的数据加载到ram里面然后跑main函数循环
bootloader的程序在0x1FFF D800
那只要在进入main函数之前先判断是否要进入bootloader,如果要进入bootloader,就载入0x1fff d800这个地址就好了。否则就继续未修改之前的操作。
void systemReset(void)
{
// Generate system reset
SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04;
}
void systemResetToBootloader(void)
{
/*修改在RAM里面的标志位*/
*((uint32_t *)0x20009FFC) = 0xDEADBEEF; // 40KB SRAM STM32F30X, 0x20009FFC=0x20000000+40*1024-4(ram的最后一个字)
/*产生复位信号*/
systemReset();
}
修改startup 的Reset_Handler
原来的:
**********************************************************************
Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
修改后的:
***********************************************************************
Reset_Handler:
ldr r0, =0x20009FFC
ldr r1, =0xDEADBEEF
ldr r2, [r0, #0]
str r0, [r0, #0]
cmp r2, r1
beq Reboot_Loader
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
Reboot_Loader:
// Reboot to ROM
ldr r0, =0x1FFFD800
ldr sp,[r0, #0]
ldr r0,[r0, #4]
bx r0
下一篇: ADC芯片——CS1237的使用