需要确认注册邮箱后才能开通博客,立即确认我的邮箱
文章 搜索 高级搜索 ?3? ?3?
  • 滤波器new!
  • LED驱动 new!
  • 新能源 new!
  • PLL
  • PCIE协议
  • 可穿戴
  • LSI
  • FCI
文章 论坛 博客 小组 研讨会
EDN电子技术论坛>博客 >081010博客 >C8051F340 BOOTLOADER 固件升级的的实现过程

081010的博客——081010's Blog

博主:081010???? ???? ????
介绍: 081010
文章(6)???? 访问(10613)???? 评论(11)???? 投票(9)???? 订阅本博??

博文列表查看方式: ???

C8051F340 BOOTLOADER 固件升级的的实现过程
发布时间:2011-04-27 17:32:00
技术类别:嵌入式
需要确认注册邮箱后才能下载,立即确认我的邮箱

实现过程:

一:内部flash 的空间划分

0XFFFF

?

保留区

?

应用程序区

?

?

BOOTLOADER可操作区域

?

?

0XF000

?

0X1000

0X1000

?

0X0000

?

二:中断向量软件映射

MCU中断向量分布在复位(0x0000)以后,按规则排布,若改变编译器设置,如51,可改变程序在FLASH中的位置,可改变中断向量起始点,如改到这样0X1000,即:就是将0X0000地址内容映射到0X1000,把0X1000作为一个虚拟的复位地址,编译后,中断向量安装在0X1000后。但是,硬件跳转是不能改变的。就是说中断发生后,仍然进入以0X0000为复位地址的向量表。但是,这个向量表中,不再是直接跳转到中断服务程序,而是需要手动跳转到虚拟中断向量表,再由虚拟中断向量表跳转到中断服务程序。但是其原始向量表可能为空,所以需要加入程序判进行手动跳转到新向量表。
?????? 所以编译的时候,将APP程序中断向量表虚拟,BOOT程序使用原始的向量表。所以任何时候中断发生后,将执行BOOT中断服务程序。在BOOT中断服务程序中判断当前程序是执行BOOT区还是APP区,如果是执行APP区,就跳转到APP中断服务程序即可(入口向量已经规则地排布在0X1000以后)。

51的中断向量排布规则是:? LJMP?? 3+8*INTERRUPT_VECTOR_NUMBER

图解:

原始地址(向量表)

作用

描述

0000H

RESET

POWER UP ENTRY

0003H

INTERRUPT 0入口

?

000BH

INTERRUPT 1入口

?

0013H

INTERRUPT 2入口

?

虚拟后地址(向量表)

作用

描述

1000H

虚拟复位地址

?

1003H

INTERRUPT 0虚拟入口

进入中断

100BH

INTERRUPT 1虚拟入口

进入中断

注意:中断向量虚拟后,并不是说发生中断程序就转入虚拟后的向量表。而是:中断向量表的实质是一条跳转指令,跳转到相关ISR,虚拟后,这个跳转指令被放在了新的地址,而不是原始默认地址。所以,需要在原始地址处再放一辅助向量表(中断发生后,硬件挑到此处),用于跳转到新的向量表。这个辅助向量表有BOOT区完成。

1:STARTUP.A51文件设置:

;vector_base?????????? EQU???? 01000h

;vector

??????????????????????????? CSEG??? AT????? 03h

??????????????????????????? LJMP??? vect + 03h??????????? ;// 0 外部中断0 (/INT0)

;user_address???? EQU???? 01000h

user_process:

??????????????????????????? LJMP??? vect;user_address

??????????????????????????? CSEG?? ?AT????? 0bh

??????????????????????????? LJMP??? vect + 0bh??????????? ;// 1 定时器0溢出

??????????????????????????? CSEG??? AT????? 13h

??????????????????????????? LJMP??? vect + 013h????????? ;// 2 外部中断1 (/INT1)

??????????????????????????? CSEG??? AT????? 1bh

??????????????????????????? LJMP??? vect + 01bh????????? ;// 3 定时器1溢出

??????????????????????????? CSEG??? AT????? 23h

??????????????????????????? LJMP??? vect + 023h????????? ;// 4 UART0

??????????????????????????? CSEG?? ?AT????? 2bh

??????????????????????????? LJMP??? vect + 02bh????????? ;// 5 定时器2溢出

??????????????????????????? CSEG??? AT????? 33h

