调试总结——(bootloader中的梗)stm32F0系列

最近用了stm32f0的单片机,和m3 m4内核不同的是,居然没有SCB->VTOR寄存器。于是网上各种看文章。
总结下:
和之前boot区别的地方:
(1)要在main开始处新增一段代码:
这边主要是把原来在flash中的中断向量表复制到了ram中0x2000 0000处。由于没有了偏移,所以就让APP程序用ram处的中断向量表了。
问题:以下循环为什么48? 答:因为在.s文件中有48个DCD对应着的中断入口

 void IAP_Set(void)
 {
    uint32_t i = 0;
 /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
   /* Copy the vector table from the Flash (mapped at the base of the application
      load address 0x08003000) to the base address of the SRAM at 0x20000000. */     
	 FLASH_Unlock();	 
   for(i = 0; i < 48; i++) 
   {
     *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(Application_Write_Address + (i<<2));
	}
	 FLASH_Lock();
   /* Enable the SYSCFG peripheral clock*/ 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 

/* Remap SRAM at 0x00000000 */
		SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

 }
int main(void)
{
	IAP_Set();
	__enable_irq();
.....
}

(2)RAM地址要偏移
这一步很重要,至于为什么是C0大小的吗,就是48*4字节=192 =0xC0,注意要4字节对齐。
APP中:
调试总结——(bootloader中的梗)stm32F0系列_第1张图片
BOOT中:
调试总结——(bootloader中的梗)stm32F0系列_第2张图片

(3)以上两步就可以实现程序的跳转了,我在调试的过程中,这边很快完成,花时间比较多的就是出现了很多读写内部flash的错误。我也总结了一下。
https://blog.csdn.net/mhj258258/article/details/106890658

你可能感兴趣的:(调试总结)