0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用新的计算引擎(CE)代码图像编译仪表代码

星星科技指导员 来源:ADI 作者:ADI 2023-06-13 14:50 次阅读

本应用笔记介绍如何修改演示代码或电表应用代码,以便编译71M6531/71M6532和71M6533/71M6534和71M6541/71M6542/71M6543系列电表IC的新计算引擎(CE)代码图像并将其链接。

介绍

背景

71M6531/71M6532 和 71M6533/71M6534 和 71M6541/71M6542/71M6543 系列电能计量 IC 设计用于计算引擎 (CE) 代码,可适应手头的应用。 在某些情况下,Maxim需要并提供特殊的CE代码,以支持不同的传感器类型或功能,如滤波或谐波分析。

由于CE代码在闪存和XRAM中占用不同的空间,因此根据应用的不同,需要几个步骤来容纳特定的CE代码映像。这是通过修改仪表代码(演示代码或仪表应用代码)源和 Keil 编译器设置 (Keil μVision 4) 来完成的。®®

本应用笔记讨论了将新的CE代码映像成功集成到仪表代码中的必要步骤。在执行本应用笔记中描述的任务时,Keil μVision 和 Signum Systems™ WEMU51 等工具的一般知识很有帮助。建议阅读 71M653x 和/或 71M654x IC 的软件用户指南 (SUG)。

仪表代码和CE代码之间的通用接口

如何交付 CE 代码和 CE 数据文件

客户无法使用 CE 的源代码。CE 代码作为代码映像提供,该映像链接到测量仪代码闪存映像,然后解释为 CE 操作代码,并由 CE 在运行时执行。执行时,CE 代码需要初始化 XRAM (CE RAM) 中的某些寄存器。例如,未校准(默认)仪表的校准系数设置为0x4000,通常WRATE的标准值也是CE数据图像的一部分。交付给客户的 CE 代码文件如下:

CE 代码图像(例如 CE34B07G_ce.c):此代码适用于 71M6534 或 71M6533,其版本为 B07G。

CE 数据映像(例如 CE34B07G_dat.c):此数据集适用于 07M71 或 6534M71 的代码版本 B6533G。

CE 文件以前导字符“CE”命名,后跟指定仪表片上系统 (SoC) 系列的两位数字,例如 “34” 表示 71M6533 和 71M6534,或“41” 表示 71M6541 和 71M6542。下一个字母通常指定代码兼容的芯片版本(A、B、C、...)。修订字母后面的两位数字是代码类型。当开发具有明显不同功能的新代码时,将为这两个数字选择一个新数字。任何特性或功能都不能直接从两位数字派生出来。通常,与CE代码一起提供的应用笔记描述了特定代码类型的特性和用法。两位数字后面的字母是特定代码类型的修订代码。例如,修订版“D”包含修订版“C”中问题的修复。当同一代码类型的多个修订版可用时,应使用最新版本。

典型 CE 代码图像的一部分如下所示:

// File: ce34a02d_ce.c
//                                                                          
// CE Program Image File (8051 C format)
const short code NumCeCode=1280;	// The number of words in the 'CeCode' array.
const unsigned char code CeCode[]={
 0x20,0xe3, 0x74,0x45, 0xec,0xff, 0x8c,0x45, 0x20,0xe4, 0x74,0x46, 0xed,0xff, 0x8c,0x46,
 0x20,0xe3, 0x74,0x45, 0xec,0xff, 0x8c,0x45, 0x20,0xe4, 0x74,0x46, 0xed,0xff, 0x8c,0x46,
 0x20,0xe3, 0x74,0x45, 0xec,0xff, 0x8c,0x45, 0x20,0xe4, 0x74,0x46, 0xed,0xff, 0x8c,0x46,
 0x20,0xe3, 0x74,0x45, 0xec,0xff, 0x8c,0x45, 0x20,0xe4, 0x74,0x46, 0xed,0xff, 0x8c,0x46,
 ...
 0x8f,0x05, 0x21,0x03, 0x8f,0x03, 0x21,0x04, 0x8f,0x04, 0x21,0x05, 0x8f,0x05, 0x20,0x03,
 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff,
 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff,
 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff,
 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff, 0xff,0xff
};

两个字节(16 位)组合形成一个 CE 操作码。0xFFFF 是 STOP 指令的操作代码。

典型CE数据图像的一部分如下所示:

// File: ce34a02d_dat.c
//                                                                          
// CE Data Image File (8051 C format)
const short code NumCeData=268;	// The number of words in the 'CeData' array.
const unsigned char code CeData[]={
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x50,0x00, 0x00,0x00,0x00,0xab, 0x00,0x00,0x19,0x2c, 0x00,0x00,0x09,0xd8,
 0x01,0x6d,0x24,0x90, 0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff, 0x63,0x65,0x33,0x34, 0x61,0x30,0x32,0x64, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x0c, 0x00,0x00,0x59,0xba, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x18,0x00, 0x00,0x00,0x09,0xd8, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00, 0x20,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,
 0x60,0x00,0x00,0x00, 0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 …
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
};

