MSP430 远程升级功能:
基于
1、片外EEPROM(片内flash够大也可使用片内)
2、射频通信
3、上位机软件(传输升级文件)
总结点:
1、程序运行总是从复位中断向量开始寻址入口执行,中断向量就是保存每个中断触发满足后的中断函数的入口地址的存储单元。
根据数据手册上诉说The interrupt vectors are located in the address range 0FFFFh to 0FF80h, for a maximum of 64 interrupt
sources ,默认中断向量位置为0XFF80~0XFFFF,长度为0x80.
MSP430FR5969的头文件中定义复位向量为 #define RESET_VECTOR (55 * 2u) /* 0xFFFE Reset [Highest Priority] */
默认值0XFFFE~0XFFFF这两个字节是复位中断向量,存储是主函数在FLASH的运行起始地址。如主函数保存在
P(CODE)CODE=4400-4A00
则0XFFFE内保存的是0X00,0XFFFF内保存的是0X44;则系统复位后,就到0XFFFE,0XFFFF中去寻找主函数的入口地址。
其他中断函数的运行地址也保存在相应的向量中,当触发中断的条件满足后,程序根据中断向量内所指的地址去寻址中断函数的入口地址。
工程建立产生一个link文件(.xcl文件),文件中定义了内存划分,CODE代码段存储位置,中断向量表默认值从0XFF80~0XFFFF表述为
-Z(CONST)SIGNATURE=FF80-FF8F
-Z(CONST)JTAGSIGNATURE=FF80-FF83
-Z(CONST)BSLSIGNATURE=FF84-FF87
-Z(CONST)IPESIGNATURE=FF88-FF8F
-Z(CODE)INTVEC=FF90-FFFF
-Z(CODE)RESET=FFFE-FFFF
2、要进行远程文件升级,则需要将代码划分为两段代码:BOOT、应用程序APP两段代码,若有升级文件,在应用程序中接收文件存储入片外epprom,再使用BOOT将文件搬移到应用程序区。
3、前面谈到程序运行总是从中断向量表中启动,那么内存中有两段代码(BOOT、应用程序APP),他们的中断向量指向的位置就不能一致,即需要修改link文件。
我们使BOOT代码的启动位置为默认值,修改应用程序的启动区和代码区存储位置
BOOT的link文件
-P(CODE)CODE=4400-4A00
-Z(CODE)CODE_PAD
// ---------------------------
// Constant data
//
-Z(CONST)DATA20_C,DATA20_ID,CODE_ID=4400-4A00,
// -------------------------------------
// Signature memory and interrupt vectors
//
-Z(CONST)SIGNATURE=FF80-FF8F
-Z(CONST)JTAGSIGNATURE=FF80-FF83
-Z(CONST)BSLSIGNATURE=FF84-FF87
-Z(CONST)IPESIGNATURE=FF88-FF8F
-Z(CODE)INTVEC=FF90-FFFF
-Z(CODE)RESET=FFFE-FFFF
应用程序的link文件
-P(CODE)CODE=5000-FE7F,10000-13FFF
-Z(CODE)CODE_PAD
// ---------------------------
// Constant data
//
-Z(CONST)DATA20_C,DATA20_ID,CODE_ID=5000-FE7F,10040-13FFF
// -------------------------------------
// Signature memory and interrupt vectors
//
-Z(CONST)SIGNATURE=FE80-FE8F
-Z(CONST)JTAGSIGNATURE=FE80-FE83
-Z(CONST)BSLSIGNATURE=FE84-FE87
-Z(CONST)IPESIGNATURE=FE88-FE8F
-Z(CODE)INTVEC=FE90-FEFF
-Z(CODE)RESET=FEFE-FEFF
表述为BOOT应用程序代码存储位置从0X4400开始,中断向量默认
应用程序代码存储位置从0X5000开始,中断向量修改为从0XFE80~0XFEFF
4、BOOT程序设计和应用程序设计
应用程序设计:(上位机软件->射频升级文件传输->设备接收)设备接收存储入片外EEPROM,将中断向量修改为BOOT的向量表
memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFF00, 0x80);/* 中断向量改成boot的起始地址。FF00为boot的向量备份 */
重启代码,程序从BOOT开始运行;
BOOT程序设计:检测片外EEPROM是否有升级文件,若有则将数据拷贝到片内存储(),擦除片外EEPROM
memcpy((ST_UINT16 *)0xFF00, (ST_UINT16 *)0xFF80, 0x80);
/* 还原中断相量 */
memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFE80, 0x80);
将BOOT的中断向量备份到0XFF00,将应用程序的中断向量0XFE80拷贝到FF80,重启程序BOOT程序(0xFF80),程序即从应用程序指定的位置(0xFE80)开始执行应用程序。
5、将boot和应用程序同时烧进单片机
boot程序生成TXT文件,应用程序生成TXT文件,使用工具将两个文件拼接生成.bin与.txt文件,使用FET-Pro430烧写进430单片机
首次程序运行为从默认0XFF80开始运行,开始执行BOOT程序,检测到EEPROM无升级文件,备份BOOT中断向量到0XFF00,将中断向量改为应用程序中断向量0XFE80,重启BOOT程序,则程序指向应用程序中断向量,开始运行应用程序;
收到升级文件.bin,存储数据,将BOOT的备份向量0XFF00拷贝到0XFE80,重启应用程序,则程序指向BOOT中断向量,开始执行BOOT程序。