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.

[参考译文] MSP432P401R:通过软件调用 BSL

Guru**** 2553260 points
Other Parts Discussed in Thread: MAX3386E, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/684761/msp432p401r-invoke-bsl-via-software

器件型号:MSP432P401R

您好!

我尝试通过我的应用软件使 BSL 运行并进行调用。

我的板上有一个 MAX3386E RS232转换器、连接到 eUSCI_A0。 根据 SLAU622G 第3.3.1节的规定、这是可能的。

我已将以下代码包含在我的应用软件中、通过串行连接命令调用该软件。

#include "msp.h"
#include 
(笑声)
#define BSL_Param 0xFC48DFFF // I2C 从地址= 0x48,接口选择= UART
//#define BSL_API_TABLE_ADDR 0x00202000 // BSL API 表的地址
#define BSL_Entry_function (*((UINT32_t *) BSL_API_TABLE_ADDR)))

...
main()
{...

if (status & STATUS_BSL)
{
Status &=~STATUS_BSL;

MAP_Interrupt_disableMaster();

NVIC->icer[0]= 0xFFFF;
NVIC->ICPR[0]= 0xFFFF;
NVIC->icer[1]= 0xFFFF;
NVIC->ICPR[1]= 0xFFFF;

(((void (*)()) BSL_entry_function)((uint32_t) BSL_Param);//使用给定的 BSL 参数调用 BSL
}
...
} 

当我现在尝试输入 BSL 时、MCU 离开我的应用软件(不响应我在串行上的命令)、但 BSL_scripter 无法与器件建立连接。 使用示波器、我可以看到脚本编写器传入的信号、但器件没有应答。

当我使用全新的 MCU 或器件、并将其重置为出厂默认值时、它会起作用。

BSL_Scripter 从一个命令窗口中启动、如下所示

C:\EigeneDaten\Workspace_v7\Datenloger\Debug>C:\EigeneDateneDataen\Datenblaetter_u_sonstiges\MSP_Doku\MSPBSL_Scripter_win\BSL-Scripter.exe -d -g -n P4xx -i [COM1、UART、9600、奇偶校验]-b -z [reset-->-------------------



用于 BSL 编程的 BSL Scripter 3.3.0 PC 软件2018年4月27日10:50:22
---------------------

日志模式已关闭!
C:\EigeneDaten\Datenetter_u_sonstiges\MSP_Doku\MSPBSL_Scripter_win\BSL-Scripter.exe -d -g -n P4xx -i [COM1、UART、9600、奇偶校验]-b -z [复位]
打开了详细信息!
设备:P4xx
Init 通信参数:[COM1、UART、9600、奇偶校验]
[ERROR_MESSAGE] P4xx BSL 的初始化失败! 退出脚本编辑器!

我不知道为什么它不能正常工作。

此致

Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thomas、
    我不会立即看到任何会说明错误原因的东西。 您能否确认在将应用程序代码刷写到器件时不会擦除信息存储器的任何部分? 如果是正常工作的新器件、则默认出厂 BSL 已就位。

    您是否曾尝试简单地将 BSL 置于 AUTO 模式而不是 UART 模式?

    BSL 中有一个10秒的"超时"。 调用和与 BSL 通信之间的延迟有多长时间?

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

    尊敬的 Chris:

    调用和与 BSL 通信之间的延迟约为2秒。

    我还尝试了自动设置、但没有成功。

    在 msp432p401r.cmd 中、所有 Memorie-sections 都是列表集、我只为从0x0003 B000开始的数据和配置添加了2个段、总长度为0x0000 4000。
    我没有在名为 INFO 的部分更改任何内容、BSL 列表位于该部分。

    当我使用内存浏览器并查看 BSL 的地址(0x0020 2000)时、似乎可以。

    如果在 BSL 代码中以某种方式对一个字节进行了编程、是否有可能将全新的 BSL 闪存到器件中?

    此致、
    Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thomas、
    工厂 BSL 的映像和源代码可在以下位置找到: software-dl.ti.com/.../index_FDS.html

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

    您好!

    使用 uniflash 刷写新新的 BSL 后、脚本程序会连接并传输数据。 最后、我得到一个错误。

    我有点惊讶、只有64532字节被写入、但我的 txt 文件具有198kB。 这将解释 CRC 错误、但为什么他在64532字节后停止?

    此致、
    Thomas

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

    如需更多信息:

    当我读取从地址0x00e8开始且长度为64532字节的 MCU 时、我会得到正确的代码。

    当从0x00e8开始执行一个长度为16字节的 CRC_CHECK_32时、结果与预期一样。

    使用 Intel-hex-file 的另一个尝试也不起作用。

    在哪里可以回读 CSS 中已写入固件的大小?

    此致、
    Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将一个示例中的 TI-txt 文件与我的比较有一个不同之处
    在第17行、我得到了第二条包含地址0x0e8的 μ@语句。 在 Blink_LED.txt (BSL-Scripter zipfile Version 3.3.0)中没有第二个 μ@语句。

    在生成 TI-Hexfile 期间是否会记录错误? 应检查哪些设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我仍在尝试使 BSL 正常工作。

    现在、我无法将我自己的任何程序刷写到 MCU 中。 具有 uniflash 的全新编程 BSL 不会发生任何变化。 blink.txt 示例工作正常。

    我还尝试将 BSL 与 MSP432 LaunchPad 配合使用、但也不起作用。

    我将固件减少到了最小值(TI-TXT-FILE 从192kB 减少到29KB)、以验证大小是否重要而不成功。 我收到相同的验证错误、固件无法运行。

    CCS 设置中必须考虑哪些因素?

    此致、
    Thomas

    编辑:当我将固件文件发送给 TI 员工时、它是否有帮助?

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

    您好!

    我现在在 ccs7中完成了一个完整的新项目。 这也适用于新刷写的 BSL、但不会再使用。

    我将该项目添加到了这个帖子中、希望有人可以使用 look...e2e.ti.com/.../BSL_5F00_TEST.7z

    我希望这是一个小的小错误...

    此致、
    Thomas

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

    Thomas、

      我看不到您的代码有任何问题、但我也会请同事查看。  您还能提供 BSL 脚本编写器正在使用的脚本以及正在下载的.txt 文件吗?  您提到它与新刷写的 BSL 一起工作一次、这让我相信 BSL 本身正在被覆盖。   

    此外、您能否解释 BSL 更新的流程?  您有您提供的用于调用 BSL 的代码、然后进行固件更新。  固件更新是否包含另一个无法正常运行的软件 BSL 调用?  或者、您是在刷新同一程序、然后软件 BSL 调用不起作用。

      我明天将能够使用 BSL 脚本编写器中的闪烁 LED 示例运行您的代码、并告诉您我是否成功。   

    此致、

    Chris  

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

    尊敬的 Thomas:

    我确认这种行为。 3.3.0中有一个错误、并在上周发布的3.4.0中修复。

    如果您可以使用新版本进行测试并让我知道结果、那将会很棒。

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

    您好!

    此版本的工作方式与版本3.3.0不同。 我举了我发布的 befor 的简单示例、并使用 P1.1上的按钮来调用 launchpad 上的 BSL。 在10秒超时内,我 使用以下命令行启动脚本程序:

    BSL-Scripter.exe -d -n P4xx -i [COM2、UART、9600、奇偶校验]-b -w BSL_TEST.txt -v -z [复位]

    这不奏效。

    我使用 uniflash 将新的 BSL 刷写到 launchpad 中、并以相同的方式启动脚本编写器。 这可以正常工作、LED P1.0开始像编程一样闪烁。 我再次在 launchpad 上调用 BSL (按钮 P1.1)并使用相同的参数启动脚本程序、并返回初始化错误。

    thsi 是我尝试刷写到 MCU 中的 ti-txt 文件

    e2e.ti.com/.../BSL_5F00_TEST.txt

    较大的 ti-txt-file 的验证错误仍然存在。 在同一电路板上对 BSL-Scripter 进行相同的调用。

    e2e.ti.com/.../Datenlogger.txt

    此致、
    Thomas

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

    Thomas、

      我需要查看硬件调用的具体细节、但我想与大家分享我在软件调用中所做的工作。  我曾尝试过 BSL_Param、但这没有什么不同。 请找到软件调用示例、我使用的 BSL 脚本以及输出日志。  您能否使用此文件确认您可以通过设置中的 BSL 进行编程?  

    e2e.ti.com/.../swBSLinvoke.c

    e2e.ti.com/.../script_5F00_test_5F00_01.txt

    e2e.ti.com/.../script_5F00_test_5F00_01_5F00_2018May17_5F00_141323.log

    此致、
    Chris

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

    Chris、

    我可以确认您的代码在我的环境中工作。 我也将其与我的代码进行了比较、找不到任何区别、除了代码大小和调用 BSL 启动的方式(中断与串行命令)

    您是否尝试在命令行模式下使用 BSL-Scripter 刷写 Datenlogger.txt 并进行验证? 我使用空白器件尝试了您的代码(使用 uniflash 刷写了新的 BSL)、然后尝试以命令行模式刷写我的软件。 然后验证失败、MCU 不再正常工作。 只有刷写一个新的 BSL 才会有所帮助。

    我可以向您发送我的完整项目、但不想将其发布到论坛中。

    此致、
    Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thomas、
    我需要与我的同事交谈。 我无法使命令行正常工作。 我不断收到一条消息:"系统无法找到指定的文件。 "我怀疑我的安装已损坏,但删除并重新安装无法解决问题。

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

    我发现图像中的地址有问题。
    第一个放置位置为@0、它具有(717行* 16字节)= 11472字节= 0x2CD0
    因此、在第719行中、地址至少应为0x2CD0、但在 Datenlogger.txt 中为@2CA8
    这就是它重写前一部分的原因。
    您是如何生成图像的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Fatmawati、

    我在 CCS 7.4的工程属性中启用了 ARM 十六进制实用程序、并将输出格式更改为 TI-TXT。

    下面是一个屏幕截图:

    在新创建的文件中、第17行中还有一个地址(@00e8)、但我认为它应该是00e4。

    此致、
    Thomas

     

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

    这是创建 TI TXT 文件的方法。 问题来自这个重叠的地址、因此您无法使应用程序按预期运行。
    链接器命令文件中是否有任何手动更改以放置代码? 这可能是发生重叠的另一个原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Fatmawati、

    我插入了2个部分、用于在闪存(MyConfig 和 MyData)中存储数据和配置。 这是命令文件 e2e.ti.com/.../msp432p401r.cmd.txt

    这是 CCS 中的设置

    此致、
    Thomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fatmawati、
    我刚尝试过手动修复的 ti-txt、验证工作正常、但程序根本不起作用。 也许一些跳跃式的行为现在会导致错误的地方。

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

    我想我刚刚解决了一个问题。
    我使用 EUSCI_B0通过 SPI 与另一个芯片进行通信。 在测试代码中插入 SPI 初始化后、BSL 不能与 param 0xFC48FFFF 配合使用。 当我将参数更改为使用 UART (0xFC48DFFF)时、它会再次工作。 当没有器件连接到 SPI 引脚时、也会发生这种情况。 也许您可以验证此行为。

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

    Thomas、

      您能给我一个有关您的应用的 SPI 配置的信息吗?  在自动编码中、BSL 将配置 UART、SPI 和 I2C。

    //初始化外设
    switch (BSL432_ActivePeripheral){
    案例 BSL432_AP_AUTO:
    BSL432_pi_initUARTdetect();
    BSL432_pi_initSPI ();
    BSL432_pi_initi2C();
    中断; 

    SPI 的 BSL 初始化将覆盖 EUSCIB0的控制寄存器。

    /**
    * SPI 的 PI 初始化例程。
    *
    *配置 SPI 模块以及发送和接收功能。
    *
    *\return None
    */
    void BSL432_pi_initSPI ()
    {
    const eUSCI_SPI_SlaveConfig BSL432_SPIConfig =
    {
    EUSCI_SPI_MSB_FIRST、
    EUSCI_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next、
    EUSCI_SPI_CLOCKPOLARITY_INACT_HIGH、
    EUSCI_SPI_4PIN_UCxSTE_ACTIVE_LOW
    };
    
    MAP_SPI_initSlave (BSL432_SPI_MODULE、&BSL432_SPIConfig);
    
    /*启用 SPI 模块*/
    MAP_SPI_enableModule (BSL432_SPI_MODULE);
    MAP_SPI_registerInterrupt (BSL432_SPI_MODULE、BSL432_PI_IRQ_SPIdetect);
    MAP_SPI_enableInterrupt (BSL432_SPI_MODULE、EUSCI_B_SPI_Receive_interrupt);
    } 

    现在、如果 SPI 总线上有任何活动、这意味着 BSL 将报告 IRQ_Receiving。

    /**
    *用于检测 SPI 活动的 SPI 中断例程。
    *在接收到第一个字节后、常规 RX/TX SPI IRQ 例程被注册。
    *
    *\Return None
    */
    void BSL432_PI_IRQ_SPIdetect (void)
    {
    //不需要读取或复位中断状态标志。 读取 RX 缓冲器会清除该标志。
    
    MAP_SPI_registerInterrupt (BSL432_SPI_MODULE、BSL432_PI_IRQ_SPI_RX);
    BSL432_RAM_RX_Buf[BSL432_MAX_BUFFER_SIZE + 5]= BSL432_AP_SPI;//表明 SPI 现已激活
    
    uint8_t receivedData = map_spi_receiveData (BSL432_spi_module);
    
    if (receivedData!= 0xFF)// 0xFF 被忽略。 只需移出数据
    {
    BSL432_RAM_RX_BUF[0]=接收数据;
    BSL432_PI_IRQ_RxDataCnt = 1;
    BSL432_IRQ_state = IRQ_Receiving;
    }
    } 

    如果有 SPI 活动、那么在自动模式下、BSL 将把这个活动解释为一个潜在的 BSL 并阻止 UART BSL 工作是有道理的。

    Chris

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

    尊敬的 Chris:

    我已经使用 launchpad 进行了测试、没有外部组件。

    这是我的 SPI 配置

    /* SPI 主配置参数*/
    const eUSCI_SPI_MasterConfig spiMasterConfig =

       EUSCI_B_SPI_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
       3000000、// SMCLK = DCO = 3MHz
       50000、// SPICLK = 500khzI
       EUSCI_B_SPI_MSB_FIRST、// MSB 优先
       EUSCI_B_SPI_PHASE_DATA_Changed_ONFIRST_Captured_On_Next、//相位
       //EUSCI_SPI_PHASE_DATA_COLOCGE_ONFIRST_CHANGE_ON_NEXT、//CPHA=1
       //GGF。 相位 tauschen für AD7719 EUSCI_SPI_PHASE_DATA_Captured_ONFIRST_changed_on_next
       EUSCI_B_SPI_CLOCKPOLARITY_INACTION_HIGH、//高极性 CPOL=1
       //EUSCI_B_SPI_CLOCKPOLARITY_INACTION_LOW、//高极性 CPOL=1
       //EUSCI_B_SPI_3引脚// 3线 SPI 模式
       EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW|EUSCI_B_SPI_ENABLE_SIGNAL for _4WIRE_SLAVE //4Wire SPI 模式
    };

    void SPI_init (void)

       /*在 SPI 模式下选择 P1.5 P1.6和 P1.7 */
       MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);
       MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN5、GPIO_PRIMARY_MODULE_Function);
       MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function);
       MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);
       
       /*在3线主控模式下配置 SPI */
       MAP_SPI_initMaster (EUSCI_B0_BASE、&spiMasterConfig);
       
       /*启用 SPI 模块*/
       MAP_SPI_enableModule (EUSCI_B0_BASE);
       
       /*启用中断*/
       MAP_SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Receive_interrupt);
       MAP_SPI_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_SPI_Transmit 中断);

       外部芯片组设置为高电平的//复位
       MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P5、GPIO_PIN0);


    在我的 PCB 上有一个芯片(模拟器件 AD7719)

    此致、
    Thomas

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

    经过数小时的测试和轮胎后、我发现了另外两个要点、或许是解决方案。

    我在应用程序中使用 Timer32。 在您的示例中激活计时器后、它不再工作。 在停止计时器时、它会再次工作。 因此、通过 UART 发出的命令开始工作。

    但是刷写再次失败。

    在我使用的 cmd 脚本中、我首先发送命令、然后在超时2秒后启动 BSL_Scripter。 我得到错误的标头的错误。 以下代码现在重复工作:

    REM @回波关闭

    模式 COM2波特率=9600奇偶校验= n 数据= 8

    回显 b >\.\COM2 2>&1

    模式 COM2波特率=9600奇偶校验= e 数据= 8

    REM 等待2秒

    Ping localhost -n 2 > nul 2>&1

    C:\ti_BSL\BSL-Scripter.exe -d -g -n P4xx -i [COM2、UART、9600、奇偶校验]-b -z [复位]

    Ping localhost -n 2 > nul 2>&1

    C:\ti_BSL\BSL-Scripter.exe -d -n P4xx -i [COM2、UART、9600、奇偶校验]-j fast -b -w Datenlogger.txt -v -z [复位]

    暂停

    BSL_scripter 似乎不会更改奇偶校验。

    不管怎样、现在它对我来说是有效的。

    解决方案的简短形式:

    -禁用代码优化以防止 TI-TXT-FILE 中出现地址错误

    -停止定时器32

    -在将 SPI 用于其他用途时禁用 UART 的自动模式

    -它也适用于版本3.3.0中的 Scripter

    此致、

    Thomas

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

    感谢您的确认。 我仍然建议使用 BSL Scripter 3.4.0、因为它更强大、我们实施了一些错误修复。