CE 数据以 4 字节(32 位)字进行组织。这些是定点数据,可以是CE处理的任何类型的数据,例如校准系数,常数,中间结果或输出数据。

请注意从数据字段的第 0 行开始的 40x0/00x5 字节组合(以黄色显示)。这些是位于CE数据寄存器0x0010及以上的校准系数的默认设置。这些值实际上被解释为0x00004000。启动时,需要将 CE 数据映像的基本部分复制到 XRAM,从地址 0x0000 开始,以便 CE 代码具有有效的数据。这是通过仪表代码完成的。CE 数据映像末尾的数据0x00,并且仪表代码可能会通过不将零数据复制到 CE RAM 而采取快捷方式。

请注意,某些 CE 代码在数据映像末尾具有非零数据,并且不能对这些代码使用快捷方式。下面显示了此类代码的示例(请注意以黄色标记的非零字节嵌入在零字节中):

const short code NumCeData=414;	// The number of words in the 'CeData' array.
const unsigned char code CeData[]={
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x50,0x00, 0x00,0x00,0x00,0xe3, 0x00,0x00,0x19,0x2c, 0x00,0x00,0x08,0x88,
 0x01,0x6d,0x24,0x90, 0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff, 0x63,0x65,0x33,0x34, 0x61,0x32,0x30,0x62, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x0c, 0x00,0x00,0x58,0xc1, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x18,0x00, 0x00,0x00,0x09,0xd8, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,
 0x00,0x00,0x40,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x20,0x00,0x00,0x00, 0x20,0x00,0x00,0x00, 0x60,0x00,0x00,0x00,
 0x60,0x00,0x00,0x00, 0xff,0xff,0xff,0xff, 0x00,0x00,0x80,0x00, 0x40,0x00,0x00,0x00,
 0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x03, 0x03,0x35,0x92,0x44, 0x02,0xfe,0xcc,0xc8,
 0x02,0xfe,0xcc,0xc8, 0x02,0xfe,0xcc,0xc8, 0x02,0xfe,0xcc,0xc8, 0x05,0x90,0x0e,0x98,
 0x05,0x59,0x49,0x1c, 0x05,0x90,0x0e,0x98, 0x05,0x90,0x0e,0x98, 0x05,0x90,0x0e,0x98,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x0d, 0x12,0xe0, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
};

保留用于CE代码的71M653x和71M654x IC的闪存

对于具有 0KB 闪存的产品,闪存范围从 0000x0 到 64xFFFF,对于 0KB 产品,闪存范围从 1x128FFFF,对于 0KB 产品,闪存范围从 3x256FFFF。CE 代码映像由链接器放置在 1KB 边界 (0x0400) 上的此范围内的某个位置,然后由 CE 在运行时使用 I/O RAM 中的指针找到。 乘以 1024 (0x0400) 得到 CE 代码的闪存位置。将CE代码放置在闪存的顶端是有利的,这样它可以在不影响其他代码的情况下增加大小。对于大尺寸的 CE 代码,必须移动到低 1KB 或 2KB 的地址,因为该特定 CE 代码的末尾可能会超过代码库的结束地址。CE_LCTNCE_LCTNCE_LCTN

有时仪表代码的默认设置不起作用,因为CE代码太大。计量代码的默认值已经有 25% 的额外空间,特别是为了允许一些增长。但是,非常大的CE代码可能需要超过25%的额外空间。

代码的大小在常量中指定,常量是 CE 代码映像的一部分。 是代码中 CE 指令的实际数量。生成文件时,它将插入到 _ce.c 代码文件中。例如,对于许多标准 1950M71x CE 代码,是 653。由于 CE 代码由 16 位字构成,这使得代码的总长度为 2 × 1950 = 3900 字节。复杂的 CE 代码通常较大,例如 CE34A20,它有 2235 个单词或 4470 个字节。NumCeCodeNumCeCodeNumCeCode

71M653x 和 71M654x IC 的内存

CE 代码的 RAM 位于一般 XRAM 中,在所有 71M653x 和 71M654x IC 中,CE 和微处理单元 (MPU) 之间共享。

71M653x的XRAM范围从0x0000到0x0FFF(4KB)。71M654x 的 XRAM 范围介于 3KB(0x0000 至 0x0BFF)和 5KB(0x0000 至 0x13FF)之间,具体取决于零件类型。

在所有 71M653x 和 71M654x 器件中,从 0x0000 开始的最低 XRAM 位置保留用于 ADC 输出和校准系数,然后是 CE 寄存器和传递变量(有关确切的 CE 寄存器位置,请参见数据手册)。在此之上,CE 代码将 XRAM 空间用于内部变量。重要的是,MPU 和 CE 使用 XRAM 之间没有重叠。MPU 应占用朝上地址的 XRAM。

CE 代码在常量中声明其 XRAM 使用情况,常量以 32 位字测量。例如,320 个 32 位字将产生 1280 字节 (0x500)。NumCeData

