汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

《答疑解惑》之CodeWarrior 5.x应用工程下载调试过程详解以及如何保护NVM存储器不被擦除

0
阅读(930) 评论(0)

《答疑解惑》之S12(X)系列MCU的CodeWarrior 5.x应用工程下载调试过程详解以及如何保护NVM存储器不被擦除

内容提要

引言

S12(X)系列MCU的CodeWarrior 5.x应用工程下载调试过程详解

第一步、找到目标MCU的下载控制脚本文件

第二步、修改下载控制脚本文件

测试与验证

总结


引言


在进行基于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)模块框图和协议命令结构如下:

5.jpg

6.jpg

BDM调试协议使用单线--BKGD传输逻辑1和逻辑0的顺序图如下:

7.jpg

8.jpg

②加载目标MCU的NVM编程算法文件到目标MCU的RAM中;


③擦除目标MCU的全部NVM存储器,包括EEPROM和Flash,这时,用户可以看到下载过程中弹出的如下提示窗口,用户只能选择OK,才能继续调试:

9.jpg


④将应用工程编译结果(数据和代码)编程/下载到目标MCU的NVM存储器中,调试过程中使用的是.abs文件而不是S19文件,因为.abs文件中包含了需要编程的数据和代码(与burner提取生成的S19文件内容一致),调试软件(Hiwave)能够解析.abs文件,并提取其中需要编程的数据和代码;


⑤加载.abs文件中的应用工程调试信息,MCU外设寄存器信息以及调试窗口,进入hiwave调试软件界面,并停留在main()函数第一行代码:

10.jpg

这个过程还会加载运行很多的.cmd控制脚本,但默认都是空的,未做任何输入:

11.jpg

在应用工程下载调试过程中要保护特定的NVM存储器空间不被擦除需要以下两个步骤,具体以S12G64为例进行介绍。


第一步、找到目标MCU的下载控制脚本文件


通过Hiwave调试软件的Command目录窗口记录,可以查到目标MCU下载时使用的控制脚本文件(*.fpp);


本例中,S12G64对应的控制脚本文件为mcu01C4.fpp:

C:\Program Files (x86)\Freescale\CWS12v5.2\prog\FPP\mcu01C4.fpp

12.jpg


第二步、修改下载控制脚本文件


打开CodeWarrior 5.x安装目录下的下控制脚本文件如下,可以看到其中默认是擦除所以片上NVM存储器的:

13.jpg

对应本例中的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个字节的常数作为保护对象:

14.jpg

将其编译下载后,在Hiwave调试界面的Memory窗口中,可以看到相应的数据被正确的编程到了相应的地址:

15.jpg

然后, 修改源代码,将EEPROM中的16字节常量数据定义注释掉:

16.jpg

并修改mcu01C4.fpp,使用“//”将擦除EEPROM的控制行脚本注释掉或者直接将其删除:

//MODULEIMPORT DFLASH_12G_FTMRG MODULEREMAP 0x000410 0x000BFF

17.jpg

然后,再重新下载调试该应用工程,可以看到0x400开始的16个字节的EEPROM数据被成功保留了,没有被擦除:

18.jpg


总结


本文介绍的修改Hiwave下载控制脚本.fpp文件的方法,可以有效地保护S12(X)系列MCU特定的NVM存储器在下载调试的过程中不被擦除,但使用时需要注意以下事项:


①当前下载调试的应用工程,不能包含/使用要保护的NVM存储器地址空间,否则会导致下载失败而无法进入调试;


② 此方法不支持对特性对NVM按其最小擦除单元--sector进行保护;


③Hiwave下载控制脚本.fpp文件的修改对所有使用该文件的目标MCU的应用工程都有效,所以,在完成某一应用工程的开发后,需要将相应的Hiwave下载控制脚本.fpp文件恢复默认配置,以免影响其他应用工程的下载和调试。