本帖最后由 小恩GG 于 2021-1-25 16:52 编辑
【经验分享】RT1020 SDK safety flash测试注意事项 一 文档描述
最近有网友在调试官方的RT1020 SDK safety_iec60730b工程的时候遇到了一些问题,工程路径如下: SDK_2.9.0_EVK-MIMXRT1020\boards\evkmimxrt1020\demo_apps\safety_iec60730b
主要问题是MCUXPresso 工程中,FLASH TEST的功能运行问题,纵然已经参考了SDK配套的文档:IEC60730B_Example_User_Guide_IMXrt_v4_1.pdf
由于SDK不同版本,对于这个工程,以及freemaster的文件都有所区别,问题表现在老SDK版本freemaster IEC60730B_safety_flash.pmp报错,下载使能Flash Test功能的代码之后,不能使用串口连接freemaster,CRC运行不正确,使用P&E Multilink不能成功下载运行带有flash test功能的代码等等。
所以这里以SDK2.9.0为例,说明如何正确去运行safety_iec60730b工程的flash test功能。
二. 测试注意点
safety_iec60730b工程Flash Test,即IEC60730B_Example_User_Guide_IMXrt_v4_1.pdf 文档所提到的Invariable memory test功能,user guide可以在SDK单独文档包如下路径找到:
SDK_2.9.0_EVK-MIMXRT1020_doc\docs\safety
Invariable memory也就是Flash Test,提供特定区域的内存CRC的检查,下载代码中计算好特地内存区域的CRC值并放在指定flash地址,然后在Flash Test工程运行的时候,实时计算对应块的flash crc值,并与之前存储CRC值比较防止flash代码在运行中出错,同时也将测试的数据上传到freemaster文件中予以显示,通信接口是MIMXRT1020-EVK板载虚拟串口。
下面讲解具体操作步骤:
打开safety_config.h
配置这个为0的目的是关闭出错的时候死循环在SafetyErrorHandling()函数中,这个问题会导致一部分客户刚开始不知道,下载的代码直接是不带有CRC的flash test工程,这样会导致代码直接死机在SafetyErrorHandling()函数中,从而导致另外一个问题,freemaster IEC60730B_safety_flash.pmp连接失败,如下图:
图1
看下SafetyErrorHandling函数情况:
- void SafetyErrorHandling(safety_common_t *psSafetyCommon)
- {
- *SAFETY_ERROR_CODE = psSafetyCommon->safetyErrors;
- test_end();
- #if SAFETY_ERROR_ACTION
- __asm("CPSID i"); /* disable interrupts */
- while(1);
- #endif
- }
复制代码
可以看到,一旦FLASH Test出错,而且SAFETY_ERROR_ACTION为1的情况下,会导致死循环。而默认的代码是使能SAFETY_ERROR_ACTION的,所以,我们在刚开始关闭SAFETY_ERROR_ACTION ,防止后续freemaster连接出错,至少能够用.pmp查看具体通信数据。
2. 如果需要使用外部的仿真器,如P&E Multilink
断开MIMXRT1020-EVK板 J27,J28,也是断开板载仿真器,连接P&E Mulitlink的JTAG接口到MIMXRT1020-EVK开发板的J16。如下图:
图2
3. 具体操作步骤
1) 编译工程,检查工程evkmimxrt1020_safety_iec60730b\Debug可以看到文件:evkmimxrt1020_safety_iec60730b_crc.hex,这个文件就是带有crc的app文件,需要实际下载到工程中去的,而不是单独生成的不带CRC的文件。也可以检查工程build result,可以发现如下信息:
- make --no-print-directory post-build
- Performing post-build steps
- arm-none-eabi-objcopy -v -O ihex "evkmimxrt1020_safety_iec60730b.axf" "evkmimxrt1020_safety_iec60730b.hex"; C:/KerryPC/IMXRTCode/Question/RT1020/safety/iec60730b/new/evkmimxrt1020_safety_iec60730b/linker/crc_hex.bat -..\\Debug\\evkmimxrt1020_safety_iec60730b.hex -..\\Debug\\evkmimxrt1020_safety_iec60730b_crc.hex -..\\tools\\srecord\\srec_cat -CRC32
- copy from `evkmimxrt1020_safety_iec60730b.axf' [elf32-littlearm] to evkmimxrt1020_safety_iec60730b.hex' [ihex]
- #----------------------------------
- # CRC CALCULATOR V1.2
- #----------------------------------
- #
- # Getting CRC information:
- # -------------------------------
- # CRC table found at: 0x6000AA00
- # Safety FLASH start: 0x60000000
- # Safety FLASH end: 0x6000A870
- #
- # Calculating new CRC value:
- # -------------------------------
- # CRC-32 value: 0xF67D1116
- #
- # Saving new CRC value:
- # -------------------------------
- # CRC written at 0x6000AA0A
复制代码
可以看到,CRC写在地址0x6000AA0A,CRC的值为0xF67D1116,打开生成好的evkmimxrt1020_safety_iec60730b_crc.hex,可以发现地址0x6000AA0A的值正是0xF67D1116.如下
图3
生成evkmimxrt1020_safety_iec60730b PE Debug.launch,双击打开
修改如下地方为:${workspace_loc:\evkmimxrt1020_safety_iec60730b\Debug\evkmimxrt1020_safety_iec60730b_crc.hex}
图4
这个是经过测试可以工作的,当然如果使用CMSIS DAP板载仿真器,可以直接参考文档里面的图12.
这里会使得客户在下载的时候,直接下载带有CRC的代码,当然,由于下载的直接是.hex,所以会导致进入debug不能直接跑到C代码,而是在对于hex的汇编代码,如果客户要debug,建议下载之后,再勾选下面的attach选项。
这里需要注意的是,如果flash test打开,并且debug,当使用断点的时候,会改变计算的CRC值,而导致CRC结果出错。所以可以烧进芯片,直接运行,查看freemaster的相关变量结果。
2) evkmimxrt1020_safety_iec60730b\GUI\safety.pmp
如果直接参考user guide的文档,客户将会不能成功通信,这里两点需要注意: MAPfiles:..\Debug\evkmimxrt1020_safety_iec60730b.axf
ComRS232: COM number, and 19200 bps.
客户在添加了MAPfile为编译后的MCUXPresso的.axf后,还会遇到如下这个问题:
图5
这几个变量无需关心,直接continue即可,因为我们的SDK.pmp不仅仅是用于RT,还用于kinetis其他产品,所以这些报错的变量是用于其他NXP产品的,RT可以忽略这个问题。
下载代码之后,按下reset按键,freemaster运行起来,可以查到如下结果:
图6
可以看到,测试的flashCRC值和烧进去计算好的CRC值一致,可以运行通过。
另外,如果有网友使用SDK2.9.0之前的SDK版本,那么会存在.pmp运行的问题,可以使用附件中的老版本.pmp。
【经验分享】RT1020 SDK safety flash测试注意事项.pdf
(701.77 KB, 下载次数: 8)
|