Image
Image

铁血丹心LLLL

+ 关注

粉丝 1     |     主题 76     |     回帖 543

STM32/GD32 IAP/Bootloader升级APP
2022-11-23 15:40
  • 灵动MM32 MCU
  • 26
  • 1274
  Bootloader升级APP 从串口接收到hex文件的一行,校验后调用以下函数写入FLASH。以下是简单的一个写入流程 ...  
  需要特别注意的是,如果使能了Systick等内核级别的中断,用__disable_irq(); 之类的屏蔽中断的语句是无法关 ...  
  跳转前关闭中断,防止 1)已经跳转到APP了但来了一个中断并落在了Bootloader, 2)中断向量表已偏移但来了 ...  
  application为一个void类型的函数指针,并将其指向Reset_Handler的地址。application()表示执行指针指向的 ...  
  跳转到APP不是跳转栈顶指针,而是跳转Reset_Handler,而Reset_Handler在栈顶指针后,所以需要偏移32位。 ...  
  (0x20000000 == (((__IO uint32_t)APP_LOADED_ADDR) & 0x2FFE0000)) 表示的是从地址0x5000取出栈顶指针,通 ...  
  所以如果正确写入了APP,则 地址 (__IO uint32_t *)APP_LOADED_ADDR 处的栈顶指针必然在该型号单片机的SRAM ...  
  宏 APP_LOADED_ADDR 是APP的起始地址,而APP程序的起始是栈顶指针。 为什么加载地址不是0x8005000? 因为选 ...  
  升级APP完成后,调用如下代码 @ CSDN Tyrion.Mon /* APP栈顶指针合法 */ if (0x20000000 == ((*(__IO uint ...  
  定义如下数据 @ CSDN Tyrion.Mon #define APP_LOADED_ADDR 0x5000 //APP加载地址 typedef void (* ...  
  Bootloader跳转APP 跳转前需要检查APP的栈顶指针是否合法、关闭所有中断、重设栈顶指针、偏移中断向量表( ...  
  ......  
  ......  
  同样的,在APP中也可升级Bootloader,但一般不需要。 Bootloader的功能尽量单一,大小尽量小,且占用的地址 ...  
  Bootloader在前:单片机上电时先运行Bootloader,等待升级指令。无指令时计时,超时进入APP;有升级指令, ...  
  例如如下划分  
  ......  
  烧写地址设置 在Keil MDK中,对Cortex-M3/4已经默认了程序烧录起始地址是0x08000000,并且可以选择在烧写 ...  
  加上以上代码以输出Flash地址的值,烧写程序之后,对比hex文件和打印结果 Flash支持16位半字写入和32 ...  
  Hex数据域 @ CSDN Tyrion.Mon for (i = 0; i < 10; i++) { printf("%x, ", *((uint32_t *)0x800000 ...  
2
3
近期访客