基于STM32F103VET6的bootloader应用
程序员文章站
2022-04-01 16:38:07
...
基于STM32F103VET6的bootloader应用
bootloader大多用于设备的联网远程升级或者离线升级,采用bootloader进行程序升级可以使产品升级变得更加简便,有利于产品的维护,下面我来简介下bootloader的使用。
一、keil软件配置
1、基于keil下载的bootloader的keil配置
如果用keil下载程序,需要对keil进行配置,选择程序的flash空间。
修改起始地址和分配的flash大小,此bootloader分配前12k空间。
修改此处的程序起始地址和分配的flash大小
2、基于keil下载的APP的keil配置
修改起始地址和分配的flash大小,此APP分配后500k空间。
修改此处的程序起始地址和分配的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
推荐阅读
-
基于Android应用中如何反馈Crash报告的详解
-
基于Protobuf动态解析在Java中的应用 包含例子程序
-
基于第一个PhoneGap(cordova)的应用详解
-
详解一个基于react+webpack的多页面应用配置
-
基于python编写的微博应用
-
基于CSS3特效之动画:animation的应用
-
【翻译】配置基于角色的Blazor WebAssembly(Blazor客户端)应用程序的授权
-
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
-
【翻译】配置基于策略的Blazor WebAssembly(Blazor客户端)应用程序的授权
-
基于Zend的Config机制的应用分析