在运行时,即当仪表代码启动时,MPU 将 CE 数据图像中的常量复制到 XRAM,作为初始化的一部分。 是为此复制操作指定的源地址。请注意,声明为 ,这意味着数据图像被视为代码,因此由链接器放置在闪存中。MPU 代码可以在链接器放置它的位置找到 CE 数据图像。CeDataCeDataconst unsigned char code

基本上,CE数据图像可以位于闪存中的任何位置。但是,1KB边界(0x0400)被重新推荐,因为MPU代码可能希望在闪存中更新图像,例如,当用户想要将校准和其他参数存储在EEPROM中而不是闪存中时。擦除整个闪存页面非常简单,这是在将CE参数写入非零闪存之前必须发生的情况。CE数据映像不跨越页面边界是有利的:当CE数据映像更新到闪存时,当映像在闪存页边界内时,读/写操作更简单(有关详细信息,请参阅测量仪SoC的数据手册)。

常规内存映射

图 1 显示了一般内存映射:闪存包含 MPU 的代码以及 CE 的代码和数据映像。对于CE数据图像,有一个非零部分和一个零部分。在运行时,MPU 和 CE 都在闪存外运行。当 MPU 代码启动时,它会将 CE 数据映像复制到 XRAM 中,该映像在 CE 和 MPU 之间共享。

MPU 代码可以选择仅复制 CE 数据映像的非零部分或复制整个 CE 数据映像。

wKgaomSIFyOADiM8AAB_hxnswh0406.png

图1.常规内存映射。

Keil 编译器设置

使用新的 CE 代码需要将代码和数据文件(例如 CE34B07G_ce.c 和 CE34B07G_dat.c)复制到代码文件夹环境的 CE 文件夹中。演示代码源由Maxim以固定文件夹结构提供。客户使用的仪表应用代码可能具有类似的结构。下面显示了 71M6533 演示代码文件夹结构的示例。

wKgZomSIEcCAfpkVAAAUUO8HVq4909.gif

当我们打开CE文件夹时,我们看到作为演示代码的一部分提供的CE代码和CE数据图像的集合。请注意,代码构建通常只使用一个 CE 代码映像和一个数据映像。我们必须让Keil μVision环境知道要使用哪些CE代码图像。这是通过在Keil μVision 4图形用户界面(GUI)的左侧面板(项目面板)中选择CE组,右键单击,然后选择“管理组件”来完成的。如图 2 所示,选择“组”下的“CE”条目后,可用的 CE 文件将显示在右侧面板中的“文件”下。

wKgaomSIEcKAORI7AACEnlxi9xE281.gif

图2.“项目组件”选项卡。

按“添加文件”按钮将打开一个对话框,允许浏览到CE代码和数据映像的物理位置,以进行选择并包含在代码构建中。之后,必须单击浏览对话框的“关闭”按钮。不需要的CE文件应通过选择其文件名并按“文件”下右侧面板中的删除按钮来删除。

注意:此操作仅从 Keil 项目中删除文件。删除的文件仍实际存在于硬盘驱动器上。

必须调整Keil PK51环境中“目标选项”中的另一个选项卡以适应要合并的CE代码:“目标”选项卡有一个区域,需要定义CE代码所需的RAM空间。此条目允许 Keil PK51 编译器/链接器定义 80515 MPU 的 XRAM 变量和堆栈中的位置。下面的图 3 显示了在“开始”窗口中0x06A4和“大小”窗口中0x096C的条目。条目0x06A4在 XRAM 空间中保留 0x06A4 或 1700 个十进制字节,即从 0x0000 到 0x06A3 的范围,用于 CE RAM 使用,并为 MPU 保留从 0x06A4 到 0x0FFF(对于 4KB RAM 大小)的区域。条目0x06A4对应于乘以 4,因为每个 CE 寄存器/字相当于四个字节。“大小”下的条目是最大可用 XRAM 大小(本例中为 4KB 或 0x1000)与“开始”下给出的地址之间的差异。NumCeData

请注意,对于所有 71M653x IC 和 71M654xG IC,检查“代码库”并正确选择库数,即 8 个用于 256KB 闪存,4 个用于 128KB。

wKgZomSIF0aAfZZrAAFZ-hY9hHs623.png

图3.“目标”选项卡。

Keil 编译器中的设置的一个好处是,一旦保存项目,它们就会反映在 Keil 项目文件(*.uv2、*.uvproj)中。这意味着复制 Keil 项目文件可保证正确应用设置,并且不需要手动重新输入。

CE代码是为模拟前端(AFE)的特定设置生成的,即采样频率、有限脉冲响应(FIR)滤波器长度、采样通道的数量和顺序以及其他参数的组合。在某些情况下,MPU 时钟也必须进行调整。使用AFE设置而不是指定设置操作CE代码会导致故障。

CE代码通常带有自己的应用说明或AFE所需设置的简要说明。应用笔记或说明中指定的设置必须通过MPU源代码中的相应更改来实现。

请注意,如果 Wh、VARh、VnSQSUM_X、InSQSUM_X 或其他计量参数的 LSB 已使用新的 CE 代码进行更改,则必须在源代码中调整 LSB 值。

闪存操作和 CE 代码

