查看: 8033|回复: 7

[分享] [经验分享]c90TFS_FTFX flash标准软件驱动简介

[复制链接]

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-29 08:43:55 | 显示全部楼层 |阅读模式
c90TFS_FTFX flash标准软件驱动简介
       C90TFS_FTFX flash 标准软件驱动是包含了一系列的API函数,可以通过调用这些函数,实现flash内存的操作。该软件驱动提供的函数可以实现MCU高速的编程擦写操作。C90TFSflash驱动保护了kinetiscoldfire+系列芯片的flash代码。驱动具有调用方便,函数易读性强,支持的器件类型多等特点。本文主要讲解这个软件驱动的下载情况,驱动构架,API函数构成等情况,便于大家直接使用SSD来实现kinetis芯片的flash控制。
一, C90TFS_FTFX flash驱动的下载情况
该软件驱动下载,可以到官网的如下路径下载:
飞思卡尔官网(www.freescale.com->软件和工具->软件中心->中间件:
二,C90TFS_FTFX flash 驱动支持的器件情况
目前C90TFS_FTFXflash 驱动支持支持kinetis的K系列,L系列,M系列以及Coldfire 等系列。现有的参考例程情况在按照驱动之后,可以在默认路径:C:\Program Files\Freescale\Standard Sotfware Driverv101\C90TFS\Demos\build
找到,具体如下:
1.jpg
如果没有的例程,也可以通过修改现有的例程实现代码的移植。
三,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;
其中:
ftfxRegBaseUINT32 flash模块基地址
PFlashBlockBase UINT32Pflash块的基地址
PFlashBlockSizeUINT32Pflash块的大小
DFlashBlockBaseUINT32FlexNVM区中划分为Dflash的基地址。无FlexNVM则无用
DFlashBlockSizeUINT32FlexNVM区中划分为Dflash的块大小
EERAMBlockBaseUINT32flexRAM的基地址。
EEEBlockSizeUINT32EEPROM的大小(flexRAM)中
DebugEnableBOOL,后台调试模式,TRUE:使能调试模式;FALSE:禁止调试模式
CallBack,函数指针,回调函数用于时间要求高的事件

2:配置宏定义
在驱动中,是通过user_cfg.h宏定义来查看芯片的类型,内存情况。通常使用如下结构:
FTFx_AA_BB_CC_DD_EE_FF
其中,AAMCU类型
BB:程序flash块大小
CCFlexNVM块大小
DDFlexRam或加速RAM大小
EE:程序flash段大小
FFDflash段大小。
这里举个例子, MKL25Z128为例。
它的定义就是:FTFx_LX_128K_0K_0K_1K_0K,Pflash有128K,Pflash每个sector大小为1KB,共128个扇区
3flash中断宏定义
有两个宏定义,分别为设置flash中断使能宏定义以及获取中断使能状态宏定义
SET_FLASH_INT_BITS(ftfxRegBase,value):设置flash中断使能宏定义
GET_FLASH_INT_BITS(ftfxRegBase):获取中断使能状态宏定义
实际定义情况如下:
#defineSET_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初始化函数
UINT32FlashInit (PFLASH_SSD_CONFIG PSSDConfig)
Flash初始化,不可在低功耗下使用。

2flash保护相关函数
1PFlashGetProtection()
UINT32PFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32* protectStatus)
用于获取Pflash的保护情况。
2PFlashSetProtection()
UINT32PFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32 protectStatus)
用于设置Pflash的保护情况。
3DFlashGetProtection()
UINT32DFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus)
用于Dflash保护情况的获取
4DFlashSetProtection()
UINT32DFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus)
用于获取Dflash的保护情况。
5EERAMGetProtection()
UINT32EERAMGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus)
获取flexRAMEEPROM的保护情况
6EERAMSetProtection()
UINT32EERAMSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus)
设置FlexRAMEEPROM的保护。

