原创 Bootloader IAP 在stm32F1上的例子

2015-12-5 16:24 3078 14 22 分类: MCU/ 嵌入式

写在最前:转载请注明出处,谢谢,如果我的博客给您帮助,请您点个赞。


关于Bootloader的解释有很多,我就不多说了,想详细了解的 摸我之前写的 http://note.youdao.com/share/?id=42ae06075e076bde55ce80c02e28370c&type=note
在这里我上传的东西有以下几个
1,简单的Bootloader
2,App1 (左边等亮)
3,App2(右边等亮)
4,
5,
写在之后!由于文件过大,上传不了,我就在下面贴些简单的源码,大家自己去写。


Tip:
a,你其实可以不用下载APP1和APP2的,在你自己的程序上修改就好了


b,我在keil5中写的程序,在其他的keil程序可能需要重新配置,如果不知道怎么配置参考我下面的注释

 

 

ok,进入正题。
功能:User在Bootloader(以下简称Boot)里面,写入APP1与APP2的版本好,哪个版本号大就执行哪一个。比较简单,大神们莫笑。大家也可以在基础上进行二次开发。

 

 

首先,自己做一个协议

#define VER_DEVICE_ID_SAVEADD   0x0800FFF0    //存放写数据的地址  //存放版本号
#define  DEBUG 1 //1为测试
#define APP1DATAH     0xff      //0x1E  //没用到的
#define APP1DATAL     0xff      //0x93//没用到的
#define APP2DATAH     0xff //没用到的
#define APP2DATAL     0xff //没用到的
#define APP1version   0x18      //哪一个数值大执行哪一个
#define APP2version   0x17      //哪一个数值大执行哪一个
unsigned char FLASH__WRITE_BUF[16]={0xBD,0x01,0x00,0x00,0x01,APP1DATAH,APP1DATAL,0xFF,APP1version,APP2DATAH,APP2DATAL,0xFF,APP2version,0xFF,0x55,0xDD} ;  //自己做的协议

tip:
a,这是一个工程的一部分,有些大家不需要用到的尽可以忽略。

 

Bootloader的思路如下:上电,将 FLASH__WRITE_BUF[]数组写入特定的地址,检测APP1与APP2哪个版本新一点(大一点) 抛出标志位,在while(1)里面对标志位进行相应的判断与执行。

 

 

重点函数:
1,
/******************************
* 功能:跳转到对应位置
* 参数:u32 appxaddr APP1的初始地址或APP2的初始地址
******************************/
void iap_load_app(u32 appxaddr)
{
 if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //
  jump2app=(iapfun)*(vu32*)(appxaddr+4);  //  
  MSR_MSP(*(vu32*)appxaddr);     //
  jump2app();         //
 }
}
 

2,
/******************************
* 功能:写入数值到对应地址
* 参数:写入的地址,数组名,写入个数(不是数值)
******************************/
void Write_FlashBuf(INT32U addr,INT8U *p,INT16U n)   
{
   INT32U r1;
   INT8U index=0;
   INT8U len;
   if((n%4)==0)n=n/4;
   else n=(n/4)+1;
   FLASH_Unlock();
   FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
   //FLASH_ErasePage(addr);
   while(n--)
   {
     r1=*(p++);
     r1|=*(p++)<<8;
     r1|=*(p++)<<16;
     r1|=*(p++)<<24;
     FLASH_ProgramWord(addr, r1);  //写入一个字
     addr+=4;
   } 
   FLASH_Lock();
}

 

 

 

 

关于Bootloader的小贴士


a,Bootloader里面请不要做中断
b, Bootloader的大小尽可能小。
c,偏移量是0x200的整数倍
d,在项目配置哪里,IAP要改成EARSE FULL C 然后再把IAP APP1 APP2再下载一遍
f,关于移植keil5到keil4程序的简单解决方法

keil4的配置

20151205152929165001.jpg
 

keil5的配置 少了  STM32F10X_MD,

