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.

[参考译文] MSP430G2553:MSP 引导+单个应用程序

Guru**** 2378650 points
Other Parts Discussed in Thread: MSP-EXP430G2ET, MSP430G2553, CC3235SF, MSP430G2533
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1469924/msp430g2553-msp-boot-single-application

器件型号:MSP430G2553
主题中讨论的其他器件: CC3235SFMSP430G2533、MSP-EXP430G2ET

工具与软件:

尊敬的 TI 支持团队:


我想将 OTA 固件更新功能集成到 MSP430G2553中。 我已经阅读了有关 MSP 引导的应用手册、并按照本文档中给出的步骤-> www.ti.com/.../slaa600e.pdf

我无法直接使用 BSL、因为部署的卡中使用了硬件引脚配置。 我使用 UART 通道进行固件更新。 在此示例代码中、首先我们需要将 MSP 引导固件刷写到目标 器件(MSP430G2553)、然后主机(MSP430G2553)将新的应用程序映像写入目标器件。 我的要求与此不同。  

我的主机器件是 cc3235sf、它 通过 RS485与 MSP430G2553进行通信。 现在、我想开发并刷写单个固件、  其中首次包含引导加载程序+一个应用程序、而不是仅将 MSP-boot 固件刷写到目标。 因此、应用程序将在第一次及以后运行、我可以根据需要将新应用更新到 msp430g2533中。
我想将 CPU 配置为16MHz、但示例中使用了代码8MHz。  根据->MSP430G2553 微控制器勘误表(修订版 K) 、   配置后无法一次性更改内部时钟频率。 如果我们确实这样说、则 时钟可能会停止或将无法正确配置。 然后、我们 需要逐步 读取和设置 RSEL。 如果我们要 在初始化后配置时钟频率、您能否提供一些相关示例代码?  
 
 关于 OTA 特性和 初始化后的时钟配置、请帮我解决此问题。

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

    您好、 Vinod Kumar

    slaa600e 上的 MSPboot 示例代码链接已断开。 请在 链接上找到 mspboot  

    在勘误表中、我可以确认您是否指向 BCL12吗?

    对16MHz 的时钟配置、请检查  https://www.ti.com/tool/download/SLAC485中 msp430g2xx3_DCO_calib.c 的 DCO = 16MHz 示例代码

    谢谢!

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

    李晓东

    我指的是 BCL12。 您能否确认下面的代码是否正常运行?

    示例:

    void Clock_init (void)

    if (((BCSCTL1 & 0x0F)> 13)&&((CALDCO_1MHz & 0x0F)< 12))

    BCSCTL1 =((BCSCTL1和0xF0)| 0x0D);
    }
    否则 if (((BCSCTL1 & 0x0F)< 12)&&((CALDCO_1MHz & 0x0F)> 13)

    BCSCTL1 =((BCSCTL1和0xF0)| 0x07);
    }
    否则 IF ((BCSCTL1 & 0x0F)= 0x0F)

    BCSCTL1 =((BCSCTL1和0xF0)| 0x07);
    }

    IF (CALBC1_16MHz = 0xFF)//如果校准常数已擦除

    while (1);//请勿加载、陷阱 CPU!
    }

    DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
    BCSCTL1 =(CALBC1_16MHz & 0xCF);//设置 DCO
    DCOCTL = CALDCO_16MHz;
    BCSCTL3 = LFXT1S1+ XCAP0;

    }

     
    您能否解释一下如何使用 MSP 引导加载程序(UART 引导加载程序)和应用程序作为单个(合并).txt 文件进行刷写?

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

    您好、 Vinod Kumar

    我比较了  msp430g2xx3_DCO_calib.c 上的16MHz 时钟设置代码

    没错  

    //16MHz
    if (CALBC1_16MHz=0xFF)//如果校准常数已擦除

    while (1);//请勿加载、陷阱 CPU!
    }
    DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
    BCSCTL1 = CALBC1_16MHZ;//设置范围
    DCOCTL = CALDCO_16MHz;//设置 DCO 步长+调制*/

    我可以仔细检查这部分代码是否可以正常工作。  

    我需要一些时间来准备 MSP-EXP430G2ET

    我将在稍后反馈测试结果

    谢谢

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

     

    我想签入 MSP430勘误表中与 BCL12相关的权变措施的示例代码。 我理解您可能需要更多时间、但如果您有任何更新、我非常感谢您能够提供这些更新。

    此外、在 MSPBOOT 示例中、16字节的数据正在写入闪存。 我们如何使用闪存中的块写入选项来写入64字节的数据? 您能否就所需的必要更改提供建议?

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

    您好、 Vinod Kumar

    >> 如果您有任何更新、我非常感谢您提供这些更新

    感谢您的理解!

    >>阻塞写入、您能否告知需要进行的必要更改?

    闪存写入模式包括字节或写入模式、以及由 FCTL1.BLKWRT 分隔为或不是1的块写入模式。 请参阅 UM 的7.4.1 FCTL1寄存器

    请在 7.3.3.5 "块写入流程"和" UM 示例"一章中查找流程和示例代码(带有注释的 asm)

    MOV #FWKEY_BLKWRT+WRT、&FCTL1;启用块写入

     块写入模式还需要这个代码。

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

    尊敬的李晓东:

    感谢您的回复!

    我目前正在.txt使用 MSP430G2553的 MSPBoot 实用程序将一个文件转换为 C 数组。 转换后,我注意到数组元素的数量似乎保持不变,无论应用程序的大小或.txt使用的文件。

    具体来说、我试图将应用程序的大小从8KB 增加到14KB、但在转换后、我仍然只在生成的 C 数组中观察到3个段(例如、App1_Addr[3]App1_Size[3])。

    我的问题是、是否可以保证转换后数组中只存在3个元素、或者此行为是否依赖于 MSPBoot 实用程序内的某些配置或限制?

    期待您的见解!

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

    您好、 Vinod Kumar

    我们团队的专家也会为您的问题提供支持。

    谢谢

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

    李晓东

    您能否在块写入模式方面提供进一步的帮助? 我需要一个使用块写入模式写入闪存的 C 代码示例。 由于一个块写入不能从闪存存储器内发起、它必须从 RAM 被触发。 我们如何使用引导加载程序或通过修改 MSPBoot 工程创建器实用程序生成的链接器文件来将函数放置在 RAM 中?

    此外、如果能在前面关于将.txt 文件转换为 C 数组中的段数的问题中得到进一步的帮助、我将不胜感激


    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的问题是:是否有任何保证在转换后数组中只存在3个元素?或者此行为是否取决于 MSPBoot 实用程序中的某些配置或限制?

    段数取决于.txt 固件中存在的 μ@地址中有多少、如下所示

    对于锁定写入、我们在用户指南中提供了一个汇编代码 、如下所示

    下面是我将代码转换为汇编代码但尚未经过测试的代码、您可以尝试一下


    while (FCTL3 & busy);//等待闪存控制器就绪(L1循环等效)
    /*闪存时序配置*/
    FCTL2 = FWKEY | FSSEL1 | FN0;//时钟源= SMCLK/2
    FCTL3 = FWKEY;//清除写入访问的锁定位
    /*块写入模式激活*/
    FCTL1 = FWKEY | BLKWRT | WRT;//启用块写入模式(与 MOV #FWKEY+BLKWRT+WRT、&FCTL1等效)
    /*主写入操作循环*/
    执行{
    * write_ptr = Write_Value;//将数据写入闪存(MOV Write_Value、0 (R6))
    /*写入周期同步*/
    while (!(FCTL3 & wait));//等待闪存控制器就绪(L3循环等效)

    write_ptr++;//递增写入指针(等效于 INCD R6)

    } while (--write_counter);//循环控制(DEC R5和 JNZ L2等效)
    /*写后清理*/
    FCTL1 = FWKEY;//清除写入模式标志(等效于 MOV #FWKEY、&FCTL1)
    /*最终状态验证*/
    while (FCTL3 & BUSY);//确认操作完成(L4环等效)
    /*闪存保护复位*/
    FCTL3 = FWKEY | LOCK;//启用 Re 闪存安全性(等效于 MOV #FWKEY_+LOCK、&FCTL3)

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

    大家好、Gary Gao、

    1.段数

    以下是我对段数的理解、基于以下示例:

    // C array after conversion from .txt to C array using MSPBoot utility
    const uint16_t App1_Addr[3] =
    {
    0xc002, // Address segment0
    0xfbc2, // Address segment1
    0xfbfe, // Address segment2
    };

    const uint16_t App1_Size[3] =
    {
    244, // Size segment0
    52, // Size segment1
    2, // Size segment2
    };
    • 0xc002–应用程序的开始,大小: 244.
    • 0xfbc2–中断代理表、大小:2
    • 0xfbfe–应用程序复位向量、大小:2

    此信息源自 MSPBoot 的 MSP430G2553 UART 引导加载程序示例代码。 上述所有信息都存储在链接器文件中。 如果我们不进行任何更改、从 TI 的.txt 文件转换为 C 数组后、我们始终有三个元素。


    2.块写入模式下的闪存写入

    关于您在块写入模式中为闪存写入提供的代码:它只有当从 RAM 中执行时才正确工作。 为了将函数放置到 RAM 中、我使用了以下属性:

    __attribute__((ramfunc)) uint8_t TI_MSPBoot_MI_FLASH_BLOCK_Write(uint16_t *addr, uint16_t *data)
    {
    // Function implementation
    }

    这是正确的方式吗?

    现在我能刷写应用程序一次、但是之后不行。 这是因为该函数位于 RAM 中、仅当此函数所用位置保持不变时、才会工作。 因此、函数应该被放置在 RAM 中的特定位置。 此外、这个位置应该被保留并且防止被应用程序代码改变。

    您能帮助我确保将此函数放置在固定的 RAM 位置吗? 另外、我需要获取有关确保此位置受到保护从而不会被应用程序代码覆盖的指导。 理想情况下、此信息应反映在引导加载程序和应用程序项目的链接器文件中。


    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此信息源自适用于 MSPBoot 的 MSP430G2553 UART 引导加载程序示例代码。 上述所有信息都存储在链接器文件中。 如果我们未进行任何更改、则在从 TI 的.txt 文件转换为 C 数组后、始终有三个元素。[/QUOT]

    对于此文件、主机 MCU 可使用、易于调用需要下载到目标 MCU 中的 C 代码。 它对链接器文件没有任何影响。 您无需考虑它有多少元素、它将由主机处理。

    您可以尝试执行此操作以在特定地址修复函数

    为了避免应用程序代码使用某些存储器区域、例如上面所需的某些 RAM 区域、您只需修改链接器文件(CCS 中的 cmd 文件)、以确保应用程序链接器文件不包含您上面使用的 RAM 区域即可。  

    例如、如果器件 RAM 从0x2000到0x2300、并且需要0x100用于特殊用途、因此您可以在 cmd 中按如下方式定义 RAM