c90TFS_FTFX flash标准软件驱动简介 C90TFS_FTFX flash 标准软件驱动是包含了一系列的API函数,可以通过调用这些函数,实现flash内存的操作。该软件驱动提供的函数可以实现MCU高速的编程擦写操作。C90TFSflash驱动保护了kinetis和coldfire+系列芯片的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 找到,具体如下: 如果没有的例程,也可以通过修改现有的例程实现代码的移植。 三,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):获取中断使能状态宏定义 实际定义情况如下: #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初始化,不可在低功耗下使用。
2:flash保护相关函数 (1)PFlashGetProtection() UINT32PFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32* protectStatus) 用于获取Pflash的保护情况。 (2)PFlashSetProtection() UINT32PFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT32 protectStatus) 用于设置Pflash的保护情况。 (3)DFlashGetProtection() UINT32DFlashGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus) 用于Dflash保护情况的获取 (4)DFlashSetProtection() UINT32DFlashSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus) 用于获取Dflash的保护情况。 (5)EERAMGetProtection() UINT32EERAMGetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8* protectStatus) 获取flexRAM中EEPROM的保护情况。 (6)EERAMSetProtection() UINT32EERAMSetProtection (PFLASH_SSD_CONFIG PSSDConfig, UINT8 protectStatus) 设置FlexRAM中EEPROM的保护。
3:flash加密相关函数 (1)FlashGetSecurityState() UINT32FlashGetSecurityState (PFLASH_SSD_CONFIG PSSDConfig, UINT8* securityState) 获取flash加密的状态,包括加密使能以及后门密钥使能状态。 (2)FlashSecurityBypass() UINT32 FlashSecurityBypass(PFLASH_SSD_CONFIG PSSDConfig, UINT8* keyBuffer, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 使用后门密钥解密函数。
4:flash擦除相关函数 (1)FlashEraseAllBlock() UINT32 FlashEraseAllBlock(PFLASH_SSD_CONFIG PSSDConfig, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 擦除所有flash内存,初始化flexRAM,验证内存内容然后解密MCU。
(2)FlashEraseBlock() UINT32 FlashEraseBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 擦除指定的Pflash或者Dflash的块
(3)FlashEraseSector() UINT32FlashEraseSector(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, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 将段编程缓冲中的数据编程到指定的flash地址。
(2)FlashProgram () UINT32 FlashProgram(PFLASH_SSD_CONFIGPSSDConfig, UINT32 destination, UINT32 size, \ UINT8* pData, pFLASHCOMMANDSEQUENCEFlashCommandSequence) 编程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, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 查看Pflash,Dflash, EEPROM的备份区以及IFR是否到了余量等级 (3)FlashVerifyBlock() UINT32FlashVerifyBlock(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, UINT8marginLevel, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 检查整个Pflash或者Dflash是否被擦除到定义的余量等级,其实类似于查看flash寿命 (4)FlashProgramCheck() UINT32 FlashProgramCheck(PFLASH_SSD_CONFIG PSSDConfig, UINT32 destination, \ UINT32 size, UINT8*pExpectedData, UINT32* pFailAddr, UINT8 marginLevel, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 用于测试之前编程的Pflash或者Dflash长字节,查看在特定的余量等级下读取是否正确
7:flash一次编程函数 (1)FlashReadOnce() UINT32 FlashReadOnce (PFLASH_SSD_CONFIGPSSDConfig, UINT8 recordIndex,\ UINT8* pDataArray, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 用于读取Pflash中IFR的64个一次编程区域的数据。 (2)FlashProgramOnce() UINT32 FlashProgramOnce (PFLASH_SSD_CONFIGPSSDConfig, UINT8 recordIndex,\ UINT8* pDataArray, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 用于编程Pflash中IFR的64个一次编程区域的数据。 8:flash eeprom相关函数 (1)DEFlashPartition() UINT32 DEFlashPartition (PFLASH_SSD_CONFIGPSSDConfig, UINT8 EEEDataSizeCode, UINT8 DEPartitionCode, pFLASHCOMMANDSEQUENCEFlashCommandSequence) 用于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() UINT32PFlashSwapCtl(PFLASH_SSD_CONFIG pSSDConfig, UINT32 addr, UINT8 swapcmd, UINT8* pCurrentSwapMode, UINT8*pCurrentSwapBlockStatus, UINT8* pNextSwapBlockStatus, pFLASHCOMMANDSEQUENCEpFlashCommandSequence) 用于swap命令的控制 (2)PFlashSwap() UINT32PFlashSwap(PFLASH_SSD_CONFIG PSSDConfig, \ UINT32 flashAddress, \ PFLASH_SWAP_CALLBACKpSwapCallback, \ pFLASHCOMMANDSEQUENCEFlashCommandSequence) 用于在两个PFLASH一半flash的块中交互程序 10:flash 重定向相关函数 RelocateFunction() UINT32 RelocateFunction(UINT32dest, UINT32 size, UINT32 src) 该函数用于重定向函数到另一个RAM的地址 以上讲解的是最基本的API函数功能,关于具体的意思,请查看驱动中文件FSL_Envm_FTFx_UM.pdf 文档。 四,小结 以上即为本次文档要讲的关于驱动的基本概念以及API函数基本介绍,详情请查看驱动的参考手册。另外,后续配合例程进一步讲解关于flash驱动的内容。
|