Microchip
直播中

宫昊

7年用户 237经验值
私信 关注
[问答]

如何从主应用程序读取启动闪存?

您好,我使用的是PIC32MZ2048EFH064、MPLABx V3.40、HARMony V2.01b、XC32 V1.42。我试图是这样的:-我正在编写设备序列号,同时使用SQTP文件编写引导程序,SQTP文件正在引导闪存位置0x1FC72000上编写。-我正在读回下载的十六进制文件,我是一个十六进制文件。能看到我在上面位置上写的序列号。(意思是写被正确地遍历)-现在,我使用带有Flash触发操作的引导加载程序(使用不同地址的flash触发器)下载了应用程序固件。-现在,我必须从Applica中的引导flash中读取序列号主程序。-为此,我试过memcpy,它不工作。我在Boot flash中写序列号的目的是:-序列号对于每个设备都是唯一的,所以在下载引导程序时也写序列号。-其次,在更新固件时,程序闪存被完全擦除,因此我不能写序列号。-换句话说,如果我在引导加载器固件中保护程序内存的某些区域,并且防止固件更新时擦除。这样我可以在那个地方存储序列号。-但是我也有很多启动闪存,所以我想我应该用它来存储序列号。但是,我不能从我的应用程序主程序中读取启动闪存。如果我试着阅读,它会在那里出现。希望我能找到一个很好的解决方案。

回帖(9)

史娟

2019-11-5 09:09:42
您好,Ravic,您正在使用的MCU已经内置了唯一的“序列号”。1)DEVSN0和DEVSN1寄存器包含设备的唯一序列号。2)您还具有以太网MAC站地址:EMAC1SA0EMAC1SA1EMAC1SA2这些选项可能比SQTP更容易管理,但它都取决于根据您的要求。我只是想向您呈现这些惟一性选项,以防您没有意识到。最好的祝贺,KenEdit:P.S。上面的两个选项也不能被删除,但是选项2可以通过编程方式更改,所以如果您想使用MAC站地址实现惟一性,那么您就需要这样做在引导加载程序或应用程序有机会修改它们之前(假设站点地址需要更改)读取它(并在本地缓存它)。
举报

史娟

2019-11-5 09:14:44
嗨,Ravic,要读取引导闪存(BFM)闪存地址——取消引用指向BFM中KSEG1(不可高速缓存)虚拟地址的指针。以下是读取程序闪存地址(PFM)的示例(对于BFM,使用BFM虚拟地址):我希望这有帮助。
举报

张珊珊

2019-11-5 09:31:22
嗨,肯,真是太好了!所以,我的物理内存地址是0x1FC72000。因此,为了从那个地址读取数据,我必须在应用程序中使用它的虚拟地址(0x9FC72000)吗?所以,我的代码是
举报

史娟

2019-11-5 09:44:17
您好,Ravic,如果包含“sys/kmem.h”,可以使用XC32标准宏进行虚拟/物理和物理/虚拟地址转换。只需要注意您想要转换和/或访问什么KSEGx。示例:PA_TO_KVA1()是从物理地址到KSEG1虚拟地址的转换。以下是一个示例:因此,对于您的情况,您可以将#define保留为物理地址,并使用XC32宏来转换物理地址to根据需要动态虚拟地址:当我得知那些宏时,我发现它们非常有用/很有用。是的,你是对的。从数据表:4.1存储器布局32 MZ EF微控制器实现两种地址方案:虚拟和物理。所有的硬件资源,如程序存储器、数据存储器和外围设备,都位于它们各自的物理地址。CPU专用地使用虚拟地址来获取和执行指令以及访问外围设备。物理地址由总线主外围设备使用,例如DMA和Flash控制器,它们独立于CPU访问存储器。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分