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.
您好!
为什么 FAPI 无法通过定义为(float32_t *)的指针将浮点整数值写入闪存缓冲器?
为什么 C2000 types.h 没有用于闪存组存储器写入的 float16_t? 由于 x49c 只能 写入16位闪存地址、它需要 float16_t 数据类型吗?
似乎 我们需要 FAPI 源代码来修复库、以便将浮点整数写入非 ECC pu16DataBuffer。 并且缺少源文件、请相信它是 Paragon.h、这样调试就可以进入源库(F021_API_F28004x_EABI)。 注意:我修改了 FAPI 程序、以允许 float32_t 指针指向输入缓冲器。 然而(24.0)并未被传输到 pu16DataBuffer 中、尽管它似乎通过(浮点*)执行一次、但从未使 FSM 能够写入闪存组。
/*编程命令*/
#if defined (_C28x)
extern Fapi_StatusType Fapi_issueProgrammingCommand (
uint32 * pu32StartAddress、
float32_t * pu16DataBuffer、
uint16 u16DataBufferSizeInWords、
uint16 * pu16EccBuffer,
uint16 u16EccBufferSizeInBytes、
Fapi_FlashProgrammingCommandsType oMode
);
>> FapiProgramDataError
>> Fapi_Error_2005 IncorrectDataBufferLength
编辑: 任何人都有相同的问题 FAPI 来声明 DCSM 信标清零 FSM 寄存器: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195860/launchxl-f280049c-all-flash-registers-are-0x0-after-_c_int00
您好、GI、
我们将在下周中旬回顾并返回给您。 谢谢你。
此致、
Vamsi
您好、Vamsi、
周日工作、展现了对 TI 的真正奉献。 下面的浮点整数结构布局可能会有所帮助。
您好、GI、
感谢您提供信息。
我们将在下周中旬回顾并返回给您。
此致、
Vamsi
您好、GI、
您是否无法在闪存 API 程序函数的参数中提供32位格式(如上所述)?
请注意:我不在办公室、下周中旬将回到办公室。 请期待我的回复延迟。
谢谢、此致、
Vamsi
您好、Vamsi、
是的、float32_t 是要编程到闪存扇区的第一个变量(24.0)的格式、似乎将 pu16DataBuffer 与0x00无效。 然而、转换缓冲器的整个范围是310长度、而不仅仅是1个 float32_t 变量。 在这方面、另一个线程中显示的 FAPI 缓冲区长度错误消息似乎没有意义。 虽然 C2000编译器 float 为双字32位宽、因此 pu16DataBuffer 不够宽、需要简单的 FAPI 程序重写来辅助双字。
编辑:COF float 是一个双字或32位、eabi double 是64位、因此 float 仍然是32位。
(2)建议将 COFF 的32位浮点值声明为 float、而不是 double。
您好、GI、
我是说:您是否无法将浮点转换为闪存 API 可以接受的格式? 无论它是浮点数据还是任何其他数据类型、如您所知、它最终将作为0或1驻留在存储器中。
谢谢、此致、
Vamsi
我们无法将32位字放入16位定义的缓冲区。 除非编译器将32位浮点值磁力拆分为两个16位字、否则这是不可能的。 然后缓冲区大小将加倍、并占用两倍的闪存空间。 不是一个好的解决方案、必须重写 FAPI 以处理32位字、这是完全没有办法解决数据缓冲区限制问题的。
编辑: 由于 TMS320C28x char 是16位(使其可单独寻址)、因此一个字节也是16位。 这会产生您可能无法预期的结果;例如、size of (int)== 1 (而不是2)。
您好、GI、
我不是说将32位放入16位。 任何数据类型都可以表示为1和0 (二进制)。 您可以在 uint16中提供它-这是所有用户所做的。
例如、如果您以32位表示浮点变量、则可以将这些32位数据拆分为两个16位、并将其提供给闪存 API。
请注意: 2月23日之前、我将不可用。 请届时回复,以进行进一步讨论。 谢谢你。
谢谢、此致、
Vamsi
这不是固件上传、也不是解决方案。 这些是32位浮点变量、必须存储为32位、因为将32位 DWORD 检索为2x16位字需要特殊的 asm 内在函数处理、这比我以前考虑过的问题要多。
如果* pu16DataBuffer 只是指向32位闪存数据字的指针、则它应该使用我最近添加的(float32 *)指针。 它可能是(sizeof)需要除以2、因为上面的编辑意味着 C2000编译器针对16位字返回1、对于 float32应返回2。 因此、我没有实际计算参数数量、而是依赖((sizeof) userParams)来确定 FAPI 数据字所需的缓冲区空间。
如果正常、则无需回复即可使 线程变为绿色。
我必须错过下面的文本、这与预期的行为大相径庭。 程序模式起始地址似乎与 ARM flash.c 代码非常相似。 然而、FAPI float32_t 是4*16位字或2x C2000 64float_t 假设起始地址指针自动执行、扇区擦除会递增。对于每个 float32_t、地址可能不会像我一样递增起始地址2 16位字
FAPI 正在写入闪存组1、而 FAPI F021_32.lib 加载到 SRAM 似乎允许在不调用 fapi 程序模式的情况下写入闪存组0。 在加载到 LSRAM 的#pragma DATA 段中更改 POR 闪存组0值之后、至少通过#pragma DATA 段闪存到 LSRAM 发生这种情况。 即使在移除 USB 电源表单 LaunchPad 后、更新值仍然存在。
如果起始地址是64位对齐但不是128位对齐、那么只能同时对4个16位字进行编程。
BTW:FAPI 项目文件夹中的 Types.h 对于 float32和 float64具有错误的 C2000数据类型。 也许最好将 types.h (float)用于 float32_t、将(double)用作 float64_t
您好、Vamsi、
我看到您在19小时前回复了其他帖子、FAPI 中的存储问题未在 PDF 中得到充分解释。
没有明确解释程序模式函数定界符(例如起始地址必须每4个字递增一次)的记录上下文。 大多数逻辑上的任何人都会认为序列是自动的、因为 PDF 中反复使用了"自动"一词。
FAPI 不一致的示例:扇区擦除只需要起始地址并自动递增16位地址。 程序模式起始地址在首次64位写入后停止、因此 F5/F6调试过程非常慢。
没有说明 程序模式函数定界符缓冲区长度必须每4个字递增的上下文。 因此、文本会简短地继续进行、以提供一些程序模式分析。 但在主题顶部解释程序模式定界符之后、这一事实已经很好了。 添加注释或留下一些 面包屑以进一步阅读。 我在 TI 文档中快速阅读了如此多的信息、很容易错过未预料到的详细文本。
3.当 uint16_t 或 float32_t 数据类型将64位强制转换为 pu16DataBuffer 时、没有字节通过 pu16DataBuffer 存储。
FAPI 程序模式数据缓冲区名称不明确,应命名为(*64WriteBuffer),而不是 pu16DataBuffer。 在大多数项目中、通常指向64位闪存对齐 CMD 段、除非128位 OP 写入对齐段正在转换闪存数据。 保持简单、不要使任务复杂化、kiss。
5. FAPI 程序模式不会通过数据指针顺序加载数据缓冲区。 也不通过(float32_t *)处理全局 typedef 结构变量指针(MyStructTag)。 在首次64位写入闪存后、C2000编译器不会循环或以列出的格式间接转换全局结构变量。 程序模式只需将(float32 *)内容复制多次到任何4个循环的末尾、总缓冲区(sizeof)除以2。 简单地说、在首次64位写入后、全局结构列表中的数据指针不循环。 Tivaware (flash.c)通过指针读取*缓冲区内容,无需通过4个循环递增指向缓冲区的索引或指针,因此 FAPI 看起来过于复杂。
您好、GI、
感谢您的反馈。
关于您 的评论"我看到您在19小时前回复了其他帖子": 我在我的外出时间内没有多少时间、并想尽可能地提供帮助。 因此、检查了 E2E 的未决帖子。 您的帖子未显示为打开状态、因为您单击了"已解决"按钮-执行此操作时、它不会显示为我们的打开帖子。 因此没有答复你。 现在、当您再次回复时、帖子状态变为打开。
关于您的反馈:我可以在我回到办公室时进行回顾。 最可能的是、我建议召开一次会议来讨论您的反馈。
谢谢、此致、
Vamsi
您好、Vamsi、
这是意料之外的、就像尝试以2个循环步骤进行64位写入来对 float32_t 进行编程后出现的 FAPI 问题一样。 该示例似乎使用 OTP 128位对齐、因此索引+8和8字长度。 尽管我在 LSRAM 中使用 F021_F32.lib。
无意义的器件、文本状态 FAPI 仅一次写入64位。 但这种情况不明确、因为4个循环必须加载 pc16DataBuffer 8次128位写入。 如果存储浮点、4个循环必须2次才能加载(float32_t) pc16DataBuffer 以写入64位?
似乎指向32位结构成员的索引指针在每次传递4循环时必须执行第1步。 float 是不同的数据类型、需要 FPU 来解码存储在指数字段中的读取数据并通过小数点放置精度。 奇怪的是、正在写入的 ECC 数据与仅数据模式相同、FAPI 或 FSM 会跳过闪存字、因为它会对结构成员的索引进行排序、而不是浮点数据类型。 FAPI 在其他扇区写入数据的次数远远超过4个循环的总字数(155)。
已打开新线程以解决擦除问题:
您好、GI、
请为新问题打开一个新帖子、以便我们可以单独关注每个项目、从而更好地帮助您。
我将在星期五回顾一下、我们可以打电话。
谢谢、此致、
Vamsi
您好、GI、
我将下面有关浮点的问题从 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195860/launchxl-f280049c-all-flash-registers-are-0x0-after-_c_int00移到 他的帖子中。 这是为了避免混淆不同的问题。
您好、Vamsi、
TI 是否具有 FAPI 程序源、以便我们可以尝试将 F32库修复为接受浮点输入缓冲器? FAPI 可能是在 CCS 之外的 IDE 中写入 的、因为调试无法找到 prometheus.h 或类似的名称。
仍想知道为什么(F021_API_F28004x_FPU32_EABI)没有用于编程闪存扇区 float32_t puBuffer 的支持文件? 因此我更改了 F021.h 输入、其中存在浮点数据、但 FAPI 不接受该数据。 但是、由于长度很短、编译器不会转换浮点、这很可能。 userParams 中存储的数据的结构引用中有310个字。 因此、很难知道浮点数据或 DCSM 是否会导致问题。
/*编程命令*/
#if defined (_C28x)
extern Fapi_StatusType Fapi_issueProgrammingCommand (
uint32 * pu32StartAddress、
float32_t * pu16DataBuffer、
uint16 u16DataBufferSizeInWords、
uint16 * pu16EccBuffer,
uint16 u16EccBufferSizeInBytes、
Fapi_FlashProgrammingCommandsType oMode
);
我们可以在这里讨论这一点。
谢谢、此致、
Vamsi
你(们)好,Vamsi
请关闭此帖子、因为输入缓冲区数据类型的问题是 FSM 未编程、因此状态是错误的缓冲区长度。 另外、FAPI 应该按照设计移动输入 DataBuffer 指针、Tivaware (flash.c)也是如此。 因此、如果 FSM 在 POR 之后实际被启用、那么在程序模式的一个 FSM 写入周期中、FAPI 只能写入64位。
您好、GI、
好的、我将关闭这个帖子。
谢谢、此致、
Vamsi