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.
您好!
我使用的是 AM2631器件、需要帮助来回答几个问题。
1) 1)我想知道如何配置启动和链接器脚本、以便能够防止在软复位后擦除某些存储器区域。
2) 2)如何在写入访问操作时配置存储器访问断点。
3)如何 将缓存重新刷新到内存中
此致、
阿尔特姆
尊敬的 Arterm:
1.您可以在链接器脚本中创建专用段并将 NOINIT 类型分配给此输出段:例如:
.section_noinit: > OCRAM、type=NOINIT
NOINIT 段不会由链接器在 C 自动初始化过程中进行初始化。 您需要自行根据需要对此段进行初始化。
2.你试过观察点吗? 可以针对特定的存储器读取/写入触发一个观察点。
CCS-->运行-->新建断点-->硬件观察点
3.您可以调用缓存 API 来查看缓存失效情况:
CacheP_wbInv (addr、size、CacheP_TYPE_ALL);
请参阅 SDK API 参考:
感谢您的回答。
请说明是否可以在不切换到 UART 引导模式的情况下使用 XDS110和 QSPI 引导来重新闪存外部存储器?
尊敬的 Artem:
您可以使用 UART、CAN 或 JTAG 将文件从主机 PC 传输到 EVM 上的闪存。 如果您要使用 UART 协议、则必须将 MCU 切换到 UART 引导模式。
谢谢你。
我使用了 JTAG uniflash SBL 来刷写程序-它工作正常。
我遇到的另一个问题是、在从 CSS 运行系统复位或内核复位或通过代码运行 SOC 热复位 API 后、应用不会引导、并且 PC 在0x3000等低地址区域主动运行、 只有在下电上电后、我才能到达应用。
导致此问题的原因是什么以及如何解决?
尊敬的 Artem:
我想这是在预料之中。 启动模式通过在上电期间读取自举引脚(SOP[3:0])来确定。
你好。 外部下拉 SOP 引脚。 我希望它应该作为 QSPI 引导模式工作。 软件复位有什么问题?
我附上了演示项目、您可以尝试使用该项目来重现问题。
步骤:
实际结果:
RESET_ADDRESS 变量在软件复位后复位为0
预期结果:
RESET_ADDRESS 变量在每个复位周期中增加。
尊敬的 Artem:
我将用您的 LED 闪烁代码来做一个测试。
我希望该接口可用作 QSPI 引导模式。 软件重置有什么问题?
只要内核复位、ARM Cortex-R5F 处理器内核就会从复位向量地址0x00000000处开始执行。 循环通电后、位于0x00000000处的异常矢量更新为应用程序映像的复位矢量、如果异常矢量的内容未损坏(噪声、辐射等)、则 CPU 复位、SW 复位应开始代码执行。
我修改了 RTI LED 闪烁示例、并将该示例编程为通过 QSPI SBL 作为应用映像进行闪存。
应用映像可通过上电复位、SW 复位和 nRESET 启动。
若要启用 NRESET 引脚来控制热复位、 必须清除 WARM_RESET_CONFIG 寄存器的位字段[2:0]:
SoC_configureWarmResetSource (0x77777770);//QJ 添加了
下面是我的示例:
关于所附的图片、您是否能够在每个复位周期增加 RESET_ADDRESS 变量? 请按照以下步骤重现并参考本主题的主要问题
您是否能够在每个复位周期增加 reset_address 变量?
RESET_ADDRESS 不增加。 这是另一个问题。
我的测试显示应用程序映像可以通过 PORRST、nRESET 和 SW 复位开始执行。
ROM 代码仅在初始上电(POR)或上电复位时执行。 后续(热)复位时、复位向量 基址将指向运行时加载的代码(SBL)。
示例 OSPI SBL 初始化 TCMA/B 和 L2OSRAM 存储体2和存储体3。
我的测试显示热复位本身会清除 SRAM 的内容。
尊敬的 Artem:
第一个1MB OCSRAM (bank0和 bank1)由 ROM 代码初始化。 第2个1MB 区域(bank2和 bank3)由 OSPI SBL 初始化。 我将检查我们是否可以使用未使用的外设 RAM (例如 MCAN RAM)来保留热复位期间初始化的变量。
与 TMS570器件不同、AM263x 外设 RAM 也会在软件热复位后进行初始化。
尊敬的 Artem:
我的建议是将"reset_address"写入闪存、而不是 SRAM。
或
您可以修改 SBL 以仅初始化一个 OCSRAM 组(例如组2或组3)、然后将"set_address"存储到 OCSRAM 的未初始化组中。
从功能安全角度而言、我倾向于将变量存储到闪存中、以避免因器件复位而进行清理。
您好!
由于设计限制、我们无法在闪存中存储任何内容。 由于复位地址是从异常环境中捕获的、比如 Hard_FAULT 处理程序、因此将其存储在 RAM 或任何在复位时不被清除的系统寄存器中的唯一方法。
有几个问题需要您澄清:
是否无法 在 SBL 中初始化 OCSRAM 区域、或为什么需要将其初始化?
为什么在软件复位后清除断点?
我们是否应该通过应用复位处理程序覆盖矢量表、以防止在复位时执行 SBL?
是否可能无法 在 SBL 中初始化 OCSRAM 区域,或为什么需要将其初始化?
SBL 初始化 TCMA、TCMB、以及 OCSRAM 的组2和组3。 无法初始化 OCSRAM 的存储体(2或3)或存储体(2和3)(在热复位后)。
硬件初始化的目的是根据它们的错误检测方案–ECC、将具有错误检测能力的存储器阵列设定为一个已知状态。 例如、上电复位后 OCSRAM 的内容未知。 可启动硬件自动初始化、这样就不会出现 ECC 错误。
为什么断点在软件重置后被清除?
如 TRM 中所述、所有 IO 配置都会在热复位置位期间复位、并且在复位取消置位后、器件将启动、应用程序将重新加载到 OCSRAM、并且不应保留断点。
我们是否应该通过应用程序复位处理程序覆盖向量表,以防止在复位时执行 SBL?
在引导期间、应用程序映像的异常向量或复位向量由 SBL 复制到0x00000000。