根据设计,闪存上的 MPU 代码操作需要禁用 CE。这是通过清除CE_E位(I/O RAM 地址 3x0 处的第 2000 位)来实现的。清除该位后,需要完整CE代码运行的延迟(例如,396Hz码采样为2520μs,458Hz码采样为2184μs),以使CE在开始任何闪存操作之前遇到STOP命令。

71M653x 系列电能计量 IC

CE 租赁代码

对于 71M653x 演示代码(截至修订版 4p7b),main.c 中的指令加载十进制 31,结果为 0x400 * 31 = 0x7C00。稍后,指针在 ce_30.c 中重新加载,在 options.h 中定义为 0x78。这使得闪存中的最终CE位置0x78 * 0x400 = 0x1E000。如前所述,将CE代码放置在闪存的顶端是有利的,这样它可以在不影响其他代码的情况下增加大小。对于大尺寸的CE代码(即如果>512),必须指向低1KB或2KB的地址,即 必须递减 1 或 2。CE_LCTNCE_LCTN_ADRNumCeCodeCE_LCTNCE_LCTN

CE_LCTN指向 CE 代码开始的地址,即第一条指令。请注意,占用两个字节,这些字节不是代码本身的一部分。这意味着,当使用 Keil PK51 的链接器设置放置 CE 代码图像时,图像位置为 - 2。NumCeCodeCE_LCTN

CE 时钟速率和代码长度

71M653x电能计量IC可以以标准的4.915MHz速率或9.3804MHz的双时钟速率(设置位时)运行CE。采样频率(帧速率)、可执行CE代码周期和CE时钟速率的值不能任意,因为CE必须在为多路复用器帧分配的时隙内完成一次代码运行。CE_10MHZ

典型的帧持续时间为396.729μs(采样频率为2520.62Hz),在4.9152MHz CE时钟速率(每条指令203ns)下,1950 CE指令适合一帧。所有超过 1950 条指令(或超过 3.8KB 代码大小)的 CE 代码必须以 9.8304MHz(每条指令 101.5ns)的 CE 时钟速率运行,这允许在一个帧中最多包含 3900 条指令(相当于 7.6KB CE 代码大小)。

包括零线电流采样的典型多相CE代码的工作频率为2184.53Hz或457.76μs。这些代码允许以2255.4MHz CE时钟速率执行9152条指令。

单相码可以具有更快的帧速率,例如3276.8Hz,每帧305.176μs。这些代码在 1500.4MHz 时仅适合 9152 条指令,在 3000.9MHz 时仅适合 8304 条指令。

了解采样频率(帧速率)、CE代码周期和CE时钟速率之间的关系有助于用户理解如何设置位,如果给定CE代码的应用笔记中尚未提及。CE_10MHZ

如果设置了CE_10MHZ位,则还必须设置M40MHZ位。这意味着必须调整MPU时钟速率,因此波特率和定时器常数也应全部调整。

凯尔设置

图 4 中“BL51 杂项”选项卡(在 Keil PK51 环境中可通过“目标选项”访问)中显示的条目为 CE 代码映像 (CE0A34A_CE 分配了20xDFFE上方的空间。C在本例中)。请注意,使用的是 BANK3,它将代码放置在闪存位置0x1DFFE。

wKgZomSIF1OAbo5vAAEuWeQm6PM580.png

图4.BL51 杂项选项卡。

CE 数据映像通常放置在比 1024 字节高 0 字节的位置,在0xEFFE处,导致使用 BANK1 进行3x0EFFE。在上图中,已选择CE数据图像从1x200F0(1x1F2FE + <>)开始。

参见图5,并参考数据手册中的表38,了解BANK 3的物理位置:

wKgaomSIEceAD2gpAAB-GOn3JOE050.gif

图5.71M653X组切换台。

欧共体日期

应用于的相同空间注意事项适用于 如果 × 4 大于 1024,则代码映像必须在闪存中向下移动 1KB。在这种情况下,还必须递减,以避免闪存中CE代码和CE数据重叠。NumCeCodeNumCeData:NumCeDataCE_LCTN

在运行时,CE 数据映像中的常量将作为初始化的一部分复制到 XRAM。ce_30.c 中的以下代码执行复制操作:

FL_BANK = BANK_CE; memcpy_cer ( (int32x_t *) CE_DATA_BASE, (int32r_t *) CeData, min(CE_DATA_SIZE, NumCeData) ); FL_BANK = saved_bank; }

CE_DATA_BASE在 CE653x.h 中定义为0x0000。在此文件中,定义为 0x0140 32 位字 (= 0x0500)。请注意,复制例程使用最小值 和 。这是因为只需要使用 复制 CE 代码映像的下半部分,这是用于将基本数据从闪存中的 CE 数据映像复制到 XRAM 中的 CE 数据区域的计数。数据区域的其余部分(即最大为完整大小)不会被复制,并且在刚刚清除为零时应该可以正常工作。此部分复制操作的目的是减少 CE 数据表消耗的闪存大小。CE 编程人员通常会在 中移动所有特殊的起始值(非零值)。CE_DATA_SIZECE_DATA_SIZENumCeDataCE_DATA_SIZENumCeDataCE_DATA_SIZE

