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.

[参考译文] TM4C1231H6PZ:内部闪存擦除

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/946252/tm4c1231h6pz-internal-flash-erase

器件型号:TM4C1231H6PZ
主题中讨论的其他器件:UNIFLASH

大家好、团队、

您是否能够帮助我解决有关对 TM4C1231H6PZI 进行重新编程的客户问题?

客户计划使用内部振荡器、而无需连接到外部振荡器引脚。 但是、在首次编程时、他们使用了 TI LaunchPad 中的引导加载程序示例代码、该代码将 MCU 配置为使用客户电路板上不存在的外部晶体。 现在、每次芯片通电时、引导加载程序都会启动并配置无效的时钟源、这会导致不起作用。

在这种情况下、客户是否可以擦除内部闪存或重新编程引导加载程序?

此致、

Jacob Butler

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

    您好、Jacob、

     如果定义了 crystal_FREQ,引导加载程序将调用 ConfigureDevice()函数,以使用主振荡器配置时钟。 在 bl_config.h 文件中定义了 crystal_FREQ。 您需要注释#define crystal_FREQ,以便 ConfigureDevice()不会使用主振荡器配置系统时钟。  

    //
    //
    //用于为微控制器计时的晶体的频率。
    //
    //这定义了运行的微控制器所使用的晶振频率
    //引导加载程序。 如果在生产时这是未知的、则使用
    // UART_autobaud 功能以正确配置 UART。
    //
    //取决于:无
    //不包括:无
    //要求:无
    //
    //
    #define CRYSTICL_FREQ 16000000

    void
    ConfigureDevice (void)
    {
    #ifdef UART_ENABLE_UPDATE
    uint32_t ui32ProcRatio;
    #endif
    
    #ifdef crystal_FREQ
    //
    //由于指定了晶振频率,因此启用主振荡器
    //并从它为处理器计时。
    //
    #if defined (target_IS_TM4C129_RA0)|| \
    已定义(TARGET_IS_TM4C129_RA1)|| \
    已定义(TARGET_IS_TM4C129_RA2)
    //
    //由于指定了晶振频率,因此启用主振荡器
    //并从它为处理器计时。 检查振荡器范围
    //必须设置,等待状态需要更新
    //
    if (crystal_FREQ >= 10000000)
    {
    HWREG (SYSCTL_MOSCCTL)|=(SYSCTL_MOSCCTL_OSCRNG);
    HWREG (SYSCTL_MOSCCTL)&=~(SYSCTL_MOSCCTL_PWRDN |
    SYSCTL_MOSCCTL_NOXTAL);
    }
    其他
    {
    HWREG (SYSCTL_MOSCCTL)&=~(SYSCTL_MOSCCTL_PWRDN |
    SYSCTL_MOSCCTL_NOXTAL);
    }
    
    //
    //等待振荡器稳定
    //
    延迟(524288);
    
    if (crystal_FREQ > 16000000)
    {
    HWREG (SYSCTL_MEMTIME0)=(SYSCTL_MEMTIME0_FBCHT_1_5 |
    (1 << SYSCTL_MEMTIME0_FWS_S)|
    SYSCTL_MEMTIME0_EBCHT_1_5 |
    (1 << SYSCTL_MEMTIME0_EWS_S)|
    SYSCTL_MEMTIME0_MB1);
    HWREG (SYSCTL_RSCLKCFG)=(SYSCTL_RSCLKCFG_MEMTIMEU |
    SYSCTL_RSCLKCFG_OSCSRC_MOSC);
    }
    其他
    {
    HWREG (SYSCTL_RSCLKCFG)=(SYSCTL_RSCLKCFG_OSCSRC_MOSC);
    }
    其他
    HWREG (SYSCTL_RCC)&=~(SYSCTL_RCC_MOSCDIS);
    延迟(524288);
    HWREG (SYSCTL_RCC)=((HWREG (SYSCTL_RCC)&~(SYSCTL_RCC_OSCSRC_M)))|
    SYSCTL_RCC_OSCSRC_MAIN);
    #endif
    #endif 

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

    嘿、Charles、

    感谢您的回答。 我必须承认、我对引导加载程序不太熟悉。 对引导加载程序函数的这种更改是否允许客户重新配置他们正在使用的当前芯片(这将在使用有问题的配置启动器件之前激活)、或者此更改是否旨在正确配置新芯片上的引导加载程序?

    此致、

    Jacob Butler

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

    您好、Jacob、

     他们将需要在更改后将 Booloader 重新编程到当前芯片和新芯片、以便能够与内部振荡器配合使用。 默认情况下、器件将使用内部振荡器启动。 但是,通过调用 ConfigureDevice()函数,引导加载程序的当前写入方式将更改为主振荡器。 如果希望引导加载程序继续使用内部振荡 器,则需要取消定义 crystal_FREQ,以便将 ConfigureDevice()绕过。  

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

    您好、Charles、

    感谢您的解释。 客户现在可以让引导加载程序在新芯片上正常工作。

    如果能够恢复配置不正确的芯片、问题仍然存在。 您在之前的响应中提到、他们需要将引导加载程序重新编程到其当前芯片中、但如果由于没有时钟而无法与芯片通信、他们如何重新编程引导加载程序? 这就是客户询问擦除内部闪存的原因。 他们的问题是:

    1.当芯片没有时钟时、TI 是否有擦除内部闪存的程序来将器件恢复为出厂设置?

    如果没有这一点、我可以想到的唯一解决方案是连接外部振荡器以允许 MCU 启动、然后重新编程引导加载程序以不需要外部振荡器。 不理想、但您认为这会起作用吗?

    此致、

    Jacob Butler

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

    您好、Jacob、

     对于当前芯片、它们将需要使用 JTAG 接口擦除闪存。 我希望他们的电路板上有 JTAG 连接器、以便他们可以使用 Uniflash 或 CCS 擦除闪存。