This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5529:定制 BSL 及其加载方式。

Guru**** 2539310 points
Other Parts Discussed in Thread: MSP-FET, MSP430F5529

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/860034/msp430f5529-custom-bsl-and-how-to-load-it

器件型号:MSP430F5529
主题中讨论的其他器件:MSP-FET

您好!

我所面临的用例与链接的帖子类似-需要通过从外部闪存(SST25VF)读取新版本来现场更新 MSP 固件。

问题是:

1) 1)如果新版本损坏-如何执行 MSP430程序存储器擦除以加载回之前的版本?

2) 2)我希望我正确-固件会加载到程序存储器中、即  

3) 3)当我完成1)和2)-下一步是将 BSL 代码加载到 BSL 中。 我很难确定如何实现这一点。 一些消息来源说、我可以通过 UART 通过 COM 端口逐字节发送它、并将其直接写入存储器、另一些消息说、自定义 BSL 应首先加载到 RAM、执行并写入闪存的 BSL 部分。

这是我第一次使用定制的 BSL、非常感谢您的帮助。

已经浏览 过 http://www.ti.com/tool/MSPBSL#step3、 slaa450f 和 slau319ab、但仍然需要指出一些问题。

此致、

Konstantin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Konstantin、

    1.链接在哪里? 第一个问题。 如果要实现此功能、则需要使用存储器的一部分来保存新的客户应用程序代码。 存储器的另一部分、用于保存旧的客户应用程序代码。 我们没有此函数、因为代码大小受限。 如果您要执行此操作、可以尝试主存储器 BSL。

    2) 2) 是的

    3)关于 此 部分,您可以按字节发送代码,但每个代码都需要遵循统一协议。 实际上、它在闪存中保存的字节数取决于您在一个通信中发送的字节数。 有关详细信息、您可以参考 BSL 代码。 无论如何、您无需考虑此器件、因为您可以直接使用示例代码。

    伊斯天

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、伊斯天、

    该链接显示了标题 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/851921 ,其内容为“原始问题”,可能由于页面打开且标题位于顶部而无法看到。

    感谢您的回答。 下面是一些其他内容:

    1) 1)我有 Olimex JTAG-Tina-v2编程器、它是否可用于访问 BSL 区域以在那里加载我的定制 BSL? TI 文档仅针对这些用途提及 BSL-Rocket 和 MSP-FET。

    2) http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPBSL_CustomBSL430/latest/index_FDS.html BSL_API 是编写定制 BSL 的实际工具、对吧?

    3) 3) massErase 是否也擦除 BSL 代码、或者仅擦除程序和信息闪存部件?

    此致、

    Konstantin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)任何闪存工具均可用于上传自定义 BSL。 默认情况下、BSL 区域被锁定/保护、因此应首先将其解锁。

    2)是、默认情况下、MSP430F5529出厂预加载 了 MSP430F552x_USB BSL

    3) 3)否、BSL 只能通过段擦除命令进行擦除、应首先解锁。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Konstantin、

    1) 1)对于 BSL、它是 UART、RST 和 TEST 的组合。 这意味着您需要 RST 和 TEST 来生成入口序列并使用 UART 进行传输。 实际上、您可以使用任何 USB 转串行转换 器来传输数据、但对于调用序列、我担心 Olimex JTAG-Tina-v2编程器不支持。

    2) 2)是的、它用于主存储器中的 BSL。 如果存储器足够大、您可以选择它。

    3) 3)否、您需要选择信息存储器并启用 BSL 代码擦除。

    伊斯天

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、伊斯天、

    因此、如果我想将主存储器用作 BSL 存储-我应该更好地使用 BSL_API、如果我想使用受保护的2KB BSL 区域-我编写自己的代码、调用 BSL 并通过 UART 加载代码的映像?

    直接问、像这个一样的代码(仍在进行中)是否可以加载到2KB BSL?

    //
    //部分包括:
    //*********
    //#include "msp430f5529.h"
    
    #include "types.h"
    #include "UART_SPI.h"
    //#include "MSP430x5xxx_LibFlashSPI.h"
    
    //*********
    //段变量:
    //*********
    //------ 全局变量---
    
    //------ 局部变量---
    #define CRC_POLYNOM 0x04C11DB7
    
    #define DEVICE_SIZE 0x7FFFF
    #define HALF_MEMORY 0x40000
    #define CODE_MEMORY_A_START_ADDRESS 0x004400
    #define DEFAULT_VERSION 0x0000
    
    #define HEADER 1
    #define DATA 2
    #define CRC 3
    
    
    
    /
    //段原型本地函数:
    //*********
    
    //
    //部分功能:
    //*********
    void CRC32_w (uint32_t data、uint32_t* prev_CRC){
    uint32_t CRC =(* prev_CRC);
    CRC ^=(uint32_t) data;
    
    对于(uint32_t i = 0;i < 32;i++){
    IF (((CRC >> 31)& 0x1)
    CRC =(CRC << 1)^ CRC_POLYNOM;
    其他
    CRC <= 1;
    }
    * prev_CRC =(CRC ^ 0);
    }
    
    uint32_t flash_read_word (uint32_t addr){
    uint8_t DATA_Rx[4]={0};
    SPI_READ (addr、DATA_Rx、4);
    返回((uint32_t) DATA_Rx[0]<< 0)|
    ((uint32_t) DATA_Rx[1]<< 8)|
    ((uint32_t) DATA_Rx[2]<< 16)|
    ((uint32_t) data_rx[3]<<24);
    }
    
    void main (void){
    WDTCTL = WDTPW + WDTHOLD;
    
    //初始化
    //SPI 引脚初始化
    P4SEL |= BIT0;
    P4MAP0 |= PM_UCA1CLK;
    P4SEL &=~BIT3;
    P4DIR |= BIT3;
    P4SEL |= BIT4;
    P4OMAP4 |= PM_UCA1SIMO;
    P4SEL |= BIT5;
    P4MAP5 |= PM_UCA1SOMI;
    
    //复位引脚初始化
    P7SEL &=~BIT0;
    P7DIR |= BIT0;
    
    spi_init();
    
    
    uint32_t crc;
    uint32_t flash_addr = half_memory;
    uint32_t * prog_addr;
    uint8_t prog_stage=标头;
    bool last_block = false;
    bool active_prog_progress = true;
    bool prog_ready = false;
    bool prog_default_firmware = false;
    
    uint16_t firmware_size = 0;
    uint16_t version =(uint16_t)((flash_read_word (half_memory)<<16)&0xFFFF);
    uint16_t current_loaded_version =(uint16_t)((flash_read_word (half_memory - 4)<<16)&0xFFFF);
    
    if (version = currently loaded_version)
    PROG_READY = true;
    Active_prog_progress = false;
    
    while (active_prog_progress){
    uint32_t DATA_FTER_FLASH = FLASH_READ_WORD (FLASH_addr);
    
    开关(prog_stage){
    案例标题:{
    版本=(uint16_t)((DATA_FLOW_>16)&0xFFFF);//前16位为修订版
    firmware_size =(uint16_t)(DATA_FLOW_0xFFFF);
    
    PROG_addr =(uint32_t*)(CODE_MEMORY_A_START_ADDRESS);
    
    last_block =(DATA_FER_FLASH >> 31)&& 0x1;//检查大小是否为 evem 或 ODD
    //计算 CRC
    CRC = 0xFFFFFFFF;
    CRC32_w (DATA_FIT_FLASH、&CRC);
    //下一阶段
    PROG_STAGE =数据;
    
    中断;
    }
    案例数据:{
    //计算 CRC
    CRC32_w (DATA_FIT_FLASH、&CRC);
    //写入 prpogram 内存
    * prog_addr = data_from_flash;
    PROG_addr++;
    //下一阶段
    如果(--firmware_size =0)
    PROG_STAGE = CRC;
    中断;
    }
    
    案例 CRC:{
    //检查 CRC
    if ((data_from_flash!= crc)&&(prog_default_firmware)){
    P7OUT &=~BIT0;//MSP_SOFT_RESET 标志
    Active_prog_progress = false;
    } 否则、如果(LAST_BLOCK){
    PROG_READY = true;
    Active_prog_progress = false;
    } 否则{
    PROG_STAGE =标头;
    PROG_DEFAULT_firmware = true;
    }
    中断;
    }
    }
    flash_addr += 4;
    if (flash_addr > device_size){
    flash_addr = half_memory;
    Active_prog_progress = false;
    }
    }
    
    SPI_uninit ();//Resets UCA1CTL
    if (prog_ready){
    WDTCTL = 0xDEAD;
    } 否则{
    while (1);
    }
    }
    
    //*********
    //文件的 ENF
    //********* 

    've="" encountered="" as="" msp="" dev="" so="" far="">

    Konstantin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不需要发明任何东西(从零开始)。 如果您需要定制 USB BSL、则从 TI IAR_v6_MSP430F552x_USB 模板开始。 如果您需要自定义 UART BSL、请从 TI IAR_v6_MSP430F552x_TA_UART 模板开始。 这两个都(默认情况下)配置为2 KB BSL 区域。 所有源代码和发布的映像都位于 MSP430BSL_1_01_00_01.zip 文件中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Konstantin、

    是的、您可以。

    但是、如果您根据我们的代码示例进行更改、则会非常容易。 您只需要更改通信部分。 默认为 UART。

    最重要的是、您不能在代码中使用 ISR 中断。

    伊斯天