??????????????????????????? LJMP??? vect + 033h????????? ;// 6 SPI0

??????????????????????????? CSEG??? AT????? 3bh

??????????????????????????? LJMP??? vect + 03bh????????? ;// 7 SMB0

??????????????????????????? CSEG??? AT????? 43h

??????????????????????????? LJMP??? vect + 043h????????? ;// 8 USB0

??????????????????????????? CSEG??? AT????? 4bh

??????????????????????????? LJMP??? vect + 04bh????????? ;// 9 ADC0窗口比较

??????????????????????????? CSEG??? AT????? 53h

??????????????????????????? LJMP??? vect + 053h????????? ;// 10 ADC0转换结束

??????????????????????????? CSEG??? AT????? 5bh

??????????????????????????? LJMP??? vect + 05bh????????? ;// 11 可编程计数器阵列

??????????????????????????? CSEG??? AT????? 63h

??????????????????????????? LJMP??? vect + 063h????????? ;// 12 比较器0?

??????????????????????????? CSEG??? AT???? ?6bh

??????????????????????????? LJMP??? vect + 06bh????????? ;// 13 比较器1

??????????????????????????? CSEG??? AT????? 73h

??????????????????????????? LJMP??? vect + 073h????????? ;// 14 定时器3溢出

??????????????????????????? CSEG??? AT????? 7bh

??????????????????????????? LJMP??? vect + 07bh????????? ;// 15 VBUS电平

??????????????????????????? CSEG??? AT????? 83h

??????????????????????????? LJMP??? vect + 083h????????? ;// 16 UART1

??????????????? CSEG? ??AT????? 000h

?C_STARTUP:???? LJMP??? STARTUP1

?

2:应用程序区工程设置:

?

?

?

?

?

?

3:bootloader程序和 APP 应用程序的初始化时钟必须是一致的, 否则容易造成死机的现象

三:BOOTLOADER 程序

1:主程序的编写

main(void)

