【STM32学习笔记】STM32 BOOTLOADER配置以及APP跳转

  大家好,今天给大家介绍的是STM32的BootLoader以及它如何跳转运行到APP应用程序的例程。
  首先我先给大家科普一下什么是BootLoader。

什么是BootLoader?

Bootloader是硬件启动的引导程序,是运行操作系统的前提。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。就像我们的电脑一样,在开机的过程中可以通过F1或者其他的按键进入BOOT模式然后修改启动参数和进入其他的镜像系统。

什么是APP?

APP就像是我们电脑的操作系统,经过硬件引导程序之后跳转到系统程序运行。APP就是我们的应用程序。

STM32BootLoader&APP

stm32默认的是从0x08000000开始启动程序,我们的BootLoader也是从0x08000000地址开始存储的,大小可以根据自己的需要设置。如下图举例分配16K空间给BootLoader其余的给APP和变量存储。

内存分配 地址 大小
BootLoader 0x08000000 - 0x08004000 16K
APP 0x08004000 - 0x0800F000 44K
剩余空间 0x0800F000 - 0x08010000 4K

这里我列举了一个表格,BootLoader 占用16k,APP占用44K,剩余4K留给需要掉电保存的变量空间。
好了上面我给大家说明了程序的思路下面就是工程的配置和代码部分了。

STM32BootLoader部分

这里话不多说先上代码

typedef void (*iapfun)(void);
iapfun jump2app;

void IAP_Load_App(volatile unsigned int appxaddr);

__asm void MSR_MSP(unsigned int addr)
{
			MSR MSP, r0
			BX r14
}


void IAP_Load_App(volatile unsigned int appxaddr)
{
	if(((*(volatile unsigned int*)appxaddr)&0x2FFE0000)==0x20000000) //
	{
        jump2app = (iapfun)*(volatile unsigned int*)(appxaddr+4);//
        MSR_MSP(*(volatile unsigned int*)appxaddr);//
        jump2app(); //
	}
}

int main(void)
{
  HAL_Init();
  
  SystemClock_Config();
  
  MX_GPIO_Init();
  
  if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0)
  {
	  HAL_DeInit();
	  IAP_Load_App(0x08004000);
  }
  
  while (1)
  {
	HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
	HAL_Delay(200);

  }

}

上面代码写了当PB0电平为低电平就会跳转到0x08004000FLASH这个地址去。这里切记一定要把所有的配置设为未初始化状态。不然无法正常跳转运行,会进入硬件错误中断。HAL_DeInit(); 必须要有!
我这里在BootLoader模式下,LED闪烁快速,APP模式下LED闪烁慢速方便验证。

STM32APP部分

首先工程配置,因为我们BootLoader配置了16K,所以我们的ROM偏移地址需要改变。修改如图
【STM32学习笔记】STM32 BOOTLOADER配置以及APP跳转_第1张图片
这里代表我们FLASH下载从这个位置下载进去。
还有就是我们要注意的是FLASH下载不能选全部擦出,要选部分擦除。如图
【STM32学习笔记】STM32 BOOTLOADER配置以及APP跳转_第2张图片
全部擦除会把我们的BootLoader一起擦除了。
好了下面就是程序了

int main(void)
{

  SCB->VTOR = FLASH_BASE | 0X4000;

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  while (1)
  {
	HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
	HAL_Delay(1000);	
  }

}

这里就是重新定义中断的向量表 SCB->VTOR = FLASH_BASE | 0X4000;
然后LED闪烁2秒闪烁一次,好了介绍完了程序能够正常运行了。

如有什么不懂联系加QQ群:1063618791欢迎大家学习交流!

QQ:1320300083

你可能感兴趣的:(STM32学习笔记,c语言,嵌入式,stm32)