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.

[参考译文] UCD3138128:编程闪存擦除问题

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1495205/ucd3138128-program-flash-erase-issue

部件号:UCD3138128
Thread 中讨论的其他器件:UCD3138A

工具/软件:

再次大家好。

我刚刚回到这个问题。 我眼前的问题是,我似乎不能简单地擦除 pflash 存储器块。

我正在耗尽块0、并想擦除块2。  

当我执行 software_interrupt 来清除 prorgam 闪存块2时、似乎遇到存储器故障或导致复位的问题。

(这是函数中的第14种情况:software_interrupt() 。

程序 此时它尝试从 CLEAR_PROGRAM_FLASH_2的 RAM 副本运行。

我是否需要执行一些特殊操作来允许程序从 ram 运行?

以下是片段:(它在131行附近失败)

e2e.ti.com/.../New-Text-Document-_2800_2_2900_.txt

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

    我不确定应该向 DecRegs.MFBALRx.All 寄存器写入什么? 这就是问题所在吗? 在示例中并不明显、从文档中至少难以理解!

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

    供参考...

    我能够使擦除功能正常工作。  

    我必须在复制到 RAM 的函数中添加以下语句:

    #pragma CODE_STATE (CLEAR_PROGRAM_FLASH_2、32)//这将确保此代码在 ARM 模式下构建
    void CLEAR_PROGRAM_FLASH_2 (void)
    {...}

    我的问题是、我不明白这一说法究竟有什么作用。

    您能向我指出一个可以解释这一点的资源吗? ARM 模式是指相对地址模式吗?  

    感谢您对此问题的任何帮助。

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

    你好、蝙蝠侠、

    感谢您的更新。 您唯一添加的是红色代码行? 您在哪里找到了这行代码? 我将研究它的工作原理。

    此致、

    Jonathan Wong

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

    我猜测这会导致所包含函数在相对寻址模式下编译(因为处理器类型为"arm"、它们调用 ARM 模式的原因会产生误导)。  相对寻址编译允许将其复制到另一个位置(例如本例中的 RAM)并正确运行。 我在各种示例中发现了这行代码、但从未在任何地方解释过。

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

    你好、蝙蝠侠、

    感谢您的解释。 我将在一周结束时作出答复。

    此致、

    Jonathan Wong

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

    供参考、我在此处找到了定义(和其他 pragma 定义):ARM 优化 C/C++编译器 v20.2.0.LTS 用户指南(修订版 W)

    请参阅我的其他帖子、了解如何在应用程序之间切换以及如何正确计算校验和!! 感谢您在这些问题上的帮助。  

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

    你好、蝙蝠侠、

    我想跟进、以便为您和本论坛上的任何其他人澄清这个问题。

    UCD3138A ARM7内核具有两个指令集:ARM 模式(32位)和 Thumb 模式(16位)。 UCD31xx 技术参考手册第14.4.2节第476页 重点介绍了 Thumb 指令集的优势、包括更高的性能和代码密度。 因此、对于尽可能多的 UCD3138A 代码、Thumb 模式是优选模式。 例如 、在 UCD3138128双向直流/直流固件中、  main.c 在文件属性中设置为 Thumb Mode。  

    但是、某些代码必须配置为 ARM 模式、而不是 Thumb 模式。 第472页的表14-1显示了特权(ARM 模式)和非特权(Thumb 模式)代码之间的表。 例如、中断  必去之地 可配置为 ARM 模式而不是 Thumb 模式。 如果您检查  standard_interrupt.c 属性、然后可以看到文件已设置为 ARM 模式。

    代码行  

    #pragma CODE_STATE(clear_program_flash_2, 32) // this will ensure that this code builds in ARM mode
     确保以下代码将内置在 ARM 模式而不是 Thumb 模式。 由于采用了  CLEAR_PROGRAM_FLASH_2 () 功能来自 CLEAR_PROGRAM_FLASH_2.c 则文件可能在 Thumb 模式下错误地构建了函数。 因此、添加#pragma 指令可确保函数构建正确。  

    软件中断 全部位于单个处理程序(例如14种不同的情况)中、因此 UCD3138A 绝不会被锁定、以便同时执行两个不同的软件中断例程。 由于软件中断会处理敏感操作(例如访问数据闪存)、因此必须在软件中断内一次处理一个例程、并且必须在监控器模式下访问该例程。  

    有关用户模式与监控模式的更多信息、请参阅第14.3节和第16.1.10节。  

    此致、

    Jonathan Wong

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

    感谢您的详细说明、我希望这也能帮助其他人。