1. MSP430 远程升级环境
MSP430 微控制器支持通过远程升级来更新固件,通常涉及以下组件:
- 外部 EEPROM 或片内 Flash:在存储容量充足的情况下,可以使用片内 Flash。
- 射频通信模块:用于接收升级文件。
- 上位机软件:用于传输和管理升级文件。
2. 程序启动和中断向量表
程序在 MSP430 上的运行总是从复位中断向量(Reset Interrupt Vector)开始,这意味着中断向量表用于存储每个中断触发后的中断服务例程(ISR)入口地址。
根据数据手册,MSP430 的中断向量位于地址范围 0xFFFF
到 0xFF80
之间,最多支持 64 个中断源。中断向量的默认位置为 0xFF80
到 0xFFFF
,长度为 0x80
字节。
在 MSP430FR5969 的头文件中,定义了复位向量如下:
#define RESET_VECTOR (55 * 2u) /* 0xFFFE Reset [Highest Priority] */`
默认情况下,0xFFFE
到 0xFFFF
这两个字节存储的是复位中断向量,指向主程序在 Flash 中的起始地址。例如,主程序存储在 0x4400
到 0x4A00
之间,那么 0xFFFE
存储 0x00
,0xFFFF
存储 0x44
。当系统复位后,程序从 0xFFFE
和 0xFFFF
中获取主函数的入口地址并执行。
其他中断服务例程的地址也存储在相应的中断向量中。当满足中断触发条件时,程序根据中断向量中的地址跳转到对应的中断服务例程入口。
3. XCL 文件解析
在工程创建过程中,会生成一个链接文件(.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
d-Z(CODE)RESET=FFFE-FFFF
4. 远程文件升级实现
为了实现远程文件升级,通常将固件分为两个部分:引导加载程序(Bootloader)和应用程序(APP)。当有新的固件升级文件时,应用程序负责接收文件并将其存储到外部 EEPROM 或片内 Flash 中。然后,引导加载程序将升级文件移动到应用程序存储区域。
4.1 双代码区的中断向量表配置
程序在 MSP430 上的运行总是从中断向量表中启动。当内存中同时存在两段代码(Bootloader 和应用程序)时,它们的中断向量指向的地址不应相同,因此需要修改链接文件来配置内存分布。
4.2 Bootloader 的链接文件配置
默认情况下,Bootloader 的中断向量表配置如下:
// Code 代码存储区域
-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
4.3 应用程序的链接文件配置
应用程序的链接文件配置如下:
// Code 代码存储区域
-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-FFFF
-Z(CODE)RESET=FFFE-FFFF
5. OTA升级处理
-
程序首次运行:
- 系统首次上电时,从默认的
0xFF80
地址开始运行,启动 BOOT 程序。 - BOOT 程序检测到片外 EEPROM 中无升级文件,备份 BOOT 的中断向量到
0xFF00
,并将中断向量修改为指向应用程序的中断向量地址0xFE80
。 - 系统重启后,程序从应用程序的中断向量开始运行。
- 系统首次上电时,从默认的
-
升级文件处理:
- 当设备收到新的升级文件
.bin
后,将数据存储在片外 EEPROM 中。 - 将 BOOT 的备份向量(
0xFF00
)拷贝到0xFE80
,并重启应用程序,使程序指向 BOOT 的中断向量,开始执行 BOOT 程序。
- 当设备收到新的升级文件
这种设计方法确保了在升级过程中,系统始终有一个稳定的启动点(BOOT 程序),并且可以灵活切换到新的应用程序。
5.1 APP程序设计
应用程序设计的工作流程如下:
-
文件接收与存储:上位机软件通过射频模块将升级文件传输到设备,设备接收到升级文件后,将其存储在片外 EEPROM 中。
-
中断向量修改:为了确保系统从 BOOT 程序启动,应用程序需要将中断向量修改为指向 BOOT 程序的向量表:
// 将中断向量改成BOOT的起始地址,0xFF00 为 BOOT 向量的备份地址。 memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFF00, 0x80);
-
重启设备:重启设备后,系统将从 BOOT 程序开始运行。
5.2 BOOT程序设计
BOOT 程序的主要工作是管理固件升级过程,包括以下几个步骤:
-
检测升级文件:系统启动后,BOOT 程序会检查片外 EEPROM 是否有升级文件存在。
-
文件更新:如果检测到有新的升级文件,BOOT 程序将其拷贝到片内存储区,并擦除片外 EEPROM 中的内容:
// 还原中断向量 memcpy((ST_UINT16 *)0xFF00, (ST_UINT16 *)0xFF80, 0x80); // 将应用程序的中断向量 (0xFE80) 拷贝到 BOOT 中断向量地址 (0xFF80) memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFE80, 0x80))
-
重启应用程序:将 BOOT 的中断向量备份到地址
0xFF00
,然后将应用程序的中断向量 (0xFE80
) 拷贝到默认的中断向量位置0xFF80
,最终重启设备,使程序从应用程序指定的位置 (0xFE80
) 开始执行。
6. 程序烧写到单片机方法
生成烧写文件:
- BOOT 程序生成
.txt
文件。 - 应用程序生成
.txt
文件。 - 使用工具将两个文件拼接生成合并的
.bin
和.txt
文件。 - 使用 FET-Pro430 工具将合并文件烧写到 MSP430 单片机中。
7. 结论
通过配置 MSP430 的中断向量表和利用 .xcl
文件的灵活性,可以实现固件的 OTA 远程升级。有效的引导加载程序设计和存储管理是确保远程升级可靠性和安全性的关键。