注意: 某些 CE 代码在其 CE 数据映像的末尾具有非零 CE 数据。这些必须由 MPU 复制。在这种情况下,使用 和 的最小值不是建议的过程,复制例程应使用× 4。CE_DATA_SIZENumCeDataNumCeData

如果需要更大的CE XRAM使用,则需要更改。CE_DATA_SIZE

具有较大 XRAM 分配的 CE 代码需要以下更改:

Keil PK51环境中可通过“目标选项”访问的“目标”选项卡必须指定CE代码所需的XRAM空间。

CE_DATA_SIZE需要更新 (CE653x.h)。

MPU 代码中的硬件初始化

I/O RAM 的初始化是使用 defaults.c 中的结构完成的。此结构由多个段组成,这些段处理从与0x2000(I/O RAM 的基址)的给定偏移量开始的多个 I/O 地址。从数据手册的固件接口部分获取 I/O RAM 图有助于破译条目。大多数条目都是硬编码的,例如0x34地址 0x2001,它以 0x34 或 52 十进制初始化。结合(两位,设置为零,导致数值为 42),每个累积间隔的结果样本数为 42 × 52 = 2184。uint8r_t_ri_defaults[ ]SUM_CYCLESPRE_SAMPS

某些条目派生自定义,例如 at 地址 0x2000,它是 的逻辑 OR,如 options.h 和 中定义,如 IO653X.h 中定义,或在地址 0x2004,在 OPTIONS_GBL.H 中定义。EQUATION | CE_10MHZEQUATIONCE_10MHZMPU_FREQ

后面的段,例如从I/O RAM地址0x2030开始的通用输入输出(GPIO)配置,对于CE功能并不那么重要。下面给出了 defaults.c 的示例:uint8r_t_ri_defaults[ ]

uint8r_t ri_defaults[] =
{ //   0     1     2     3     4     5     6     7
   0x00, 0x10,                            // address and length
   EQUATION | CE_10MHZ, 0x34,             // 2000-2001
   0x03,                                  // 2002 enable xfer_busy, RTC interrupt.
   0x00, MPU_FREQ, CONFIG1_VAL, 0x00,     // 2003..6
   0x24,                                  // 2007 enable PLL_OK 0x24
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2008-F. DIO Resources, etc.
   0x11, 0x01,                     // address and length, index 18
   0x40,                           // Default value for the analog clock adjustment
   0x1C, 0x03,                     // address and length, index 21
   0x04, 0x00, 0x00,               // Default value for PREG and QREG
   0x20, 0x0A,                     // address and length, index 26
   0x00, 0x23,                     // 2020-1.  all states, all on
   0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  // 2022-9
   0x30, 0x2B,                         // address and length; LCD buffer/ DIO outputs
   // Clear segments visible on LCD or not DIOs; Leave DIOs as outputs
   0x00, 0x00,                         // 2030..1=seg42,43
   0x80, 0x80, 0x80, 0x80, 0x00, 0x00, // 2030..7=seg44..49=dio24..29 
   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, // 2038..F=seg50-57=dio30..37
   0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, // 2040..7=58..65=dio38..45
   0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, // 2048..F=66..73=dio46..53
   0x80, 0x80, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, // 2050..7=74..81=dio54..61
   0x00, 0x00, 0x00,                               // 2058..A=dio40,41,blink19&18
   0x60, 0x08,                                     // address and length
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 2060-7. RTM.
   0x70, 0x01,                                     // address and length
   0x00,                                           // 2070
   0x80, 0x02,                                // address and length
   0x4B, 0x51,                                // 2080-1. 10ms Pulse_Width, Pulse_Interval.
   0x90, 0x0B,                          // address and length
   0x10, 0x32, 0x54, 0x76, 0x98, 0x00,  // 2090 normal sequence
   0x1A, 0x3B, 0x54, 0x76, 0x98,        // Alt sequence reads temp, vbat and aux
   0x9D, 0x01,               // address and length
   0x07,                     // 209D: 6 states
   0xA7, 0x09,               // address and length
   0x00,                     // 20A7: boot size
   0x31, 0x00, 0x00,                  // 20A8-A. CE5, WAKE, TMUX.
   0x00, 0x22, 0x22, 0x00, 0x00,      // 20AB..F; differential, diff. chop enabled
   0xFD, 0x03,                        // address and length
   0x00, 0x00, 0x00,                  // 20FD-F. TRIMSEL, TRIMX, TRIM.
   0, 0 // ending record
};

调整仪表代码和Keil设置以适应更大或更小的CE代码和数据

大小大于用于现有构建的大小(如中所述)的 CE 代码需要进行以下调整:NumCeCode

向下调整CE_LCTN_ADR

Keil PK51 环境中可通过“目标选项”访问的“目标”选项卡必须指定 CE 代码所需的闪存空间。此条目必须与 的新选择 相对应。CE_LCTN_ADR

具有更大或更小的 XRAM 分配的 CE 代码需要以下更改:

Keil PK51环境中可通过“目标选项”访问的“目标”选项卡必须指定CE代码所需的XRAM空间。

