【MSP430单片机OTA 升级及 XCL 文件详解】

1. MSP430 远程升级环境

MSP430 微控制器支持通过远程升级来更新固件,通常涉及以下组件:

  1. 外部 EEPROM 或片内 Flash:在存储容量充足的情况下,可以使用片内 Flash。
  2. 射频通信模块:用于接收升级文件。
  3. 上位机软件:用于传输和管理升级文件。

2. 程序启动和中断向量表

程序在 MSP430 上的运行总是从复位中断向量(Reset Interrupt Vector)开始,这意味着中断向量表用于存储每个中断触发后的中断服务例程(ISR)入口地址。

根据数据手册,MSP430 的中断向量位于地址范围 0xFFFF0xFF80 之间,最多支持 64 个中断源。中断向量的默认位置为 0xFF800xFFFF,长度为 0x80 字节。

在 MSP430FR5969 的头文件中,定义了复位向量如下:

#define RESET_VECTOR (55 * 2u) /* 0xFFFE Reset [Highest Priority] */`

默认情况下,0xFFFE0xFFFF 这两个字节存储的是复位中断向量,指向主程序在 Flash 中的起始地址。例如,主程序存储在 0x44000x4A00 之间,那么 0xFFFE 存储 0x000xFFFF 存储 0x44。当系统复位后,程序从 0xFFFE0xFFFF 中获取主函数的入口地址并执行。

其他中断服务例程的地址也存储在相应的中断向量中。当满足中断触发条件时,程序根据中断向量中的地址跳转到对应的中断服务例程入口。

3. XCL 文件解析

在工程创建过程中,会生成一个链接文件(.xcl 文件),该文件定义了内存的划分,如代码段(CODE)和中断向量表的位置。默认情况下,中断向量表从 0xFF800xFFFF,内容如下:

-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升级处理

  1. 程序首次运行

    • 系统首次上电时,从默认的 0xFF80 地址开始运行,启动 BOOT 程序。
    • BOOT 程序检测到片外 EEPROM 中无升级文件,备份 BOOT 的中断向量到 0xFF00,并将中断向量修改为指向应用程序的中断向量地址 0xFE80
    • 系统重启后,程序从应用程序的中断向量开始运行。
  2. 升级文件处理

    • 当设备收到新的升级文件 .bin 后,将数据存储在片外 EEPROM 中。
    • 将 BOOT 的备份向量(0xFF00)拷贝到 0xFE80,并重启应用程序,使程序指向 BOOT 的中断向量,开始执行 BOOT 程序。

这种设计方法确保了在升级过程中,系统始终有一个稳定的启动点(BOOT 程序),并且可以灵活切换到新的应用程序。

5.1 APP程序设计

应用程序设计的工作流程如下:

  1. 文件接收与存储:上位机软件通过射频模块将升级文件传输到设备,设备接收到升级文件后,将其存储在片外 EEPROM 中。

  2. 中断向量修改:为了确保系统从 BOOT 程序启动,应用程序需要将中断向量修改为指向 BOOT 程序的向量表:

    // 将中断向量改成BOOT的起始地址,0xFF00 为 BOOT 向量的备份地址。
    memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFF00, 0x80); 
  3. 重启设备:重启设备后,系统将从 BOOT 程序开始运行。

5.2 BOOT程序设计

BOOT 程序的主要工作是管理固件升级过程,包括以下几个步骤:

  1. 检测升级文件:系统启动后,BOOT 程序会检查片外 EEPROM 是否有升级文件存在。

  2. 文件更新:如果检测到有新的升级文件,BOOT 程序将其拷贝到片内存储区,并擦除片外 EEPROM 中的内容:

    // 还原中断向量
    memcpy((ST_UINT16 *)0xFF00, (ST_UINT16 *)0xFF80, 0x80); 
    // 将应用程序的中断向量 (0xFE80) 拷贝到 BOOT 中断向量地址 (0xFF80)
    memcpy((ST_UINT16 *)0xFF80, (ST_UINT16 *)0xFE80, 0x80))
  3. 重启应用程序:将 BOOT 的中断向量备份到地址 0xFF00,然后将应用程序的中断向量 (0xFE80) 拷贝到默认的中断向量位置 0xFF80,最终重启设备,使程序从应用程序指定的位置 (0xFE80) 开始执行。

6. 程序烧写到单片机方法

生成烧写文件

  • BOOT 程序生成 .txt 文件。
  • 应用程序生成 .txt 文件。
  • 使用工具将两个文件拼接生成合并的 .bin.txt 文件。
  • 使用 FET-Pro430 工具将合并文件烧写到 MSP430 单片机中。

7. 结论

通过配置 MSP430 的中断向量表和利用 .xcl 文件的灵活性,可以实现固件的 OTA 远程升级。有效的引导加载程序设计和存储管理是确保远程升级可靠性和安全性的关键。

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值