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.

[参考译文] TM4C123GE6PM:通过 FTDI-USB 访问 ROM 引导加载程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1516617/tm4c123ge6pm-access-rom-bootloader-via-ftdi-usb

器件型号:TM4C123GE6PM
Thread 中讨论的其他器件:TM4C123GH6PM

工具/软件:

我们从 LaunchPad 上移开了自己的板。 通过串行 UART0进行 FTDI-USB 编程、可以使用 LM Flash Programmer 进行电路板编程。

我使用示例中的代码使指示灯闪烁、如果点击 SW1开关、则会启动引导加载程序。 如果我意外上传了正确的代码来启用引导加载程序、是否可以启动引导加载程序?  

是否有空白芯片的默认配置来启用引导加载程序? 例如、默认情况下会设置 BOOTCFG、以便我可以将引脚拉高以使引导加载程序运行吗? 我只是想确保我不会砖化我们创建的第一个原型。

提前感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我使用示例中的代码闪烁一个灯、如果点击 SW1开关、它会启动引导加载程序。 如果我意外上传了正确的代码来启用引导加载程序、是否可以启动引导加载程序?  

    是否有空白芯片的默认配置来启用引导加载程序? 例如、默认情况下会设置 BOOTCFG、以便我可以将引脚拉高以使引导加载程序运行吗? 我只是想确保我不会砖化我们创建的第一个原型。

    您的理解是正确的。 您可以通过配置 BOOTCFG 寄存器来强制器件进入引导加载程序模式、并指定 GPIO 引脚作为输入、以强制器件进入引导加载程序模式。  

    此寄存器不是直接写入、而是使用 FMD 寄存器、如"非易失性"中所述
    寄存器编程--闪存存储器驻留寄存器"(第613页)。 寄存器设置为
    如果已提交、则只有在下电上电后才能读回新值。 该寄存器提供的信息
    配置 GPIO 引脚以启用 ROM 引导加载程序以及一次性写入机制
    禁用对器件的外部调试器访问。 重置时、用户可以引导
    内核通过使用任何 GPIO 信号来执行 ROM 引导加载程序或闪存中的应用程序
    根据该寄存器中的位的配置、从端口 A 到 H。 在复位时、以下序列为
    已执行:
    读取 BOOTCFG 寄存器。 如果 EN 位清零、则执行 ROM 引导加载程序。
    2.在 ROM 引导加载程序中,将指定 GPIO 引脚的状态与指定的引脚进行比较
    输入反极性。 如果状态与指定的极性匹配、则 ROM 将映射到地址0x0000.0000
    并在 ROM 引导加载程序之外继续执行。
    3.如果设置了 EN 位或者状态与指定的极性不匹配,则发送地址处的数据
    读取0x0000.0004、如果此地址处的数据为0xffffff.FFFF、则 ROM 将映射到
    地址0x0000.0000并在 ROM 引导加载程序之外继续执行。
    4.如果地址0x0000.0004处有不是0xffffff.FFFF 的数据、则会加载堆栈指针(SP)
    从地址0x0000.0000的闪存存储器开始、程序计数器(PC)被加载
    地址0x0000.0004。 用户应用程序开始执行。

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

    好的。 BOOTCFG 寄存器的默认值是什么? 如果我没有对芯片进行编程、默认的 GPIO 引脚和极性是什么?

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

    您好、

     原始器件上 BOOTCFG 寄存器的默认值为0xFFFFFFFE。 如果您查看位8 (EN)、这是1。 这意味着禁用 GPIO、可在复位时强制器件进入 ROM 引导加载程序。 您可以对 PORT、PIN 和 POL 字段进行编程、以指定 要进入 ROM 引导加载程序执行的 PORT 引脚和极性。 如果您只清除 EN 位、则默认情况下会识别端口 H7上的高电平以进入 ROM 引导加载程序。   

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

    如果我对未使用的芯片进行编程以指示闪烁 LED、并且它不包含任何修改 BOOTCFG 寄存器的代码、能否将 GPIO 引脚 H7接地(低电平)并在复位时进入引导加载程序?

    "在 ROM 引导加载程序中、将指定 GPIO 引脚的状态与指定的极性进行比较。"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="644673" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1516617/tm4c123ge6pm-access-rom-bootloader-via-ftdi-usb/5831828 #5831828"]

    如果我对未使用的芯片进行编程以指示闪烁 LED、并且它不包含任何修改 BOOTCFG 寄存器的代码、能否将 GPIO 引脚 H7接地(低电平)并在复位时进入引导加载程序?

    "在 ROM 引导加载程序中、将指定 GPIO 引脚的状态与指定的极性进行比较。"

    [/报价]

    否、您不能、因为未初始化设备上的 EN 位未清除。  

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

    谢谢查尔斯!
    您能给我一个使用修改后的 BOOTCFG 的闪烁灯程序示例吗?对于加载第一个程序或任何程序、推荐采用这种做法、以便始终可以通过将 GPIO 引脚设为高电平来调用 ROM 引导加载程序吗?

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

    1.从原始设备开始,或者您可以先擦除整个闪存。  

    2.您需要使用 FMA、FMD 和 FMC 对 BOOTCFG 寄存器进行编程。 请注意、这是一次性程序。 编程完成后、再次更改其值的唯一方法是执行"解锁"操作并将器件恢复到出厂设置。 以以下代码为例、使用高电平引脚 E6来执行 ROM 引导加载程序。

    // FMA should have this value to program BOOTCFG
    HWREG(0x400FD000) = 0x75100000;
    // Data to be flashed in BOOTCFG, must be stored in FMD
    HWREG(0x400FD004) = 0xFFFF9AFE; //FMD to enable Port E6 on HIGH for ROM bootloader execution
    // FMC should have writekey and commit bit
    HWREG(0x400FD008) = 0xA4420000 | 0x9; // FMC
    // Wait until commit is complete
    while (HWREG(0x400FD008) & 0x9);

    3. With the Pin E6 LOW, load your blinky code using LM Flash Programmer in UART mode. Note the flash at this moment is still empty. It does not matter if GPIO pin is asserted or not because the stack pointer and reset vector are all F's. 

    4. You should see the blinky program loaded

    5. With the Pin E6 still LOW, load another program like the hello.c using LM Flash Programmer in UART mode. It will not load because a valid program image is already in the flash and the Pin E6 is LOW. 

    7. Change the input E6 to HIGH. 

    8. Load the hello program and the bootloader is forced to load the hello program and overwrite the blinky on the flash memory.

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

    我看到您在示例中使用了引脚 E6、但我在数据表(tm4c123gh6pm.pdf)中没有看到 TM4C123G 的引脚 E6。

    是否可以使用 PD1或 PF4?

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

    您可以使用要使用的特定器件上可用的任何引脚。 只是我使用基于不同 TM4C123封装的 E6。  

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

    好的、我看到它在100引脚版本上可用。 这对我们非常有帮助。 我还有几个问题:

    问题1:

    您说:"编程完成后、再次更改其值的唯一方法是执行"解锁"操作并将器件恢复到出厂设置。"

    是否可以使用 UART 执行"解锁"操作?

    问题2:

    如果从 原始器件开始、我发送了一个包含代码片段的.bin 文件来更新 BOOTCFG 是否会 影响 堆栈指针和复位向量、它们是否仍会保留所有 F?

    // FMA should have this value to program BOOTCFG
    HWREG(0x400FD000) = 0x75100000;
    // Data to be flashed in BOOTCFG, must be stored in FMD
    HWREG(0x400FD004) = 0xFFFF9AFE; //FMD to enable Port E6 on HIGH for ROM bootloader execution
    // FMC should have writekey and commit bit
    HWREG(0x400FD008) = 0xA4420000 | 0x9; // FMC
    // Wait until commit is complete
    while (HWREG(0x400FD008) & 0x9);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="644673" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1516617/tm4c123ge6pm-access-rom-bootloader-via-ftdi-usb/5832212 #5832212"]

    问题1:

    您说:"编程完成后、再次更改其值的唯一方法是执行"解锁"操作并将器件恢复到出厂设置。"

    是否可以使用 UART 执行"解锁"操作?

    [/报价]

    不、不能。 您可以使用 LM FLASH 程序对器件进行"解锁"。  

    [引述 userid="644673" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1516617/tm4c123ge6pm-access-rom-bootloader-via-ftdi-usb/5832212 #5832212"]

    问题2:

    如果从 原始器件开始、我发送了一个包含代码片段的.bin 文件来更新 BOOTCFG 是否会 影响 堆栈指针和复位向量、它们是否仍会保留所有 F?

    [/报价]

    是的、闪存将使用您的代码片段进行编程、从而通过 JTAG 接口甚至 UART 接口对 BOOTCFG 进行编程。 但是、由于 BOOTCFG 寄存器已编程、您可以将引脚 PD1或 PF4置为有效、以强制执行引导加载程序、从而从 UART 下载新固件。 您也可以在通过 JTAG 对 BOOTCFG 进行编程后擦除闪存、以便 SP 和 RESET 在闪存的其余部分变为 F。  

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

    要使用 LM Flash 程序解锁、您必须有一个 JTAG 接口? 通过串行接口、这些选项将消失。

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

    无法使用 UART 解锁。 这必须通过 JTAG 完成。 这一点记录在 d/s 中  

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

    明白了、感谢您的澄清和快速响应。

    可以说、如果我运行适当的代码片段来设置 BOOTCFG 寄存器、那么我应该始终能够将引脚 PD1或 PF4置为有效以强制执行引导加载程序以从 UART 下载新固件、这是安全的吗?

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

    是的。  

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

    查尔斯

    因此、我希望在原始器件上运行的内容如下、我期望我将使用 GPIO 引脚 PD1并将其接地以启用引导加载程序。 它看起来如何?

    #include <stdint.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    
    #define FLASH_FMA  0x400FD000
    #define FLASH_FMD  0x400FD004
    #define FLASH_FMC  0x400FD008
    
    int main(void)
    {
        // 1. FMA should have this value to program BOOTCFG
        HWREG(FLASH_FMA) = 0x75100000;
    
        // Data to be flashed in BOOTCFG, must be stored in FMD
        // 2. BOOTCFG value: PD1 active LOW = 0xFFFF65FF
        HWREG(FLASH_FMD) = 0xFFFF65FF; //FMD to enable Port D1 on LOW for ROM bootloader execution
    
        // FMC should have writekey and commit bit
        HWREG(FLASH_FMC) = 0xA4420000 | 0x9;
    
        // Wait until commit is complete
        while (HWREG(FLASH_FMC) & 0x9);
    
    }

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

    您没有清除位8、该位是为 ROM 引导加载程序启用 GPIO。 应为0xFFFFFF64FE。  

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

    感谢您的提问。 这是我要做的事情。 它看起来如何?

    #include <stdint.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    
    #define FLASH_FMA  0x400FD000
    #define FLASH_FMD  0x400FD004
    #define FLASH_FMC  0x400FD008
    
    int main(void)
    {
        // 1. FMA should have this value to program BOOTCFG
        HWREG(FLASH_FMA) = 0x75100000;
    
        // Data to be flashed in BOOTCFG, must be stored in FMD
        // 2. BOOTCFG value: PD1 active LOW = 0xFFFF65FF
        HWREG(FLASH_FMD) = 0xFFFF64FE; //FMD to enable Port D1 on LOW for ROM bootloader execution
    
        // FMC should have writekey and commit bit
        HWREG(FLASH_FMC) = 0xA4420000 | 0x9;
    
        // Wait until commit is complete
        while (HWREG(FLASH_FMC) & 0x9);
    
    }

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

    是的、应该这样做。  

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

    让它正常工作! 感谢您的支持!