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.
工具/软件:Code Composer Studio
您好、我对以下导入代码有问题。
C:\ti\c2000Ware_3_03_00_00\device_support\f2806x\examples\c28\f28069_CAN_flash_kernel
我正在使用
Code Composer Studio
版本:8.2.0.00007
用于闪存的闪存 API 函数为我提供状态代码12
shared_boot.c 行:208
状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、 (uint16 *) progBuf、BlockHeader.blocksize、&FlashStatus);
我要做的是运行调试器、然后发送流。 我可以看到等待字节到达 CAN 的代码、然后我在其中一个状态值上触发了断点。
我已在文档中跟踪状态代码的含义。 此处:
文件://C:/ti/c2000/C2000Ware_3_03_00_00/libraries/flash_api/f2806x/docs/Flash2806x_API_Quickstart.pdf
这可能意味着示例代码存在内存分配问题。 我可能错了、这可能是一个红色的鲱鱼。
我之前对示例代码有一些问题
HTT ps://e2e.ti.com/support/tools/ccs/f/81/p/953837/3525807#3525807
其中导入工程时出现错误、我还发布了一些段警告。 这可能是一种红色的鲱鱼。
而闪存功能在调试器中或通过 CAN 流不起作用。
我能够通过注释掉闪存程序块部分、使擦除功能在调试器中或通过 CAN 流工作。 我还修改了函数的参数以进行其他扇区擦除。
状态= Flash_Erase (((sectora | sectorb | SECTORC | SECORD|SECTORE|SECTORF|SECTORH)、 FlashStatus (FlashStatus);
我已通过内存浏览器0x3D8000确认擦除。
Jakub、
您能否检查映射文件中是否有任何段映射到 ROM 或 OTP 或超出有效存储器范围?
谢谢、此致、
Vamsi
您好、感谢您的回复
从中删除
和
我的映射文件在这里
也许是这样吗? 如果可以、请仔细检查。
RAMM0从0x50开始、而不是0x40。
RAMM0 00000050 000003b0 000000ee 000002c2 RWIX
复位 0 003fffc0 00000002 DSECT 003fffc0 00000002 rts2800_fpu32.lib:boot28.obj (.reset)
可能是那些(长射)?:
这些内容是否已更新? 版本错误? 这个问题是否与这些问题有关?
ABS 003ffebb _Flash2806x_Program abs 003ffebd _Flash2806x_Erase
您好、Jakub、
您收到的状态代码12为"Status_FAIL_ADDR_INVAL"。 这应该意味着传递给下面函数的 FlashAddr 参数不正确、或者长度超出了闪存/ OTP。
外部 UINT16 Flash_Program (UINT16 * FlashAddr、UINT16 * BufAddr、UINT32长度、 Flash_ST * FProgStatus);
BlockHeader.DestAddr
闪存中的位置是否始终是一个位置? 它似乎在示例代码中递增。 还应检查传递给函数的长度、以确保其保持在闪存中
最棒的
Kevin
感谢 Kevin
也许我之前告诉过的信息是一个错误。
我卡住了。 我无法再复制代码12。 甚至尝试复制我的步骤并再次导入项目。
我还注意到、除非我按下 PAUSE、否则去抖器不会指向 CAN while 循环、以获取流。 我认为我以前不必这么做。 一个示例。
调试和步进以及查看反汇编时的示例。 程序似乎完全无法到达闪存函数、并被卡在某个位置
因此、在该代码中、程序会擦除闪存、然后尝试获取第一个块的字大小。 由于 BlockHeader.blocksize 为0、看起来是错误的。
而 Look 不会作为结果执行。
然后、它尝试将入口地址加载到闪存中。 这意味着、如果成功或者没有从新的或者旧的闪存中运行? 它通过一些推送弹出堆栈来配置寄存器以实现正确操作。 一些 Itrap 寄存器仍然不知道这意味着什么。 然后卡在这里的环路中。
这是一个示例代码、我不应该对此有任何问题。
到某一时刻、所有的都可以读取存储器中的存储值。 例如、最终地址获得存储在中的值
还不错
// //获取第一个块的大小(以字为单位) // BlockHeader.blocksize =(*GetWordData)();
(我可以看到的)调用此函数时、它不会跳转到函数。 如果调试器作为函数的指针写入、是否能够跟上? 在这里、很显然、需要从2个字节的 CAN 获取返回值、但它会卡住。 如果不暂停调试器、我就无法再执行其他操作。 如果我暂停、我会收到存储器之外的消息。
有问题吗?
声明语法错误吗?
指针地址是否以某种方式损坏?
是否有其他方法可以调用可能起作用的函数?
这是可调试的问题、还是无法使用调试器进行调试?
另一个问题。 IM 使用了微处理器的-M 变体、它有一些细微的不同。 这是罪魁祸首吗?
您好、Jakub、
很高兴听到您的意见。 我认为根据您发现的内容可能会有错误。
我认为应该对 CAN_Boot.c 文件进行以下更改,以便(* GetWordData)();行正常工作。
// //将 GetWordData 分配给// 函数的 CAN-A 版本。 GetWordData 是函数的指针。 // GetWordData =&CAN_GetWordData;
我将记下这一点、以便进一步了解。
最棒的
Kevin
感谢 Kevin、
很抱歉让您感到困惑、但我的代码也不会更改。
我删除了您所提到的部件、以避免让其他人感到困惑。
您好、Jakub、
好的、没问题。 更深入地研究它、似乎两种方法都可以在 C 语言中使用。
最棒的
Kevin