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.

[参考译文] 编译器/TMS320F28075:定制闪存编程问题

Guru**** 2599385 points
Other Parts Discussed in Thread: TMS320F28075

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675974/compiler-tms320f28075-custom-flash-programming-issues

器件型号:TMS320F28075

工具/软件:TI C/C++编译器

更新了:我似乎通过在闪存编程例程中启用自动 ECC 来解决了这个问题。 错误的 ECC 值会导致异常行为。 我已经浏览过闪存 API 文档、但没有找到 ECC 错误时所发生的情况的说明。

我正在为 TMS320F28075开发一个框架、允许通过 RS-485连接对其进行重新编程。 我在 CCS 中创建了两个配置了.cmd 文件的项目、这样它们的闪存程序存储器不会重叠。 第一个项目是简单切换 LED 的通用代码(但理论上可以有适合其程序空间的任何代码); 它占用闪存扇区 C 至 J。第二个项目包含的例程允许它从串行端口上的命令中擦除、闪存和验证第一个项目中的扇区; 它占用闪存扇区 A 和 B。在第二个项目中、我修改了 F2807x_CodeStartBranch.asm 以跳转到我编写的.asm 文件(而不是跳转到_c_int00)。 此.asm 代码检查闪存扇区 M 中的第一个存储器位置(在两个项目中均配置为数据段)是否已设置、并且跳转到闪存扇区 A 的开头(引导至第二个项目)或扇区 C (第一个项目的开头)。 这样、我就可以让处理器引导至任一项目、具体取决于闪存扇区 M 是否被擦除(很明显、两个项目都有代码允许我将数据刷写到或擦除扇区 M; 在下电上电后、处理器将引导至相应的项目)。

我首先使用 CCS 将两个项目编程到 TMS320F28075来测试这个系统(我更改了闪存设置、这样属于其它项目的闪存扇区不会被擦除)。 当两个项目加载到同一个芯片上时、我随后使用 RS-485主机更改闪存扇区 M 中存储的值、允许处理器在项目之间切换(我通过在每个项目上编码不同的 LED 切换例程来验证这一点)。 到目前为止、我能够让两个项目共存并在它们之间切换。

下一步是擦除和重新编程与第二个项目中的第一个项目相对应的闪存扇区(而不是从 CCS 中执行此操作)。 我生成了一个 RS-485主机可以读取的.hex 文件、并使用该数据完成编程序列。 但是、当我切换到新闪存的程序扇区时、我的代码无法执行(即、所有 LED 都不闪烁)。 我的第一个想法是、某些程序数据的闪存一定是错误的。 我将 CCS 中的闪存设置从"擦除和编程"更改为"仅验证"、但验证成功完成(表示我的主机已正确刷写程序数据)。 此外、使用"仅验证"之后的调试允许我单步执行代码并使用内存浏览器。 我将闪存例程(不起作用)从存储器浏览器导出的数据与从 CCS 重新编程后的数据(起作用)进行了比较。 同样、我无法发现闪存扇区之间存在任何差异、但由于行为差异、显然必须有所不同。 在单步执行代码时(在我的实用程序中重新编程后使用"仅验证")、我确实注意到一些异常、例如 Clock_source switch 语句跳转到 INT_OSC2、即使 Debug 中的变量显示 clock_source 等于"XtAL_OSC"。 我检查了 MAP 中的.switch 段、发现该段未初始化、尽管在.cmd 文件中将其设置为 FLASHJ。