Keil PK51 环境中可通过“目标选项”访问的“BL51 杂项”选项卡必须指定闪存中的位置。

CE_DATA_SIZE需要在源代码 (CE653x.H) 中更新。

应检查 CE 代码是否存在超出 的数据。CE_DATA_SIZE

如果 CE 数据超出 0x04FF,则在 XRAM 中以 meter.c 为单位移动结构的位置。totals

将代码下载到 71M653x 闪存

以10MHz频率运行CE的CE代码要求在使用ADM3 ICE下载代码时设置I/O RAM地址0x2000位(位51)。下载代码之前的正常过程是只清除 0x2000 处的整个字节,这会清除过程中的位(位 4)。对于以10MHz运行CE的CE代码,在下载代码之前将0x08的值写入I/O RAM 地址0x2000会很有帮助,该代码保持位(位3)。CE10MHZCE_ECE10MHZ

71M654x 系列电能计量 IC

一般性评论

71M654x 代码的注意事项与 71M653x 代码非常相似。71M6543的典型CE代码如下所示。请注意,同一变量 用于指定代码的长度。NumCeCode

// File: ce43a22_ce.c
//                                                                          
// CE Program Image File (8051 C format)
const short code NumCeCode=1512;	// The number of words in the 'CeCode' array.
const unsigned char code CeCode[]={
 0xec,0xff, 0x20,0x48, 0x74,0xd8, 0x8c,0x48, 0x74,0xd8, 0x8c,0x48, 0x74,0xd8, 0x8c,0x48,
 0x74,0xd8, 0x8c,0x48, 0x74,0xd8, 0x8c,0x48, 0x74,0xd8, 0x8c,0x48, 0xed,0xff, 0x20,0x4c,
 0x74,0xd9, 0x8c,0x4c, 0x74,0xd9, 0x8c,0x4c, 0x74,0xd9, 0x8c,0x4c, 0x74,0xd9, 0x8c,0x4c,
 0x74,0xd9, 0x8c,0x4c, 0x74,0xd9, 0x8c,0x4c, 0x20,0x5c, 0x8f,0x74, 0x20,0x5e, 0x8f,0x76,
 0x20,0x60, 0x8f,0x78, 0x20,0x5d, 0x8f,0x7a, 0x20,0x5f, 0x8f,0x7b, 0x20,0x61, 0x8f,0x7c,
 0x26,0x20, 0x8f,0x38, 0xf0,0x38, 0x20,0x5d, 0x68,0x5f, 0x69,0x61, 0x8f,0x38, 0x20,0xf9,
 0x05,0xfa, 0x15,0xf9, 0x8f,0xf9, 0x20,0xfa, 0x05,0x38, 0x11,0xf9, 0x8f,0xfa, 0x20,0xb0,
 0xd0,0x4f, 0xf0,0xf9, 0x2b,0x4f, 0x8f,0x38, 0x30,0x38, 0x81,0x38, 0x30,0x38, 0x86,0x38,
 0x20,0x38, 0x00,0xb2, 0x87,0xb3, 0x8f,0xb2, 0xb7,0xb2, 0x20,0xb3, 0x00,0xb4, 0x8f,0x38,

在此示例中,指定的 1512 个单词长度等于 3024 字节(0x0BD0 字节)。在71M654x IC中,闪存中CE代码的位置编码为I/O RAM 地址0x2109()。CE_LCTN

图 6 显示了代码空间、指针和 Keil BL51 链接器选项卡中的条目之间的关系。CE_LCTN

wKgZomSIEcuAOD8pAAByMlWpzBw232.gif

图6.代码空间、CE_LCTN指针和 Keil BL51 链接器之间的关系。

Signum 仿真器中闪存区域0xCFD0到0xD05F的代码窗口如图 7 所示。位置 0xCFFE 处的条目05x8E1512(0 十进制)对应于 。CE 代码映像本身从位置 0xD000 开始。NumCeCode

wKgaomSIEc2AWfOOAABqTsR0tKs186.gif

图7.签名模拟器中的“代码”窗口。

CE 数据映像

在 71M654x 演示代码中,CE 数据图像通过 Main.c() 中的例程复制到 XRAM 中:

  // Set CE RAM to default.
    memcpy((uint8x_t*)CE_DATA_BASE, CeData, (4 * NumCeData));

与 71M653x 演示代码相反,71M654x 演示代码不基于 和 的最小值进行复制操作。71M654x 演示代码将 定义的整个数据映像复制到 XRAM 中。CE_DATA_SIZENumCeDataNumCeData

调整 I/O 内存位置

为了建立CE代码的环境,I/O RAM条目控制多路复用器设置、FIR长度、增益控制、输入引脚配置(单端/差分)、时钟选择等。如有必要,必须检查和更改。

在 71M654x 演示代码中,I/O RAM 寄存器由名为 的结构控制。此结构可以在 main.c 中找到,并且不包含命名元素,这意味着必须从 I/O RAM 地址0x2100开始手动计算字节,以确定其含义。io_ram_table[]

下一页上的列表显示了典型代码的默认条目及其含义。该结构在开头包含四个字节,用于确定起始地址 (0x2100) 和条目长度 (0x0013)。

请注意,设置为 0x03,这会将 CE 代码映像放在闪存中的0x0C00。这是Maxim 71M654x演示代码的典型特征。在闪存的较低范围内分配一个位置,使代码与IC的32KB和64KB闪存尺寸变体兼容。CE_LCTN

const uint8r_t io_ram_table[] = 
{ 
// Configuration without M6000 (Remote sensor) 
   // Wh = max(VA * IA); IA is shunt 
   0x21, 0x00, 0x00, 0x13,                          // address (0x2100) and length (0x13 = 19 bytes decimal)
   0x01, 0x11, 0x11, 0x11, 0x12, 0xA0, 0x00, 0x09,  // MUX_DIV=0, MUX10_SEL=1, MUX7_SEL=1, MUX6_SEL=1,
                                                    // MUX5_SEL=1, MUX4_SEL=1
                                                    // MUX3_SEL=1, MUX2_SEL=2, MUX1_SEL=A, MUX0SEL=0
                                                    // EQU=0, no chop, no RTM, CE_E=0, SUM_SAMPS[12:8]=9
   0xD8, 0x03, 0x42, 0x5D, 0x3A, 0x00, 0x00, 0x01,  // SUM_SAMPS[7:0]=0xD8 ? SUM_SAMPS = 2520 decimal
                                                    // CE_LCTN=3, PLS_MAXWDTH = 0x42, PLS_INTERVAL = 0x5D ? 93 decimal
                                                    // DIFFn_E = 1, FIR_LEN = 01, RTM
   0x02, 0x03, 0x04,                                // RTM, last byte not used. There is no I/O RAM address 0x2112
   #if POWER_CONTROL 
   0x22, 0x00, 0x00, 0x01,                          // address (0x2200) and length (0x01) 
   0x32,                                            // Clocks: MCK=19.6608MHz, MPU=0.6644MHz, ADC=0.66MHz 
   #endif 
   0x21, 0x00, 0x00, 0x01,                          // address (0x2100) and length (0x01) 
   0x30,                                            // set mux_div after ADC

调整仪表代码和Keil设置以适应更大的CE代码和数据

大小大于用于现有构建的大小(如中所述)的 CE 代码需要进行以下调整:NumCeCode

调整 main.c 中的源代码,字节在 0x2109。CE_LCTN

Keil PK51 环境中可通过“目标选项”访问的“目标”选项卡必须指定 CE 代码所需的闪存空间。此条目必须与 的新选择 相对应。CE_LCTN

71M653x 代码中使用的结构已重命名为 71M654x 代码,这是结构的一部分。设置为 0x2800,这是 I/O RAM 中 NV-RAM 数据字段的开头。totalsreg_datanvm_sreg_data

具有较大 XRAM 分配的 CE 代码需要以下更改:

Keil PK51环境中可通过“目标选项”访问的“目标”选项卡必须指定CE代码所需的XRAM空间。

CE_DATA_SIZE需要在源代码 (CE654x.H) 中更新。

应检查 CE 代码是否存在超出 的数据。CE_DATA_SIZE

请注意,与 71M654x 系列相比,71M653x 系列在闪存中分配代码空间的窗口看起来不同(参见图 8):

wKgZomSIEdGASTFgAAC9CgUY5iI149.gif

图8.BL51 在 Keil uVision 4 中定位窗口。

请注意,71M654x 演示代码中使用了其他固定闪存地址:

// Flash addresses. #define FLASH_CE_CAL 0xfc00 // Address of CE calibration. #define FLASH_MPU_CAL 0xf800 // Address of MPU calibration.

闪存地址0xFC00保留用于保存关键CE参数,如校准系数、、等。使用 ]U 命令。WRATECECONFIG

闪光地址0xF800保留用于保存关键MPU参数,即用户可以用“)”关键字输入的参数,例如当用户输入“)3=+2080”将IMAX值设置为208A时。

