FSL_TICS_ZJJ 发表于 2014-9-18 17:34:27

【经验分享】如何在CW中使用OPENSDA实现烧录时flash数据保护

【经验分享】如何在CW中使用OPENSDA实现烧录时flash数据保护
一,经验分享简介
      在实际使用Codewarrior编译器下载程序的时候,大家有时候可能希望不要将芯片整个flash都擦除掉,而可以保留一部分flash里面的数据,比如以KL25为例,将flash高地址部分,也就是非程序所在的flash区域作为模拟的EEPROM使用,之前模拟EEPROM区域已经有些数据,但是实际需要,需要更新程序,所以这个时候就希望在下载程序的时候,将模拟EEPROM区域保护起来,不被擦除掉。那么如何才能实现这样的功能呢,如果使用OPENSDA方式下载,而且默认配置的话,通常都会把flash都擦掉,所以本经验分享就教大家如何实现使用CW以及opensda下载方式时,部分flash保护的功能。

二,OPENSDA下烧录flash数据保护设置
   其实在CW的opensda界面中,有一个高级设置选项可以供大家选择所要保护的flash区域,一共有三块区域可以实现保护。下面讲解如何实现配置。
这里以FRDM-KL25开发板为例,IDE采用CW10.6,下载接口采用OPENSDA方式。
本次例程在一个flash控制读写的例程中实现,首先打开flash工程,然后按照如下步骤设置:
1:进入debug configuration

图1
2:点击connection中的edit按钮

图2
3 ,点击高级编程选项

图3
4:设置要包含区域
在高级选项的右上角有关于需要保护区域的设置,由于本例程是对flash的0x0001_f000地址开始写数据,所以这里保护的flash范围就设置为0x0001_f000到flash的最高地址0x0001_ffff。

图4
按照上图的设置,点击Done,即可完成相关flash地址的下载保护。
其实在CW的help中有关于Non-Volatile memory preservation的详细讲解。

图5
即每次下载的时候,都会读出保护区域的数据,然后重新编程进去,从而实现这些区域数据的保护。
三,结果测试
      首先说一下程序的基本功能,本次程序KL25_FLASHLDD,是在CW10.6的PE上面做的,使用FLASH_LDD模块实现对flash地址0x0001F000以上写入“Hello world”。测试分为三步走,第一步,不加保护下载程序,查看flash,并执行代码,使得0x0001F000以上地址写入数据。第二步,退出debug,不加保护下载程序,查看flash,看看0x0001F000地址是否有之前的数据,然后执行代码。第三步,加保护下载程序,查看flash。
当然,在测试之前,我们要保证,我们的代码大小并没有超过地址0x0001F000。现在我们来查看下代码大小,进入project->properties.
然后配置如下:

图6
然后点击apply,并且编译,即可生成代码大小:

图7
可以看到,总大小0x2148并没有超过0x0001F000,下面通过下载来验证结果。
1: 程序功能测试,非保护设置
(1)下载程序后查看0x0001F000

图8
可以看到这个时候,0x0001F000地址之后没有数据。

(2)运行代码后停止,查看0x0001F000

图9
可以看到,这个时候数据已经写进去了。退出debug。
2: 重新下载程序,非保护设置,并运行

图10
可以看到数据并没有保存,而是被刷掉了,所以运行在此写入数据,并退出。

3: 重新下载程序,保护设置
程序下载之后,发现如下,数据还是存在,说明保护成功。

图11
综上,通过设置高级配置,地址段保护,即可以实现具体flash地址段数据的下载保护。

四,附件
附件给出相关测试代码以及文档。






FSL_TICS_ZJJ 发表于 2014-9-18 17:34:56

不足之处,恳请指正,同时也欢迎大家分享自己的宝贵经验。

jiang887786 发表于 2014-10-23 17:23:09

好贴谢谢分享,学习了。今天一直在围着OPENSDA转,

fengyunyu 发表于 2014-10-23 20:01:13

使用keil的话,如果用jlink烧录hex文件的话,只会擦除hex中使用的区域。
页: [1]
查看完整版本: 【经验分享】如何在CW中使用OPENSDA实现烧录时flash数据保护