搜索
bottom↓
回复: 7

【经验分享】c90TFS_FTFX flash标准软件驱动简介

[复制链接]

出0入0汤圆

发表于 2014-9-29 08:46:30 | 显示全部楼层 |阅读模式
c90TFS_FTFX flash标准软件驱动简介
       C90TFS_FTFX flash 标准软件驱动是包含了一系列的API函数,可以通过调用这些函数,实现flash内存的操作。该软件驱动提供的函数可以实现MCU高速的编程擦写操作。C90TFSflash驱动保护了kinetis和coldfire+系列芯片的flash代码。驱动具有调用方便,函数易读性强,支持的器件类型多等特点。本文主要讲解这个软件驱动的下载情况,驱动构架,API函数构成等情况,便于大家直接使用SSD来实现kinetis芯片的flash控制。
一, C90TFS_FTFX flash驱动的下载情况
该软件驱动下载,可以到官网的如下路径下载:
飞思卡尔官网(www.freescale.com)->软件和工具->软件中心->中间件:
TFS Flash Driver Software for Kinetis and ColdFire+ Microcontrollers:
http://cache.freescale.com/files ... xe?fromsite=zh-Hans
二,C90TFS_FTFX flash 驱动支持的器件情况
目前C90TFS_FTFX flash 驱动支持支持kinetis的K系列,L系列,M系列以及Coldfire 等系列。现有的参考例程情况在按照驱动之后,可以在默认路径:C:\Program Files\Freescale\Standard Sotfware Driver v101\C90TFS\Demos\build
找到,具体如下:

如果没有的例程,也可以通过修改现有的例程实现代码的移植。
三,flash驱动配置定义讲解
1, 配置参数
配置参数使用结构体定义的方式,包含了芯片FLASH模块的基地址,程序flash大小以及地址,Dflash大小及地址,EEPROM大小及地址,debug使能以及回调。
typedef struct _ssd_config
{
UINT32 ftfxRegBase;
UINT32 PFlashBlockBase;
UINT32 PFlashBlockSize;
UINT32 DFlashBlockBase;
UINT32 DFlashBlockSize;
UINT32 EERAMBlockBase;
UINT32 EEEBlockSize;
BOOL DebugEnable;
PCALLBACK CallBack;
} FLASH_SSD_CONFIG, *PFLASH_SSD_CONFIG;
其中:
ftfxRegBase,UINT32 , flash模块基地址
PFlashBlockBase ,UINT32,Pflash块的基地址
PFlashBlockSize,UINT32,Pflash块的大小
DFlashBlockBase,UINT32,FlexNVM区中划分为Dflash的基地址。无FlexNVM则无用
DFlashBlockSize,UINT32,FlexNVM区中划分为Dflash的块大小
EERAMBlockBase,UINT32,flexRAM的基地址。
EEEBlockSize,UINT32,EEPROM的大小(flexRAM)中
DebugEnable,BOOL,后台调试模式,TRUE:使能调试模式;FALSE:禁止调试模式
CallBack,函数指针,回调函数用于时间要求高的事件

2:配置宏定义
在驱动中,是通过user_cfg.h宏定义来查看芯片的类型,内存情况。通常使用如下结构:
FTFx_AA_BB_CC_DD_EE_FF
其中,AA:MCU类型
BB:程序flash块大小
CC:FlexNVM块大小
DD:FlexRam或加速RAM大小
EE:程序flash段大小
FF:Dflash段大小。
这里举个例子, 以MKL25Z128为例。
它的定义就是:FTFx_LX_128K_0K_0K_1K_0K ,Pflash有128K,Pflash每个sector大小为1KB,共128个扇区

3,flash中断宏定义
有两个宏定义,分别为设置flash中断使能宏定义以及获取中断使能状态宏定义
SET_FLASH_INT_BITS(ftfxRegBase, value):设置flash中断使能宏定义
GET_FLASH_INT_BITS(ftfxRegBase): 获取中断使能状态宏定义
实际定义情况如下:
#define SET_FLASH_INT_BITS(ftfxRegBase, value)  REG_WRITE((ftfxRegBase) + FTFx_SSD_FCNFG_OFFSET,\                                            ((value)&(FTFx_SSD_FCNFG_CCIE | FTFx_SSD_FCNFG_RDCOLLIE)))

#define GET_FLASH_INT_BITS(ftfxRegBase)         REG_READ((ftfxRegBase) + FTFx_SSD_FCNFG_OFFSET) &\                                                (FTFx_SSD_FCNFG_CCIE | FTFx_SSD_FCNFG_RDCOLLIE)

