基于FM_1808(F-RAM)的PMSM数据存储与提取故障排查求助
FM_1808 FRAM数据存储与提取故障排查(PMSM矢量控制场景)
问题背景
正在开发永磁同步电机(PMSM)矢量控制的定制化硬件,因无法通过引脚直接用示波器观测转速响应与电流信号,计划将数据存储到FM_1808 FRAM中,后续读取数据绘制曲线。采用结构体+指针的方式管理数据,但目前无法正常完成FRAM数据提取,需要排查问题。
相关代码片段
define.c
#pragma DATA_SECTION(FRAMAdr,"FRAMData"); volatile struct FRAMAddress FRAMAdr;
linker cmd
page1 { EXTFRAM : origin = 0x200000, length = 0x008000 } Sections { FRAMData: > EXTFRAM PAGE = 1 }
define.h
struct FRAMAddress { int16 Dat[32768]; // FRAM 16bit data & 16bit memory }; extern volatile struct FRAMAddress FRAMAdr; Uint16 *FRAMStartAdr = (Uint16 *)0x200000;
pheripheral.c
void FSave(Uint16 FAdr, int16 FD1, int16 FD2) { FRamAdr.Dat[FAdr] = FD1; DELAY_US(0.2L); FRamAdr.Dat[FAdr+5000] = FD2; }
main.c
extern void FSave(Uint16 FAdr1, int16 FD1, int16 FD2); // 主循环/中断处理代码片段 { if(FIndex<=5000) { FSave(FIndex, (int16)spd, (int16)(id)); FIndex++; } else { FSaveflag=0; } }
排查方向建议
- 变量名拼写错误:
FSave函数中使用的FRamAdr存在大小写错误,定义时的变量名为FRAMAdr(全大写),拼写不匹配会导致访问错误的内存地址,甚至编译报错。 - 内存分配与结构体大小不匹配:链接脚本中EXTFRAM分配的长度是
0x008000(32768字节),但结构体中int16 Dat[32768]共占用65536字节(每个int16占2字节),远超分配的内存空间,会导致内存越界,破坏其他数据或访问非法地址。 - DELAY_US参数有效性:
DELAY_US(0.2L)的参数为0.2微秒,若平台的DELAY_US仅支持整数参数,0.2会被截断为0,导致无延迟操作,违反FM_1808的读写时序要求,造成数据写入失败。 - 索引边界风险:当
FIndex达到5000时,FAdr+5000等于10000,虽然小于结构体数组的32768长度,但因实际分配的内存仅能容纳16384个int16元素,需确认后续是否有索引超出16384的情况,避免越界。 - 编译地址验证:查看编译生成的map文件,确认
FRAMAdr的起始地址是否为0x200000,确保链接脚本的配置生效。 - 数据读取匹配性:后续提取数据时,需保证读取的地址范围(
0x200000至0x207FFF)、数据类型(int16)与存储时一致,避免因读取方式错误导致数据异常。
内容的提问来源于stack exchange,提问作者Muhammad
相关产品推荐
相关产品推荐

