【博文连载】《答疑解惑》之CodeWarrior 5.x应用工程下载调试过程详解以及如何保护NVM存储器不被擦除
引言
在进行基于MCU的嵌入式应用程序开发的过程中,我们经常遇到需要将某段代码或者数据保护起来,避免在应用工程下载调试的过程中将其破坏(擦除),典型如下:
①开发bootloader时,bootloader和APP时两个独立的应用工程,都可以独立下载和调试,但联合调试时,就需要保护bootloader或者APP的代码不被擦除,以debug跳转和参数传递过程中的疑难问题;
②应用工程中包含标定数据时,希望保留标定数据的情况下更新应用程序代码并进行调试;这些标定数据可能位于MCU的EEPROM、P-Flash/C-Flash或者D-Flash等NVM(非易失性存储器)中;
而绝大多数MCU的软件开发工具链默认都是在下载调试过程中,将全部MCU的NVM存储器擦除重新编程的,无论用户要下载调试的代码是否占用该NVM存储器区域。
基于以上原因,很多读者问我们这方面的问题,在此,我以目前市面上应用最广的Freescale 16-bit汽车级MCU--S12G系列为例,介绍使用CodeWarrior 5.x IDE,如何在下载调试其应用程序时保护特定地址范围的NVM存储器不被擦除;
S12(X)系列MCU的CodeWarrior 5.x应用工程下载调试过程详解
S12(X)系列MCU的CodeWarrior 5.x应用工程下载调试过程将完成以下操作:
①通过调试器(Debugger, 比如U-Multink/FX, Cyclone, OSBDM等)与目标MCU建立BDM调试通信连接(检查目标MCU是否上电-->复位MCU-->发送BDM握手和同步连接请求指令,并等待确认(ACK)以建立BDM通信和调试连接),让目标MCU进入BDM调试模式:
单线串行背景调试模式(BDM-Background Debug Mode)调试协议被广泛使用在Freescale的S08、S12(X)和MagniV S12Z系列汽车级MCU中,其在MCU中使用的BDC(Background Debug Controller)模块框图和协议命令结构如下:
BDM调试协议使用单线--BKGD传输逻辑1和逻辑0的顺序图如下:
②加载目标MCU的NVM编程算法文件到目标MCU的RAM中;
③擦除目标MCU的全部NVM存储器,包括EEPROM和Flash,这时,用户可以看到下载过程中弹出的如下提示窗口,用户只能选择OK,才能继续调试:
④将应用工程编译结果(数据和代码)编程/下载到目标MCU的NVM存储器中,调试过程中使用的是.abs文件而不是S19文件,因为.abs文件中包含了需要编程的数据和代码(与burner提取生成的S19文件内容一致),调试软件(Hiwave)能够解析.abs文件,并提取其中需要编程的数据和代码;
⑤加载.abs文件中的应用工程调试信息,MCU外设寄存器信息以及调试窗口,进入hiwave调试软件界面,并停留在main()函数第一行代码:
这个过程还会加载运行很多的.cmd控制脚本,但默认都是空的,未做任何输入:
在应用工程下载调试过程中要保护特定的NVM存储器空间不被擦除需要以下两个步骤,具体以S12G64为例进行介绍。
第一步、找到目标MCU的下载控制脚本文件
通过Hiwave调试软件的Command目录窗口记录,可以查到目标MCU下载时使用的控制脚本文件(*.fpp);
本例中,S12G64对应的控制脚本文件为mcu01C4.fpp:
C:\Program Files (x86)\Freescale\CWS12v5.2\prog\FPP\mcu01C4.fpp
第二步、修改下载控制脚本文件
打开CodeWarrior 5.x安装目录下的下控制脚本文件如下,可以看到其中默认是擦除所以片上NVM存储器的:
对应本例中的S12G64来说,其使用的NVM存储器编程算法文件为S12FTMRG_common.fpp,通过NVMIF2 命令指定目标MCU为MC9S12G64_V0_5:
NVMIF2 MC9S12G64_V0_5 0x1C4 "S12FTMRG_common.fpp"
下载过程占用的S12G64 SRAM地址空间(WORKSPACE )为0x3000~0x3FFF(长度0x1000,4KB):
WORKSPACE 0x3000 0x1000 3 8
接收调试器发送来的编程数据和代码的缓存(DATABUFFER )空间为:0x3500~0x3FFF:
DATABUFFER 0x3500 0x3FFF
S12G64可擦除的NVM资源包括:
① 0x400~0xBFF的4KB EEPROM:
MODULEIMPORT DFLASH_12G_FTMRG MODULEREMAP 0x000400 0x000BFF
② PAGE C 对应的未分页区P-Flash(0x000C00~0x002FFF):
MODULEIMPORT PFLASH_12G_FTMRG MODULEREMAP 0x000C00 0x002FFF
③ PAGE D/E/F 对应的未分页区P-Flash(0x004000~0x00FFFF):
MODULEIMPORT PFLASH_12G_FTMRG MODULEREMAP 0x004000 0x00FFFF
④ PAGE C~F 对应的分页区P-Flash(0x0C8000~0x0FBFFF):
MODULEIMPORT PFLASH_12G_FTMRG MODULEREMAP 0x0C8000 0x0FBFFF
Tips: 将要保护的NVM存储器从该文件中使用“//”注释掉或者直接删除即可避免其在下载调试的过程中被擦除。
测试与验证
为了验证是否可以实现保护功能,新建一个S12G64的应用工程,并在其EEPROM的最开始地址(0x400)定义16个字节的常数作为保护对象:
将其编译下载后,在Hiwave调试界面的Memory窗口中,可以看到相应的数据被正确的编程到了相应的地址:
然后, 修改源代码,将EEPROM中的16字节常量数据定义注释掉:
并修改mcu01C4.fpp,使用“//”将擦除EEPROM的控制行脚本注释掉或者直接将其删除:
//MODULEIMPORT DFLASH_12G_FTMRG MODULEREMAP 0x000410 0x000BFF
然后,再重新下载调试该应用工程,可以看到0x400开始的16个字节的EEPROM数据被成功保留了,没有被擦除:
总结
本文介绍的修改Hiwave下载控制脚本.fpp文件的方法,可以有效地保护S12(X)系列MCU特定的NVM存储器在下载调试的过程中不被擦除,但使用时需要注意以下事项:
①当前下载调试的应用工程,不能包含/使用要保护的NVM存储器地址空间,否则会导致下载失败而无法进入调试;
② 此方法不支持对特性对NVM按其最小擦除单元--sector进行保护;
③Hiwave下载控制脚本.fpp文件的修改对所有使用该文件的目标MCU的应用工程都有效,所以,在完成某一应用工程的开发后,需要将相应的Hiwave下载控制脚本.fpp文件恢复默认配置,以免影响其他应用工程的下载和调试。