4,返回值的定义

实际使用中,调用函数会有返回值来反映函数执行的情况,下面讲解具体各返回值的意思。
名称                                         值                                              作用
FTFx_OK         0x0000         函数执行成功
FTFx_ERR_MGSTAT0         0x0001         FSTAT 寄存器中MGSTAT0 位置位
FTFx_ERR_PVIOL         0x0010         FSTAT 寄存器中保护破坏
FTFx_ERR_ACCERR         0x0020         FSTAT 寄存器中进入错误置位
FTFx_ERR_CHANGEPR         0x0100         不能改变保护状态.
FTFx_ERR_EFLASHONL        0x0400         EEPROM备份满
FTFx_ERR_RAMRDY         0x0800         编程快速RAM不可用
FTFx_ERR_RANGE         0x1000         地址越界
FTFx_ERR_SIZE         0x2000         大小偏差

四,flash驱动API函数讲解
1 flash初始化函数
UINT32 FlashInit (PFLASH_SSD_CONFIG PSSDConfig);
Flash初始化,不可在低功耗下使用。
2:flash保护相关函数
(1)PFlashGetProtection()
UINT32 PFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32* protectStatus)
用于获取Pflash的保护情况。
(2)PFlashSetProtection()
UINT32 PFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32 protectStatus)
用于设置Pflash的保护情况。
(3)DFlashGetProtection()
UINT32 DFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus)
用于Dflash保护情况的获取
(4)DFlashSetProtection()
UINT32 DFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus)
用于获取Dflash的保护情况。
(5)EERAMGetProtection()
UINT32 EERAMGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus)
获取flexRAM中EEPROM的保护情况。
(6)EERAMSetProtection()
UINT32 EERAMSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus)
设置FlexRAM中EEPROM的保护。
3:flash加密相关函数
(1)FlashGetSecurityState()
UINT32 FlashGetSecurityState (PFLASH_SSD_CONFIG PSSDConfig, UINT8* securityState)
获取flash加密的状态,包括加密使能以及后门密钥使能状态。
(2)FlashSecurityBypass()
UINT32 FlashSecurityBypass (PFLASH_SSD_CONFIG PSSDConfig, UINT8* keyBuffer, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
使用后门密钥解密函数。
4:flash擦除相关函数
(1)FlashEraseAllBlock()
UINT32 FlashEraseAllBlock (PFLASH_SSD_CONFIG PSSDConfig, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
擦除所有flash内存,初始化flexRAM,验证内存内容然后解密MCU。
(2)FlashEraseBlock()
UINT32 FlashEraseBlock (PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
擦除指定的Pflash或者Dflash的块
(3)FlashEraseSector()
UINT32 FlashEraseSector(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, \pFLASHCOMMANDSEQUENCE FlashCommandSequence)
擦除一个或者多个Pflash或者Dflash的段

(4)FlashEraseSuspend()
UINT32 FlashEraseSuspend (PFLASH_SSD_CONFIG PSSDConfig)
挂起当前flash擦除动作

(5)FlashEraseResume()
UINT32 FlashEraseResume (PFLASH_SSD_CONFIG PSSDConfig)
重新开始之前挂起的flash擦除动作

5:flash编程相关函数
(1)FlashProgramSection()
UINT32 FlashProgramSection (PFLASH_SSD_CONFIG PSSDConfig,UINT32 destination, UINT16 Number, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
将段编程缓冲中的数据编程到指定的flash地址。

(2)FlashProgram ()
UINT32 FlashProgram(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, \
UINT8* pData, pFLASHCOMMANDSEQUENCE FlashCommandSequence)
编程4个连续字节,或者8个连续字节到Pflash或者Dflash块中

(3)FlashReadResource()
UINT32 FlashReadResource (PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
UINT8* pDataArray,pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于从特定内存(PflashIFR,swap IFR,Dflash IFR或者版本号)中读取数据
6:flash验证相关函数
(1)FlashCheckSum()
UINT32 FlashCheckSum (PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, UINT32* pSum)
用于验证数据的完整性

(2)FlashVerifyAllBlock()
UINT32 FlashVerifyAllBlock (PFLASH_SSD_CONFIG PSSDConfig, UINT8 marginLevel, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
查看Pflash,Dflash, EEPROM的备份区以及IFR是否到了余量等级

(3)FlashVerifyBlock()
UINT32 FlashVerifyBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT8 marginLevel, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
检查整个Pflash或者Dflash是否被擦除到定义的余量等级,其实类似于查看flash寿命


(4)FlashProgramCheck()
UINT32 FlashProgramCheck (PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
UINT32 size, UINT8* pExpectedData, UINT32* pFailAddr, UINT8 marginLevel, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于测试之前编程的Pflash或者Dflash长字节,查看在特定的余量等级下读取是否正确
7:flash一次编程函数
(1)FlashReadOnce()
UINT32 FlashReadOnce (PFLASH_SSD_CONFIG PSSDConfig, UINT8 recordIndex,\
UINT8* pDataArray, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于读取Pflash中IFR的64个一次编程区域的数据。

(2)FlashProgramOnce()
UINT32 FlashProgramOnce (PFLASH_SSD_CONFIG PSSDConfig, UINT8 recordIndex,\
UINT8* pDataArray, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于编程Pflash中IFR的64个一次编程区域的数据。

8:flash eeprom相关函数
(1)DEFlashPartition()
UINT32 DEFlashPartition (PFLASH_SSD_CONFIG PSSDConfig, UINT8 EEEDataSizeCode, UINT8 DEPartitionCode, pFLASHCOMMANDSEQUENCE FlashCommandSequence)

用于EEPROM时的flash分区,包括FlexRAM中多少作为EERPOM, flexNVM中多少作为Dflash以及EEPROM的备份区。

(2)SetEEEEnable()
UINT32 SetEEEEnable (PFLASH_SSD_CONFIG PSSDConfig, UINT8 EEEEnable)

在设置了flexRAM为EEPROM的前提下,转换flexRAM为普通RAM可用的功能。

(3)EEEWrite()
UINT32 EEEWrite (PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, \
UINT8* pData)
用于写入数据到EEPROM,即写到flexRam以及FlexNVM中EEPROM的备份区。

9:flash swap相关函数
(1)PFlashSwapCtl ()
UINT32 PFlashSwapCtl(PFLASH_SSD_CONFIG pSSDConfig,
UINT32 addr,
UINT8 swapcmd,
UINT8* pCurrentSwapMode,
UINT8* pCurrentSwapBlockStatus,
UINT8* pNextSwapBlockStatus,
pFLASHCOMMANDSEQUENCE pFlashCommandSequence)

用于swap命令的控制

(2)PFlashSwap()
UINT32 PFlashSwap(PFLASH_SSD_CONFIG PSSDConfig, \
UINT32 flashAddress, \
PFLASH_SWAP_CALLBACK pSwapCallback, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于在两个PFLASH一半flash的块中交互程序

10:flash 重定向相关函数
RelocateFunction()
UINT32 RelocateFunction(UINT32 dest, UINT32 size, UINT32 src)
该函数用于重定向函数到另一个RAM的地址

以上讲解的是最基本的API函数功能,关于具体的意思,请查看驱动中文件FSL_Envm_FTFx_UM.pdf 文档。


四,小结
以上即为本次文档要讲的关于驱动的基本概念以及API函数基本介绍,详情请查看驱动的参考手册。另外,后续配合例程进一步讲解关于flash驱动的内容。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-9-29 08:47:57 | 显示全部楼层
更加详细内容,请参考英文文档FSL_Envm_FTFx_UM.pdf
后续将结合实例进一步讲解该驱动的实际运行情况。

出0入0汤圆

发表于 2014-9-29 09:05:22 | 显示全部楼层
请教:楼主文章中提到了DFlash和PFlash,是指数据存储和程序存储吗?能帮忙讲解一下FSL是怎么区分的呢?是用不同的FLASH,还是同一个Flash划分不同的区域来存储数据和存储啊。

出0入0汤圆

发表于 2014-9-29 11:43:01 | 显示全部楼层
步之道 发表于 2014-9-29 09:05
请教:楼主文章中提到了DFlash和PFlash,是指数据存储和程序存储吗?能帮忙讲解一下FSL是怎么区分的呢?是 ...

官方解释:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-29 12:52:23 | 显示全部楼层

谢谢版主了,我再好好看看,有点混淆了。

出0入0汤圆

 楼主| 发表于 2014-9-29 13:26:01 | 显示全部楼层
步之道 发表于 2014-9-29 12:52
谢谢版主了,我再好好看看,有点混淆了。

这个在芯片的用户手册中都有讲的,程序flash和放数据的flash。

出0入0汤圆

发表于 2014-9-29 13:32:54 | 显示全部楼层
很好的经验分享,大家来学学习一下!

出100入101汤圆

发表于 2014-10-4 23:12:36 | 显示全部楼层
学习。官方能出一个完整的库就更好了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 15:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表