You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:25:17