20151205153218258001.jpg
 

附件:由于APP文件过大,也简单,我就在这里贴一些简单的源码
APP1:

APP1的配置

20151205153309185001.jpg

20151205153340449001.jpg

//实现功能:右边灯亮,间隔闪烁
........
........
........
int main(void)
{
  SCB->VTOR = FLASH_BASE | 0x1000;  //这个是重点
  RCC_Configuration();
  //printf("程序1\r\n");
  LED_Init();
  delay_init(72);
  for(;;)
  {
    unsigned char index;
    KEY1=1;
    delay_ms(200);
    KEY1=0;
    delay_ms(200); 
  }
}

 

 

 

APP2:
//实现功能:左边灯亮,间隔闪烁

keil配置如上图再做对应修改!
........
........
........
int main(void)
 { 
  SCB->VTOR = FLASH_BASE | 0x8800;  //这个是重点
 RCC_Configuration();
 LED_Init();
 delay_init(72); 
 for(;;)
 {
  KEY1=1;
  delay_ms(500);
  KEY1=0;
  delay_ms(500);
 }
  
 }

作者: Bruce-Woo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1850657.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户446948 2015-12-22 11:46

感谢分享,下下来研究研究

Bruce-Woo 2015-12-9 17:40

离天才差的还很远,我只是一个普通的小职员而已

东莞元宝代理Microchip长电二三极管 2015-12-9 17:02

好厉害!您的这个独门武功是如何炼成的?炼了多少年?好崇拜技术天才!

用户172289 2015-12-8 10:24

谢谢了

859218009 2015-12-8 09:15

谢谢楼主的分享

用户832726 2015-12-8 08:21

不错

Bruce-Woo 2015-12-7 13:14

第四第五点是一个视频,就是效果。太大上传不了。

用户377235 2015-12-7 10:11

博主,第四点第五点是什么
相关推荐阅读
Bruce-Woo 2023-03-07 15:14
嵌入式面试之系统
最近一段时间在开始找工作,自己以前也面试过其他人,想从实际工作的角度,来提出一些有意义的问题并做一些浅薄的解答,期望帮助到找工作或者刚开始当面试官的朋友。我把面试要准备的地方列成一下几个注意点,大家...
Bruce-Woo 2023-02-25 21:59
芯片选型的思路
近来在面试,不知为何很多人问起我刚毕业的时候的项目中的一个芯片选型的事情,回过头来整理下,希望可以帮助到后面的朋友1. 开发难度 开发难度,要考虑本身的程序员的开发能力,擅长的领域和工具等。综合下你...
Bruce-Woo 2021-03-17 14:19
记一次调用动态库报错的处理过程( undefined symbol)
最近工作在调用其他同事的一个动态库的时候发现有 未识别的错误 特此记录一下         首先我们用ldd查一下动态库连接是否有问题   ...
Bruce-Woo 2021-03-11 15:03
ubuntu16.04下安装svn
SVN和GIT相信是大家使用最多的代码协同工具,不过可能在win下用的比较多,那今天在ubuntu上运行一遍,操作都差不多。某种程度上讲,我也更喜欢指令操作。1. 远程登录虚拟机,也可以页面操作,看个...
Bruce-Woo 2021-02-09 01:08
2020,我想和你谈谈
这篇文字无关技术,也没有代码。 这是最好的时代,也是最坏的时代!写在回家前夜。 不到10个小时后就要开始坐车回家,手头的工作也没有做完。正经的事儿没完成,乱七八糟的事情倒是想了不少,说话是一种表达方...
Bruce-Woo 2021-01-19 12:34
cmake的安装过程
今天在编译opencv的时候突然发现cmake失败,显示版本不同遂决定修复之方法如下下载更高版本cmake,可在cmake官网下载 解压 tar -zxvf cmake-3.19....
EE直播间
更多
我要评论
8
14
关闭 站长推荐上一条 /3 下一条