YTM32Bx MCAL NVR Flash操作Demo
-
YTM32Bx系列的NVR Flash区域可用于存放用户特殊用途的数据,由于其操作的特殊性,故在云途MCAL Fls模块中不支持对NVR Flase的读、写、擦除操作(HCU NVR load key除外)。各个型号NVR区域的详细信息及操作指南,可参考各个型号RM以及《AN_0062_EFM_Application_Note》。
MCAL的工程如何操作NVR Flash
在MCAL工程中,为满足客户操作NVR区域的需求,特编写Fls_Nvr.c/.h文件,用于支持用户操作NVR Flash。如下方压缩包所示:
用户可将上述两个文件添加至工程中,并根据添加的位置修改CMakeList文件,如下所示,下图示例中将上述文件添加至App/Fls_NvrDriver,并修改工程的CMakeList。

NVR Flash操作注意事项
与MCAL Fls模块资源冲突问题
由于Fls 模块与NVR Flash操作均需使用EFM模块,因此在调用NVR Flash操作API时,应尽量避免与Fls模块的操作同时工作的问题。虽然在NVR Flash的API中判断了Fls模块是否处于BUSY状态有判断,但是Fls无法判断NVR Flash API是否正在被调用,因此如果两者同时操作EFM,容易导致操作失败。故在使用上需规避二者同时操作EFM。
CUS NVR注意事项
向CUS NVR中指定位置写入数据可修改MCU的CUS KEY,可修改Flash写保护寄存器初始值,可开关MCU debug功能等,因此CUS NVR区域的写入操作需谨慎执行。各个型号CUS NVR功能及地址映射关系详见《AN_0062_EFM_Application_Note》。在测试CUS NVR写入时,需注意:
-
CUS KEY
YTM32B1MD1、YTM32B1MD2、YTM32B1MC0、YTM32B1ME1、YTM32B1HA0的CUS KEY均可通过向CUS NVR中的0-7字节写入数据来更改。因此若用户需要CUS KEY, 可向CUS NVR前8字节中24bit key以及0x5A5A5A5A。修改CUS KEY后,MCU默认的KEY失效,用户需自行记录更新后的KEY,并在每次调用相关接口时使用更新后的KEY,若KEY遗失,则CUS NVR读、写、擦除操作,HCU NVR擦除均无法再执行。
-
Debug使能及禁用
通过向CUS NVR指定位置写入0x5A5A5A5A,0x5A5A5A5A,可实现MCU debug功能禁用,debug功能禁用后,只能通过擦除CUS NVR中指定位置写入的值,才能再次启用MCU debug功能。因此在禁用MCU debug功能前,请确保CUS NVR擦除代码可被有效调用。
-
YTM32B1HA0 CUS NVR注意事项
YTM32B1HA0 CUS NVR的写入的最小长度为32字节,但是在disable debug或修改cus key时,其需要写入的数据长度仅为8字节。如下图所示:

因此应用程序在执行上述功能时,为了不影响其他位置的数据,需要先读取CUS NVR中的数据,在读取结果的基础上修改对应位置的数据,最后再写入到CUS NVR中。
如下所示代码为CUS NVR中禁用debug功能所示代码,代码中为不影响cus key及EFM PROT0/1初始值,先读取CUS NVR 0-32字节中的数据,然后修改8-15字节中的数据,然后擦除CUS NVR,并将数据再次写入到CUS NVR中。此示例中由于调用了Fls 擦除,因此对于32字节之后的数据,客户应视情况而定是否需要再次写入。/*Disable Jlink or SWD debug when SW1 is pressed*/ if(TRUE == Fls_CurNvrDebugDisEn) { /*read data*/ TestResult = Fls_ReadCusNvr(0x10000000, Fls_ReadData, 32,Fls_TestCusKey); while(FLASH_E_OK != TestResult) { __asm("NOP"); } /*Clear the register init value in customer nvr*/ TestResult = Fls_EraseCusNvr(0x4dff32); while(FLASH_E_OK != TestResult) { __asm("NOP"); } for(LoopCnt = 0;LoopCnt < 32;LoopCnt++) { Fls_WriteData[LoopCnt] = Fls_ReadData[LoopCnt]; } *((uint32 *)&Fls_WriteData[8]) = 0x5A5A5A5A; *((uint32 *)&Fls_WriteData[12]) = 0x5A5A5A5A; TestResult = Fls_WriteCusNvr(0x10000000, Fls_WriteData, 32,0x4dff32); if(FLASH_E_OK == TestResult) { /*test code nothing to do*/ } else { /*test code nothing to do*/ } Fls_CurNvrDebugDisEn = FALSE; }OTP NVR注意事项
OTP NVR的最末尾8字节(YTM32B1HA01为最末尾32字节)为OTA使用,用户禁止写入。
各个型号NVR Flash操作Demo
各个型号Demo工程如下所示:
- YTM32B1HA0
Fls_HA0NvrDemo.zip - YTM32B1MC0
Fls_MC0NvrDemo.zip - YTM32B1MD1
Fls_MD1NvrDemo.zip - YTM32B1MD2
Fls_MD2NvrDemo.zip - YTM32B1ME0
Fls_ME0NvrDemo.zip - YTM32B1ME1
Fls_ME1NvrDemo.zip
-
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...