写在最前:转载请注明出处,谢谢,如果我的博客给您帮助,请您点个赞。
关于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的配置
keil5的配置 少了 STM32F10X_MD,
附件:由于APP文件过大,也简单,我就在这里贴一些简单的源码
APP1:
APP1的配置
//实现功能:右边灯亮,间隔闪烁
........
........
........
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
版权声明:本文为博主原创,未经本人允许,禁止转载!
用户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