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.

[参考译文] LAUNCHXL-F28379D:SCI 引导模式、通过 sci 升级固件

Guru**** 2587345 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/647244/launchxl-f28379d-sci-boot-mode-fw-upgrade-via-sci

器件型号:LAUNCHXL-F28379D
Thread 中讨论的其他器件: controlSUITE

你好

LAUNCHXL-F28379D 的默认引导模式引脚为 GPIO84和 GPIO72、因为 SCI 引导 GPIO84必须为高电平。 但是、SCI 引导也使用 GPIO84和 GPIO85、因此我如何进行 SCI 闪存编程? 我需要分步说明。 此外 、LAUNCHXL-F28379D 的 USART 引脚连接到 GPIO42和43、该引脚与 sci boot、isn'it?

此致...

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

    F28379D、引导 ROM 中只有2个默认 SCI 引导模式选项。 如果您想要使用不同的 SCI/引脚多路复用器选项、则必须编写自己的 SCI 引导加载程序。

    SCIA 引导选项1使用 SCITXDA = 84且 SCIRXDA = 85 (GPIO72=0;GPIO84=1)

    SCIA 引导选项2使用 SCITXDA = 29且 SCIRXDA = 28 (GPIO72=1;GPIO84=1;OTP_KEY = 0x5A;OTP_BMODE = 0x81)

    请参阅以下 controlSUITE 示例、开始使用您的定制 SCI 固件升级示例代码。

    \device_support\F2837xD\V210\F2837xD_examples_Dual\F2837xD_sci_flash_kernels

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

    尊敬的 Manoj

    谢谢您的回答、很抱歉我没有在上一篇文章中充分表达我们的问题。

    现在、我们正在使用 F2837xD 进行新设计、我们的头有点困惑。 我们的要求如下:


    1) 1)软件需要通过串行端口进行更新。
    2)软件必须受代码保护(必须配置 DCSM、但我们不知道哪些配置符合我们的要求)。 在这种情况下(代码受保护)、串行端口软件更新是否受影响?

    我们还想了解其他内容、通过串行端口进行更新时是否需要通过卡更改芯片的引导模式? 产品将在封闭的包装盒中、并且会出现问题。 是否无法从软件中将芯片设置为 sci 引导模式?

    我们需要就我们应该为这些行动做些什么发表明确的声明(逐步行动)。

    此致

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

    前一条消息中提到的示例代码是一个良好的起点。 此示例代码可帮助您接收来自主机的命令以解锁器件、擦除闪存、更新软件、复位、运行、还能够向主机发送状态详细信息以告知器件状态。 此代码现在已配置为从 RAM 运行。 您需要将其更改为从闪存运行。

    默认情况下、您需要引导至闪存以开始从闪存运行此代码。 如果 SCI 从主机接收到继续运行应用程序代码的命令、只需跳转至您的应用程序代码并运行代码。 但是、如果 SCI 接收到更新软件的命令、您可以解锁器件、擦除具有应用程序代码的扇区、通过 SCI 端口接收新的应用程序代码、并使用新代码对应用程序扇区进行编程。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Manoj
    执行引导加载程序的最佳方法是什么? 我应该为引导加载程序和应用程序创建单独的项目、还是在同一个项目中同时创建这两个项目?
    如果你一步一步告诉我、我很高兴。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我建议您具有单独的引导加载程序项目和应用程序项目。

    对于引导加载程序工程、只需将工程转换为从闪存而不是 RAM 运行即可

    对于应用程序工程、必须将应用程序映射到引导加载程序扇区以外的闪存扇区中。 如果引导加载程序工程不想更新应用程序代码、以便它可以跳转到应用程序代码、则需要知道应用程序代码的起始地址。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Manoj
    感谢您的回答、我将尝试将引导加载程序实现为单独的项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请通过标记已回答您问题的帖子来关闭 By Thread。 这对于其他人浏览您的帖子很有用。

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

    尊敬的 Manoj

    我为引导加载程序和应用程序代码制作了单独的项目;

    对于 CPU1、引导加载程序使用的闪存和闪存 b 以及闪存的其余部分用于应用。 我修改了链接器 cmd 文件和调试选项。

    每次系统复位、0x80000处的引导加载程序都会首先运行检查 SCIA 自动波特率锁定状态、如果我设置运行内核、否则运行应用程序、

    自动波特率。 当它获得"A"或"A"时、回显字符并跳转到引导加载程序、因此设置了引导加载程序代码检测异常位、然后运行引导加载程序。 我通过这种方法成功地对 CPU1进行了编程。 我也进行了相同的调制、例如跳过内核加载、TI serial_flash_loader c++项目。

    从同一意义上讲、我为 CPU2、引导加载程序和应用程序代码制作了两个项目。 基于 TI 示例的引导演示。 在他的时候,我的头有点困惑。 我没有获得 CPU2引导加载程序工作、我正在共享所有项目的初始化代码、请帮助我成功完成 CPU2的 DFU。

    CPU1引导加载程序
    
    uint32_t main (void)
    {
    IF (SciaRegs.SCIFFCT.bit.Abd)
    {
    //
    // SCIA 刷新
    //
    
    while (!SciaRegs.SCICTL2.bit.TXEMPTY)
    {
    }
    
    //
    //步骤1. 初始化系统控制:
    //启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    //
    InitSysCtrl();//PLL 激活
    
    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    InitGpio();
    
    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    // InitPieCtrl();
    
    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    // InitPieVectTable();
    InitIpc();
    InitFlash();
    
    EALLOW;
    GpioCtrlRegs.GPBPUD.bit.GPIO42 = 0;
    GpioCtrlRegs.GPBPUD.bit.GPIO43 = 0;
    
    GpioCtrlRegs.GPBQSEL1.bit.GPIO43 = 3;
    
    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
    GpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 3;
    
    GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;
    GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 3;
    EDIS;
    
    //SciaRegs.SCIFFCT.bit.ABDCLR = 1;
    
    //
    //增益泵信标
    //
    SeizeFlashPump();
    init_Flash_sectors ();
    
    uint32 EntryAddr;
    
    //
    // GPIO84、85的 SCI_BOOT 参数;SCI_BOOT_ALTERATE 参数
    //对于 GPIO28、29
    //
    EntryAddr = SCI_GetFunction (SCI_BOOT);
    
    }
    /* return (EntryAddr);*/
    
    void (* funcPtr)(void)=(void (*)(void)) 0x084000;
    (*funcPtr )();
    
    return (0);
    }
    
    CPU1应用程序代码
    void sysinit (void)
    {
    //
    ///步骤1。 初始化系统控制:
    // PLL、看门狗、启用外设时钟
    //此示例函数位于 F2837xD_sysctrl.c 文件中。
    //
    InitSysCtrl();
    
    InitGpio();
    
    #ifdef _standalone
    #ifdef _flash
    //
    //发送引导命令以允许 CPU2应用程序开始执行
    //
    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
    其他
    //
    //发送引导命令以允许 CPU2应用程序开始执行
    //
    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _RAM);
    #endif
    #endif
    
    
    //
    //步骤2。 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    //
    
    EALLOW;
    //LED1
    GpioCtrlRegs.GPAPUD.bit.GPIO31 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;
    
    //LED2 CPU2对其进行控制
    GPIO_SetupPinOptions (34、GPIO_OUTPUT、GPIO_PushPull);
    GPIO_SetupPinMux (34、GPIO_MUX_CPU2、0);
    
    /*
    GpioCtrlRegs.GPBPUD.bit.GPIO34 = 1;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
    *
    
    EDIS;
    
    ////
    步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();
    
    //
    禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //初始化 PIE 矢量表,其中包含指向 shell 中断
    //服务例程(service routines,ISR)的指针。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();
    
    
    EALLOW;
    
    PieVectTable.ADCA1_INT =&adca1_ISR;
    //PieVectTable.EPWM1_INT =&epwm1_ISR;
    EDIS;
    
    InitEpwmModules();
    DisablePwmSignals();
    
    SetupAdcModules ();
    SetupAdcChannels();
    EnableEpwm1SockA();
    
    SciaInit();
    InitEcap3();
    
    InitPositionSensor();
    
    IER |= M_INT1;
    
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// adca1
    
    //
    //启用全局中断和更高优先级的实时调试事件:
    //
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    
    }
    
    
    CPU2引导加载
    程序 uint32_t main (void)
    {
    IF (SciaRegs.SCIFFCT.bit.Abd)
    {
    //
    //SCIA 嵌入
    //
    while (!SciaRegs.SCICTL2.bit.TXEMPTY)
    {
    }
    
    //
    //步骤1. 初始化系统控制:
    //启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    // InitSysCtrl();// PLL 将被 CPU1锁定,也将被锁定
    //发条剩余的时间
    
    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    //InitGpio();
    
    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    // InitPieCtrl();
    
    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    // InitPieVectTable();
    
    //
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM 中
    //
    
    InitFlash();
    
    
    uint16 x = 0;
    对于(x = 0;x < 32676;x++){}
    对于(x = 0;x < 32676;x++){}
    
    IpcRegs.IPCBOOTSTS = C2_BootROM_BOOTSTS_SYSTEM_READY;
    while (IpcRegs.IPCBOOTMODE!= C1C2_Brom_BOOTMODE_BOOT_BOOT_FROM _FLASH){}
    
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断
    
    //
    //增益泵信标
    //
    SeizeFlashPump();
    init_Flash_sectors ();
    //Put GetFunction 此处
    uint32_t EntryAddr = SCI_GetFunction ();
    
    //
    //保持对闪存泵的控制
    //
    SignalCPU1();
    //返回 EntryAddr;//加载应用程序 intob 的条目地址
    //RPC:返回程序计数器*/
    }
    
    void (* funcPtr)(void)=(void (*)(void)) 0x084000;
    (*funcPtr )();
    
    返回(0);
    }
    
    CPU2应用程序代码
    void sysinit (void)
    {
    //
    //步骤1。 初始化系统控制:
    // PLL、看门狗、启用外设时钟
    //此示例函数位于 F2837xD_sysctrl.c 文件中。
    //
    InitSysCtrl();
    
    
    //
    //步骤2。 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    //
    
    
    ////
    步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();
    
    //
    禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //初始化 PIE 矢量表,其中包含指向 shell 中断
    //服务例程(service routines,ISR)的指针。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();
    
    
    
    //
    启用全局中断和更高优先级的实时调试事件:
    //
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    
    } 

    此致。

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

    在 CPU2BOOTLOADER 代码中、不应等待 CPU1发出 I2C 命令以进行 SCI 引导。 您似乎正在等待闪存启动。

    此外、您应该在 CPU1代码中配置 SCI 引脚。 您的引导加载程序代码和应用程序代码都运行 InitSysCtrl。 这不是必需的。 只需在引导加载程序代码中运行 InitSysCtrl 即可。

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

    我不想使用 sci boot、CPU1和 CPU2从闪存引导。 这两个引脚都在0x80000处的引导加载程序代码中运行第一个引导加载程序代码、如果检测到了 Abd 位、则运行引导加载程序、否则跳转应用程序代码。
    当我尝试在 CPU2工作时重新编程 CPU1时、它无法编程加载、如果 CPU2停止、则成功。 因此、某些情况下对 CPU2编程有效。 那么、如何在配置 CPU2的同时停止 CPU1呢?

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