欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于STM32F103VET6的bootloader应用

程序员文章站 2022-04-01 16:38:07
...

基于STM32F103VET6的bootloader应用

bootloader大多用于设备的联网远程升级或者离线升级,采用bootloader进行程序升级可以使产品升级变得更加简便,有利于产品的维护,下面我来简介下bootloader的使用。

一、keil软件配置

1、基于keil下载的bootloader的keil配置

如果用keil下载程序,需要对keil进行配置,选择程序的flash空间。
基于STM32F103VET6的bootloader应用
修改起始地址和分配的flash大小,此bootloader分配前12k空间。
基于STM32F103VET6的bootloader应用
修改此处的程序起始地址和分配的flash大小

2、基于keil下载的APP的keil配置

基于STM32F103VET6的bootloader应用
修改起始地址和分配的flash大小,此APP分配后500k空间。
基于STM32F103VET6的bootloader应用
修改此处的程序起始地址和分配的flash大小

二、程序

1、bootloader程序

void (*jump2app)();
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
 int i;
 if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
 { 
  jump2app=(void(*)())*(vu32*)(appxaddr+4);  //用户代码区第二个字为程序开始地址(复位地址)  
  MSR_MSP(*(vu32*)appxaddr);     //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  for(i = 0; i < 8; i++)
  {   
   NVIC->ICER[i] = 0xFFFFFFFF; /* 关闭中断*/
   NVIC->ICPR[i] = 0xFFFFFFFF; /* 清除中断标志位 */
  }
  jump2app();         //跳转到APP.
 }
}
int main(void)
{ 
 uart_init(115200);
 delay_init();
 while(1)
 {
   printf("将于3s后跳转主程序\r\n"); 
   delay_ms(1000);
   printf("1\r\n");
   delay_ms(1000);
   printf("2\r\n");
   delay_ms(1000);
   printf("3\r\n");
   printf("准备跳转\r\n");
   delay_ms(10);
   iap_load_app(0x8003000);  //跳转
 }
}

这里主要要注意的就iap_load_app(0x8003000);这条语句,不同起始地址的程序需要填入不同的跳转地址

2、APP示例程序

int main(void)
{ 
 NVIC_SetVectorTable(0x8003000,0);  //重新设置程序栈地址和中断向量表
 delay_init();       //延时函数初始化   
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 uart_init(115200);  //串口初始化为115200
 while(1)
 {
  printf("\r\n你好! 我是APP程序\r\n\r\n");
  delay_ms(1000);
 }  
}

这部份程序主要要注意的是NVIC_SetVectorTable(0x8003000,0);,这是重新设置程序栈地址和中断向量表程序
跳转成功后间隔一秒打印"你好! 我是APP程序"
程序下载:https://download.csdn.net/download/qq_36326272/12493194