3flash加密相关函数
1FlashGetSecurityState()
UINT32FlashGetSecurityState (PFLASH_SSD_CONFIG PSSDConfig, UINT8* securityState)
获取flash加密的状态,包括加密使能以及后门密钥使能状态。
2FlashSecurityBypass()
UINT32 FlashSecurityBypass(PFLASH_SSD_CONFIG PSSDConfig, UINT8* keyBuffer, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
使用后门密钥解密函数。

4flash擦除相关函数
1FlashEraseAllBlock()
UINT32 FlashEraseAllBlock(PFLASH_SSD_CONFIG PSSDConfig, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
擦除所有flash内存,初始化flexRAM,验证内存内容然后解密MCU

2FlashEraseBlock()
UINT32 FlashEraseBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
擦除指定的Pflash或者Dflash的块

3FlashEraseSector()
UINT32FlashEraseSector(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size,\pFLASHCOMMANDSEQUENCE FlashCommandSequence)
擦除一个或者多个Pflash或者Dflash的段
4FlashEraseSuspend()
UINT32 FlashEraseSuspend(PFLASH_SSD_CONFIG PSSDConfig)
挂起当前flash擦除动作
5FlashEraseResume()
UINT32 FlashEraseResume(PFLASH_SSD_CONFIG PSSDConfig)
重新开始之前挂起的flash擦除动作
5flash编程相关函数
1FlashProgramSection()
UINT32 FlashProgramSection(PFLASH_SSD_CONFIG PSSDConfig,UINT32 destination, UINT16 Number, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
将段编程缓冲中的数据编程到指定的flash地址。

2FlashProgram ()
UINT32 FlashProgram(PFLASH_SSD_CONFIGPSSDConfig, UINT32 destination, UINT32 size, \
UINT8* pData, pFLASHCOMMANDSEQUENCEFlashCommandSequence)
编程4个连续字节,或者8个连续字节到Pflash或者Dflash块中
3FlashReadResource()
UINT32 FlashReadResource(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
UINT8*pDataArray,pFLASHCOMMANDSEQUENCE FlashCommandSequence)
用于从特定内存(PflashIFRswap IFR,Dflash IFR或者版本号)中读取数据
6flash验证相关函数
1FlashCheckSum()
UINT32 FlashCheckSum(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, UINT32* pSum)
用于验证数据的完整性
2FlashVerifyAllBlock()
UINT32 FlashVerifyAllBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT8 marginLevel, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
查看PflashDflash EEPROM的备份区以及IFR是否到了余量等级
3FlashVerifyBlock()
UINT32FlashVerifyBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT8marginLevel, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
检查整个Pflash或者Dflash是否被擦除到定义的余量等级,其实类似于查看flash寿命
4FlashProgramCheck()
UINT32 FlashProgramCheck(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \
UINT32 size, UINT8*pExpectedData, UINT32* pFailAddr, UINT8 marginLevel, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
用于测试之前编程的Pflash或者Dflash长字节,查看在特定的余量等级下读取是否正确

7flash一次编程函数
1FlashReadOnce()
UINT32 FlashReadOnce (PFLASH_SSD_CONFIGPSSDConfig, UINT8 recordIndex,\
UINT8* pDataArray, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
用于读取PflashIFR64个一次编程区域的数据。
2FlashProgramOnce()
UINT32 FlashProgramOnce (PFLASH_SSD_CONFIGPSSDConfig, UINT8 recordIndex,\
UINT8* pDataArray, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
用于编程PflashIFR64个一次编程区域的数据。
8flash eeprom相关函数
1DEFlashPartition()
UINT32 DEFlashPartition (PFLASH_SSD_CONFIGPSSDConfig, UINT8 EEEDataSizeCode, UINT8 DEPartitionCode, pFLASHCOMMANDSEQUENCEFlashCommandSequence)
用于EEPROM时的flash分区,包括FlexRAM中多少作为EERPOM flexNVM中多少作为Dflash以及EEPROM的备份区。
2SetEEEEnable()
UINT32 SetEEEEnable(PFLASH_SSD_CONFIG PSSDConfig, UINT8 EEEEnable)
在设置了flexRAMEEPROM的前提下,转换flexRAM为普通RAM可用的功能。
3EEEWrite()
UINT32 EEEWrite(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT32 size, \
UINT8* pData)
用于写入数据到EEPROM,即写到flexRam以及FlexNVMEEPROM的备份区
9flash swap相关函数
1PFlashSwapCtl()
UINT32PFlashSwapCtl(PFLASH_SSD_CONFIG pSSDConfig,
UINT32 addr,
UINT8 swapcmd,
UINT8* pCurrentSwapMode,
UINT8*pCurrentSwapBlockStatus,
UINT8* pNextSwapBlockStatus,
pFLASHCOMMANDSEQUENCEpFlashCommandSequence)
用于swap命令的控制
2PFlashSwap()
UINT32PFlashSwap(PFLASH_SSD_CONFIG PSSDConfig, \
UINT32 flashAddress, \
PFLASH_SWAP_CALLBACKpSwapCallback, \
pFLASHCOMMANDSEQUENCEFlashCommandSequence)
用于在两个PFLASH一半flash的块中交互程序
10flash 重定向相关函数
RelocateFunction()
UINT32 RelocateFunction(UINT32dest, UINT32 size, UINT32 src)
该函数用于重定向函数到另一个RAM的地址
以上讲解的是最基本的API函数功能,关于具体的意思,请查看驱动中文件FSL_Envm_FTFx_UM.pdf 文档。
四,小结
以上即为本次文档要讲的关于驱动的基本概念以及API函数基本介绍,详情请查看驱动的参考手册。另外,后续配合例程进一步讲解关于flash驱动的内容。

c90TFS_FTFX flash标准软件驱动简介.pdf (362.03 KB, 下载次数: 188)
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
 楼主| 发表于 2014-9-29 08:45:29 | 显示全部楼层
更加详细内容,请参考英文文档FSL_Envm_FTFx_UM.pdf
后续将结合实例进一步讲解该驱动的实际运行情况。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-10-8 10:06:40 | 显示全部楼层
很好的经验分享帖,必须支持一下!
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

273

帖子

0

高级会员

Rank: 4

积分
718
最后登录
1970-1-1
发表于 2014-10-14 20:46:54 | 显示全部楼层
谢谢楼主分享,学习一下!
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

7

帖子

0

新手上路

Rank: 1

积分
28
最后登录
2015-5-6
发表于 2015-2-8 10:38:04 | 显示全部楼层
感谢楼主
回复

使用道具 举报

该用户从未签到

0

主题

75

帖子

0

中级会员

Rank: 3Rank: 3

积分
250
最后登录
2019-6-4
发表于 2015-2-10 12:38:17 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

38

帖子

0

中级会员

Rank: 3Rank: 3

积分
225
最后登录
2016-3-4
发表于 2016-1-26 20:28:18 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2018-12-21 09:20
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    6

    主题

    163

    帖子

    1

    高级会员

    Rank: 4

    积分
    617
    最后登录
    2021-4-28
    发表于 2020-2-28 15:25:45 | 显示全部楼层
    感谢分享,收下学习。目前正好遇到疑惑
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-8 08:49 , Processed in 0.106193 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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