必须注意不要将CE代码或数据映像与这些固定的闪存位置重叠。

故障 排除

使用上面详述的技术生成的代码图像最初可能并不总是有效。下面列出了一些故障排除提示。

对测量仪或演示代码进行故障排除的好方法包括以下步骤:

将ADM51仿真器连接到目标并启动WEMU51应用程序。

擦除目标闪存。

使用模拟器的 SET 命令清除 XRAM 空间。例如,命令 SET /MDATA 0 3FF 0 用零填充从 0 到 0x3FF 的 XRAM 内存。

使用 WEMU51 中的“文件 – 加载”命令将生成的代码图像加载到闪存中。

在程序窗口中检查CE代码图像的位置(图像是否已加载到预期位置?,映像是否完整?有重叠吗?

在程序窗口中检查CE数据图像的位置(图像是否已加载到预期位置?图像是否完整?有重叠吗?

单击 RES,然后在 WEMU51 用户界面中单击 Go。允许代码运行 1 到 2 秒,然后单击 STOP 按钮停止代码执行。

在数据窗口中检查0x0000附近的 XRAM。代码现在应该已将 CE 数据映像复制到 XRAM。靠近0x0000的地址会被ADC样本覆盖,但0x0010及以上的地址应反映CE数据镜像。检查是否已复制完整的数据图像,即从0x0000到或至少到)。NumCeDataCE_DATA_SIZE

检查 I/O RAM,即从 0x2000 (71M653x) 或 0x2000 和 0x2100 (71M654x) 开始的地址。检查 CE 代码位置的指针是否已正确初始化 ()。CE_LCTN

检查控制AFE的I/O RAM 寄存器,例如、、多路复用器插槽分配、、、 以及用于模拟引脚差分/单端操作的控制寄存器。所有设置必须与CE代码应用说明中指定的设置相对应。MUX_DIVSUM_PREFIR_LENPRE_E

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48120

    浏览量

    740161
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117762
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48626
收藏 人收藏

    评论

    相关推荐

    如何编写有利于编译器优化的代码

    对于嵌入式系统,最终代码的体积和效率取决于由编译器生成的可执行代码,而非开发人员编写的源代码;但是源代码的优化,可以帮助
    发表于 11-09 10:31 1297次阅读
    如何编写有利于<b class='flag-5'>编译</b>器优化的<b class='flag-5'>代码</b>

    matlab图像处理源代码

    matlab图像处理源代码
    发表于 06-18 14:36 173次下载
    matlab<b class='flag-5'>图像</b>处理源<b class='flag-5'>代码</b>

    一种用于反编译代码与源代码的比较算法

    现有反编译器产生的代码与对应的源代码之间存在差异,找到并理解差异有助于改进并完善反编译器的设计。该文给出一种适用于C 语言反编译
    发表于 03-21 15:08 10次下载

    C编译器的设计文档与源代码

    C-编译器的设计文档与源代码:本压缩包包含了C-编译器的设计文档与源代码,供学习参考。  整体框架. 3 词法分析. 3᠙
    发表于 02-09 11:13 45次下载

    编译代码与源代码的比较算法

    编译代码与源代码
    发表于 02-09 15:19 10次下载

    3D图像引擎,3D图像引擎原理

    3D图像引擎,3D图像引擎原理 产生的背景和定义 随着计算机软、硬件突飞猛进的发展,计算机图形
    发表于 03-26 15:54 1429次阅读

    iftop源代码编译安装

    iftop源代码编译安装
    发表于 04-03 23:39 15次下载
    iftop源<b class='flag-5'>代码</b><b class='flag-5'>编译</b>安装

    Android源代码编译

    Android源代码编译
    发表于 10-24 09:30 5次下载
    Android源<b class='flag-5'>代码</b><b class='flag-5'>编译</b>

    如何把notepad++配置成一个能编译C代码的记事本

    把notepad++配置成一个能编译C代码的记事本
    的头像 发表于 02-04 15:09 2734次阅读
    如何把notepad++配置成一个能<b class='flag-5'>编译</b>C<b class='flag-5'>代码</b>的记事本

    CubeMX版本编译代码的教程

    用的CubeMX版本是4.20.0如下图,用的Keil5编译代码编译结果0 Error(s),0 Warning(s)。
    的头像 发表于 10-10 10:32 3934次阅读
    CubeMX版本<b class='flag-5'>编译</b><b class='flag-5'>代码</b>的教程

    ARM代码编译链接的工作流程

    ARM处理器在市面上到处都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的种类繁多,今天我们就来了解一下ARM代码编译链接的工作流程,以及过程中需要的相关概念信息
    的头像 发表于 12-22 16:57 1903次阅读

    如何编写有利于编译器优化的代码

    对于嵌入式系统,最终代码的体积和效率取决于由编译器生成的可执行代码,而非开发人员编写的源代码;但是源代码的优化,可以帮助
    的头像 发表于 03-29 15:58 1152次阅读
    如何编写有利于<b class='flag-5'>编译</b>器优化的<b class='flag-5'>代码</b>

    【GCC编译优化系列】实战分析C代码遇到的编译问题及解决思路

    【GCC编译优化系列】实战分析C工程代码可能遇到的编译问题及其解决思路
    的头像 发表于 07-10 23:15 965次阅读
    【GCC<b class='flag-5'>编译</b>优化系列】实战分析C<b class='flag-5'>代码</b>遇到的<b class='flag-5'>编译</b>问题及解决思路

    使用新的计算引擎 (CE) 代码映像编译仪表代码

    发表于 11-17 12:42 0次下载
    使用新的<b class='flag-5'>计算</b><b class='flag-5'>引擎</b> (<b class='flag-5'>CE</b>) <b class='flag-5'>代码</b>映像<b class='flag-5'>编译</b><b class='flag-5'>仪表</b><b class='flag-5'>代码</b>

    履约核心引擎代码化原理与实践

    基于此,京东供应链研发部自研了一套,面向业务角色的海纳低代码规则引擎平台,产品定位是面向业务、研发多角色一体化的零低代码开发平台,这其中规则引擎是其最核心的部分之一。
    的头像 发表于 04-11 09:55 388次阅读