` 由于项目需要,需要做双系统切换与升级的bootloader,正好用的芯片是STM32f103rct6。就在原子精英stm32f103开发板上实验一下了。顺便分享给大家。
需要的功能为:通过GPRS远程升级。双系统可切换。升级失败可返回原系统。在原子stm32开发板上做此实验就改用串口升级了。
主要分为4个部分实现,简单展示一下:
一,系统选择升级
void UpData(void)
- {
- if(System1_UpData == TRUE || System2_UpData == TRUE)
- {
- if(applenth)
- {
- if(System1_UpData == TRUE)
- {
- System1_UpData = !TRUE;
- printf("开始更新系统1固件...
- ");
- }
- else
- {
- System2_UpData = !TRUE;
- printf("开始更新系统2固件...
- ");
- }
- LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");
- if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- iap_write_appbin(FLASH_APP_ADDR[system_num],USART_RX_BUF,applenth);//更新FLASH代码
- LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");
- printf("固件更新完成!
- ");
- }
- else
- {
- LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP! ");
- printf("非FLASH应用程序!
- ");
- }
- }
- else
- {
- System1_UpData = !TRUE;
- System2_UpData = !TRUE;
- printf("没有可以更新的固件!
- ");
- LCD_ShowString(30,210,200,16,16,"No APP!");
- }
- clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示
- }
- }
复制代码
二.系统选择启动
- void SysStart(void)
- {
- if(System1_Start == TRUE || System2_Start == TRUE)
- {
- if(System1_Start == TRUE)
- {
- System1_Start = !TRUE;
- printf("开始执行系统1!!
- ");
- }
- else
- {
- System2_Start = !TRUE;
- printf("开始执行系统2!!
- ");
- }
- if(((*(vu32*)(FLASH_APP_ADDR[system_num]+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- iap_load_app(FLASH_APP_ADDR[system_num]);//执行FLASH APP代码
- }else
- {
- printf("非FLASH应用程序,无法执行!
- ");
- LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!");
- }
- clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示
- }
- }
复制代码
三.简易二级菜单界面
- void screen(void)
- {
- static u8 flag = 0;
- flag = !flag;
- if(flag)
- {
- LCD_ShowString(0,150,200,16,16,"SYSTEM1: START UPDATA");
- LCD_ShowString(0,170,200,16,16,"SYSTEM2: START UPDATA");
- }
- else
- {
- if(menu_num == menu1)//1级菜单,切换系统
- {
- if(system_num == system1)
- LCD_ShowString(0,150,200,16,16," : START UPDATA");
- else
- LCD_ShowString(0,170,200,16,16," : START UPDATA");
- }
- else//2级菜单,切换升级/启动
- {
- if(system_num == system1)
- {
- if(item_num == item1)
- LCD_ShowString(0,150,200,16,16,"SYSTEM1: UPDATA");
- else
- LCD_ShowString(0,150,200,16,16,"SYSTEM1: START ");
- }
- else
- {
- if(item_num == item1)
- LCD_ShowString(0,170,200,16,16,"SYSTEM2: UPDATA");
- else
- LCD_ShowString(0,170,200,16,16,"SYSTEM2: START ");
- }
- }
- }
- }
复制代码
四.3按键动作的处理
- if(key==WKUP_PRES)//选择键
- {
- if(menu_num == menu1)//1级菜单,切换系统
- {
- system_num++;
- if(system_num>system2)
- system_num = system1;
- }
- else
- {
- item_num++;//2级菜单,切换升级/启动
- if(item_num>item2)
- item_num = item1;
- }
- }
- if(key==KEY1_PRES)//确认键
- {
- System1_UpData = !TRUE;
- System1_Start = !TRUE;
- System2_UpData = !TRUE;
- System2_Start = !TRUE;
- if(menu_num == menu2)
- Menu[system_num][item_num] = TRUE;//处于2级菜单,确认选定项目
- else
- menu_num = menu2;//处于1级菜单,进入所选系统设置
- }
- if(key==KEY0_PRES)//返回键
- {
- if(menu_num>menu1)
- menu_num--;
- }
复制代码
部分数据的定义
这样子按切换键切换系统1/系统2菜单,按确认按键进入二级菜单,可以选择升级或者进入系统。返回键可以返回上一级。当系统或者升级文件不存在的话,给出提示信息。
这里上传一个实际验证的视频,大概1分钟。
`
|