{

?????? uint8 uartRX;

?????? ?uint16 timeout;

?????? ?void (*boot)( void);

?????? ?Sys_Clk_Init();? // 初始化设备?????????????????

?????? ?PORT_Init();???????????????????????

?????? ?UART0_Init();

?????? ?FLSCL = 0x86;

?????? ?if (1) {

?????? ? ??? Uart_Print("\n");

?????? ????? Uart_Print("**************BootLoader v1.0***************\n");

?????? ? ??? Uart_Print(">Please press 's' to start programming.\n");

?????? ? while (1)

?????? ? {

?????? ??? for(timeout=0;timeout<4000;timeout++)

?????? ????? {

?????? ???????????? if(RI0)

???????????????????? {

???????????????????? ?? uartRX=SBUF0;

????????????? ??????? RI0=0;

??????????????????????????? break;

???????????????????? }

???????????????????? delay_ms(10);

????????????? }

?????? ?? if (uartRX=='s')

?????? ?? {RTload();????

????????????? uartRX = 0;?

?? ???????? }

????????????? else if(vect == 0x02)

???????????????????? {

??????????????????????????? goto USE_CODE;

???????????????????? }

?????? ?? }

? }

USE_CODE:

?????? user_process();

?????? while(1)

?????? {

?????? }

2:片内FLASH的 操作

unsigned char FLASH_ByteRead (FLADDR addr)

{

?? bit EA_SAVE = EA;???????????????

?? char code * data pread;???????????

?? unsigned char byte;

?? EA = 0;???????????????????????????

?? pread = (char code *) addr;

?? byte = *pread;?????????????????????

?? EA = EA_SAVE;??????????????????????

?? return byte;

}

?

void FLASH_ByteWrite (FLADDR addr, char byte)

{

?? bit EA_SAVE = EA;???????????????

?? char xdata * data pwrite;???????

?? EA = 0;???????????????????????????

?? pwrite = (char xdata *) addr;

?? PFE0CN = PFE0CN & 0xFE;?? ?????????

?? PSCTL? = 0x01;??????????????????

?? FLKEY? = 0xA5;??????????????????

?? FLKEY? = 0xF1;?????????????????

?? *pwrite = byte;??????????????????

?? PSCTL = 0;???????????????????

?? EA = EA_SAVE;??????????????????????

}

void FLASH_PageErase (FLADDR addr)

{

?? bit EA_SAVE = EA;????????????????

?? char xdata * data pwrite;?????????

?? EA = 0;?????????????????????????

?? pwrite = (char xdata *) addr;

?? FLKEY? = 0xA5;????????????????????

?? FLKEY? = 0xF1;????????????????????

?? PSCTL? = 0x03;?????????????????

?? *pwrite = 0;??????????????????????

?? PSCTL = 0;??????????????????

?? EA = EA_SAVE;?????????????????

}

?

可以正常使用串口更新程序, 有需要的, 可以给我留言,一起起步!

?

标签:??
分享到:? 新浪微博 ?? 微信 ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
qq空间 ?? 腾讯微博 ?? 人人网 ?? 百度搜藏 ??
??????有[ 5 ]名读者喜欢此文
阅读(3280)?? 评论(9)?? 收藏??I?? 打印??I?? 推荐到小组??I?? 转发到我的博客 (0)
对不起,您还没有登录,请先登录注册
上一篇:华为发展史

下一篇:电子工程师职业生涯规划

最近到访博主
一名水货工程师的自我修养 xujfhsd makelife2006 lxd2757 ydcman myowl
牛人有话说 - C8051F340 BOOTLOADER 固件升级的的实现过程
美国的游客 (您将以游客身份发表,请登录 | ?注册)
?
你还可以输入1000
验证码:
分享: 新浪微博?? qq空间?? qq微博?? 人人网?? 百度搜藏??
?
有 [ 5 ] 名读者发表评论 - C8051F340 BOOTLOADER 固件升级的的实现过程

中国的游客
你好,可以发一份升级程序和电路图给我吗?万分感激。707051284@qq.com
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2016-06-21 09:47
你好!怎么称呼你,我是陈晓奇,这位朋友我目前也正在研究如何通过串口IAP升级源程序的,搞了好久始终没有弄出来,我这边想请求你,能否帮助一下我处理这方面的事情,我的邮箱是76449518@qq.com
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2016-04-05 13:45

北京市的游客
请问有固件升级源程序吗,发麻烦发给我一份,谢谢!我的联系方式:yuanyuhua@163.com
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2015-08-04 16:05
你好!我正在学习IAP升级,希望高手发一份完整的资料和相关的代码学习一下,谢谢!邮箱:410621347@qq.com
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2015-01-27 14:53

广东省广州市的游客

我正在做c8051f340的串口升级,没有用到中断向量的映射,看了你的方法,感觉挺好的,能给我发个完整的程序借鉴下吗,谢谢!邮箱:282679163@qq.com

(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2013-06-08 09:05

北京市的游客

非常感谢!!!!

(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2013-03-07 13:43
能否支持I2c和usb的呢? xzf20082004@163.com ,求一份
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2012-12-18 10:14

湖北省武汉市的游客
我完全搞不懂 c基础不是特别好 现在好迷茫 现在要完成c8051f060的flash升级好吃力 邮箱807812858@qq.com 希望前辈能多多指点 告知现在应怎么学习
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2012-11-27 17:41
lz有完整程序吗,我正在做cc2430的串口升级,希望能够借鉴一下,可以发我一份吗?谢谢,邮箱:abel89@126.com
(0) ???? (0) ???? 回复(0)
对不起,您还没有登录,请先登录注册
???? 2011-09-26 14:37
转发到我的博客
评论?@081010's Blog?的“C8051F340 BOOTLOADER 固件升级的的实现过程”
实现过程:一:内部flash的空间划分0XFFFF保留区应用程序区BOOTLOADER可操作区域0XF0000X10000X10000X0000二:中断向量软件映射MCU中断向量分布在复位(0x0000)以后,按规则排布,若改变编译器设置,如51,可改变程序在FLASH中的位置,可改变中断向量起始点...
你还可以输入30000
同时评论给?081010
????
快速回复
?
你还可以输入1000
????
引用回复
引用评论?
?
你还可以输入1000
????
文章存档
2011年05月 (4) 2011年04月 (2)
? ?
? ?
最新评论
阅读排行
081010的小组???? 加入小组
STM32爱好者之家
成员6660名
创建者:yuliang0321 单片研习-STM32 成员1014名
创建者:jshmlly
最新网络博文
华为官方回应有关自研手机操作系统的传闻
这颗芯片有故事,你有酒吗?
PCB设计PADS各层的用途和作用
联想收购的得与失 摩托罗拉空壳化使...
传华为智能机销量目标下调2000万部 Ma...
? 更多博文>>
返回博客首页
有问题请反馈