A,简单一些
bootloader在代码最后空间 ,前3字节保留进入IAP区的跳转
bootloader前保留一块用户代码得开始跳转
就是有个漏洞
地址0000 0001 0002 下保留跳转到IAP区指令
当下载的时候 先备份这条, 然后擦除一块,当刚刚好擦了
还没马上还原这最重要的指令
断电! 这时怎么办? 只能再烧bootloader吧?
B,比较复杂如下 依赖用户代码比较多
MCU:C8051F310
bootloader:0x0000-0x1000
AP:0x1000-0x3dff
reserved:0x3dff-0x3fff
1,建立bootloader.c
加入startup.a51
在startup.a51(默认) 里面第120行 加入如下 中断向量 函数地址映射
如下:
ORG 0000BH /*定时器0*/
LJMP 0100BH /*跳转到用户代码区1000h以后*/
... /*所有中断都如上写满*/
...
在bootloader.c 中加入跳转到AP区的指令
如下:
((void(code *)(void))0x1100)(); /*0x1100 为startup.a51的地址*/
/*一般放在 中断映射后的地址*/
编译:烧录从0x0000开始
2,建立AP.C 用户代码
加入startup.a51 (可以不加)
在keil->options->c51->interrupt vectors at address: 输入中断映射地址
如下:
interrupt vectors at address: 0x1000
0x1000即AP的code区起始地址 也是中断矢量地址的映射基地址开始。
在keil->options->BL51 Locate 设置如下
定义 code Rang 0x1000-0x3dff
CODE: 输入 ?C_C51STARTUP(1100H) /*需要和bootloader中的跳转地址一致*/
/*只需要定位好这个地址*/
/*这样所有的中断函数都不需要再次定位*/
编译:烧录的时候 从0x1000 开始烧 即第7块开始
两个代码烧录完,复位就可以运行
3,bootloader区串口等下载 不能出现中断函数 |