Flash在线编程构件的使用

基本概念

Flash存储器:掉电后不丢失数据的存储器。

写入器编程模式:利用编程器将程序写入到Flash存储器中的模式。

Flash在线编程模式:通过运行Flash内部程序对Flash其他区域进行擦除与写入的模式。

Flash存储器具有在线编程的功能,因此,可以使用Flash取代电可擦除可编程只读存储器E²PROM,来保存程序运行过程中的一些参数,这些参数,我们希望它掉电后不会丢失。

Flash编程基本操作

擦除:将存储单元的内容由二进制的0变成1。

写入:将存储单位的某位由二进制的1变成0。

擦除操作:以扇区为逻辑单位,即能够擦除的最小单位,大小1KB,128KB的flash有128个扇区,地址范围0x0000_0000到0x0001_FFFF。

写入操作:以字为单位,执行之前确保写入区是空白的。

构件使用方法

为了满足基本flash操作,封装有6个对外接口函数

初始化函数:void flash_init()直接调用,没有入口参数和返回值

擦除函数:unit_8 flash_erase(unit_16 sect) 与写入操作类似,都返回擦除或写入的结果,包括执行正常或执行异常。由于擦除操作的对象是整个扇区,因此入口参数只需要一个扇区号即可。

写入函数:unit_8 flash_write(unit_16 sect,unit_16 offset,unit_16 N,unit _8 *buf) 与写入操作的入口参数较多,除扇区号外,还有扇区内偏移地址、写入字节数、写入数据的缓冲区首地址。

按逻辑地址读取函数:void flash_read_logic(unit_8 *dest,unit_16 sect,unit_16 offset ,unit _16 N) 可以方便的读取指定的扇区号、指定偏移量的内容,因此入口参数包括扇区号和偏移地址,读取长度以及读出数据的存放处。

按物理地址读取函数:void flash_read_physical(unit_8 *dest,unit_32 addr,unit _16 N) 可以直接按照物理地址读取,比如变量、配置域内容等,实际上读操作可以对RAM、Flash及外设映像地址进行,因此入口参数包括读出数据的存放处、目标地址和读出的字节数。

保护操作函数:void flash_protect(unit_8 regionNO)根据KL25的特性,只能容许对整个对齐的区域(4个扇区)进行保护,但对于拥有32个扇区的KL25Z128,允许很大的保护灵活性。入口参数是保护区域号,函数没有返回值。

驱动构件还提供了一个判别一个区域是否为空的函数flash_isempty,即判断该区域是否为全F。这个函数入口参数是所要探测的Flash区域初始地址以及探测范围,函数返回值为判断的结果,空或非空。

Flash保护机制

Flash保护是为了防止某些Flash存储区域受意外擦除、写入的影响。

保护后,被保护的区域无法进行擦除或者写入 操作。

芯片复位后,flash区域的保护状态就会解除,恢复擦除和写入的功能。

对于保护功能而言,Flash存储器被平均分成32个可独立保护的区域,区域号为0~31,每个区域包含4个扇区。

芯片加密

未加密的芯片,表示可以通过调试接口,例如JTAG、SWD、USBDM等,访问芯片内部的存储器。

对于加密芯片,通过外部调试接口只能进行整体擦除操作,而无法执行读取或写入Flash的指令,执行的时候会报“芯片已加密”的错误。

运行MCU内部程序对Flash访问不受影响,考虑到实际应用场景,有一种加密方法:对启动文件startup_MKL25Z4.S中的配置域字段进行改写,把配置域相应位 置位为安全模式或者不安全模式。

在芯片复位的时候,芯片内部机制会自动的将Flash配置域中相应的内容对Flash保护寄存器和Flash安全寄存器进行设置,使Flash设置为对应的状态。

解除安全模式可以采用USBDM等烧入工具,整体擦除芯片,就可以恢复空白片重新使用。

构件设计方法

Flash构件设计,首先从芯片手册中获得模块的编程结构(相关寄存器,包含6种寄存器)

Flash状态寄存器(FTFA_FSTAT):D7位是命令完成中断标志位,用于识别一个flash命令是否完成;通过写1清除该标志位以启动一个新的命令;在命令执行期间该标志位保持为0,命令执行完毕或终止时由存储控制器将其置1。

Flash配置寄存器(FTFA_FCNFG):提供当前关于FTFA模块的功能状态的信息。

Flash安全寄存器(FTFA_FSEC):保留所有跟MCU和FTFA模块相关的位,包括安全密钥、是否允许整体擦除、是否启动安全模式等。

Flash选项寄存器(FTFA_FOPT):MCU通过检测Flash选项寄存器的状态来制定自己的操作;在复位过程中,Flash选项寄存器的值从Flash配置域中载入。

Flash通用命令参数寄存器组(FTFA_FCCOBn;12个):存放12字节的命令码及相关参数,利用该寄存器完成基本的擦除、写入操作。

Flash保护寄存器(FTFA_FPROTn;4个):定义Flash区域的保护状态,即哪一块逻辑Flash区域不能被写入或擦除。

FTFA是KL25/26芯片内部Flash模块的简称。

FTFA命令的操作过程

主要包括载入命令到通用命令参数寄存器组、清CCIF位启动命令、执行命令与报错。

扇区擦除命令主要利用的是通过命令参数寄存器组来存放擦除命令以及擦除地址。

程序Flash的第一个扇区存放了中断向量表和Flash配置字段,因此,不建议在线擦除Flash第一个扇区,也不建议擦除操作码存放的区域。

使用Flash在线编程时,先查看链接文件确定程序在Flash中的存储位置,找出未使用的Flash空间作为可用资源才可以对其进行编程。

写入操作主要利用通用命令参数寄存器组,存放写入命令、写入地址和写入数据值。

在写入命令前,确保写入地址被擦除过。


在封装Flash驱动构件时,主要考虑Flash的基本操作以及构件化封装原则。

Flash具有初始化、擦除和写入、按逻辑地址读取、按物理地址读取、保护六种基本操作,操作封装成六种独立的功能函数。

 操作Flash模块前,需要对flash模块进行初始化,主要是判断等待命令完成。

写入之前必须处于擦除状态,Flash的累积写入可能会得到意想不到的值。

擦除操作模式:擦除块(擦除Flash中所有内容);擦除扇区(确定扇区号,返回擦除状态)

函数过程中主要是利用通用命令参数寄存器组来控制擦除命令、地址范围及擦除数据,擦除数据实际上就是写0xFF的操作。

写入函数与擦除函数类似,写入操作的入口参数较多,包括目标扇区号、写入扇区内部偏移地址、协议字节数目以及数据缓冲器首地址。写入后返回写入状态(正常或者异常)

按照逻辑地址读取操作需要将Flash中指定扇区指定偏移量的指定长度数据读取存放到另一个地址中,方便上层函数调用。

函数需要包括一个目的地址变量作为入口参数,此外还包括扇区号、偏移字节数和读取长度。

按物理地址读取与按逻辑地址读取类似,需要一个目的地址作为拷贝的目的地址,需要给定读取长度作为入口参数,但直接读取只需要一个源地址即可。省去扇区号和偏移地址的计算过程,更为简单。 也便于读取存放在RAM中的全局变量等信息。

保护函数只能允许对整个对齐区域进行保护,也就是相邻的以4的倍数开始的四个扇区进行保护。但是对于拥有32个的KL25Z128,已经允许了很大的保护灵活性。

因此 设计保护函数时,需要确定待保护的区域号作为入口参数,实际保护时程序会对该区域号在内的四个对齐扇区进行保护。


内部函数 

嵌入式技术基础与实践(第4版)

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值