本帖最后由 FSL_TICS_ZJJ 于 2014-9-30 19:46 编辑
【经验分享】C90TFS_FTFx KL25 flash例程讲解 一,经验分享简介 之前写过一篇关于官方C90TFS_FTFX flash标准软件驱动简介这篇**,主要简单介绍了C90TFS这个flash驱动所支持的芯片,函数结构,以及一些API函数基本意思。其实在C90TFS的驱动文档中也能找到。从C90TFS来看,这个驱动软件对于使用kinetis芯片的flash控制还是很有帮助的,通过各种API函数,能够完成所有的kinetis芯片的flash操作,无需自己再重新编写相关的寄存器控制函数去实现。 为了便于大家进一步了解C90TFS驱动在kinetis芯片中的实现情况,本文以测试平台TWR-KL25Z48M为例,集合C90TFS驱动中的demo_normal工程具体讲解如何使用C90TFS flash驱动实现kinetis 芯片的flash操作。 C90TFS FLASH下载链接: http://cache.freescale.com/files/32bit/software/C90TFS_FLASH_DRIVER.exe?fromsite=zh-Hans 二,经验分享前提准备 本章节主要讲解C90TFS中,关于KL25的例程工程构成,配置文件情况,要讲解的例程选择以及测试平台的选择等,为后续的详细代码讲解以及验证做一个准备。 1, C90TFS flash KL25例程工程构成 安装好C90TFS flash之后,可以从如下的路径找到KL25的相关代码。 安装路径\Standard Sotfware Driverv101\C90TFS\Demos\build\MKL25Z128xxx4 可以看到,供有两种编译器的代码,分别为IAR以及CW10.4, CW10.4 的工程可以用CW10.4及其以后的版本打开。IAR的工程可以使用IAR embedded workbench for ARM 6.4.2之后的版本打开。 打开路径下IAR的工程,可以看到C90TFS具体包含的KL25flash例程情况,如下图:
图 1 例程情况 从上图中可以看到,一共具有4个例程, 具体例程的功能已经在图中标出。本次例程讲解使用demo_normal例程,旨在让大家熟悉C90TFS flashAPI函数的使用。 2, C90TFS flash例程配置文件情况 这里以demo_normal 工程为例,讲解配置文件。程序一共有两种运行方式, 分别为从RAM运行,以及从Flash运行。通过配置相应的.icf文件(IAR)或者.ld文件(CW 10.x)实现。 IAR中,.icf文件可以打开project后在link_file文件夹下找到。 CW中,.ld 文件可以打开project后在project_settings->linker_files文件夹下找到。 这里以CW工程为例讲解,IAR的情况也类似,主要是空间的起始结束地址,以及堆栈分配,中断向量的分配等。 (1) CW16KB_Ram.ld
图2 ram ld (2) CW128KB_Pflash.ld
图3 flash ld 3. 测试平台 CW10.6 以及TWR-KL25Z48M。 选择使用CW10.6,是因为,测试的时候,可以直接看出哪些代码在编译范围内,便于查看代码,如下图:
图4 CW代码查看 三,代码讲解及测试 通过实例的代码讲解即测试,进一步了解flash驱动的API函数使用。 1:KL25的结构体定义 原FLASH_SSD_CONFIG结构体定义: 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,函数指针,回调函数用于时间要求高的事件
KL25变量声明: FLASH_SSD_CONFIG flashSSDConfig= { FTFx_REG_BASE, /* FTFx controlregister base */ PFLASH_BLOCK_BASE, /* base address ofPFlash block */ PBLOCK_SIZE, /* size of PFlashblock */ DEFLASH_BLOCK_BASE, /* base address ofDFlash block */ 0, /* size of DFlashblock */ EERAM_BLOCK_BASE, /* base address ofEERAM block */ 0, /* size of EEEblock */ DEBUGENABLE, /* background debugmode enable bit */ NULL_CALLBACK /* pointer to callbackfunction */ };
其中: FTFx_REG_BASE = 0x40020000 PFLASH_BLOCK_BASE 0x00000000 DEFLASH_BLOCK_BASE 0xFFFFFFFF PBLOCK_SIZE 0x00020000 /* 128KB size */ EERAM_BLOCK_SIZE 0x00000000 DEBUGENABLE 0x00 NULL_CALLBACK ((PCALLBACK)0xFFFFFFFF)
FTFx_REG_BASE的基地址,可以从用户手册中查看
图5 FTFA基地址 图6 flash大小即地址范围
2, flash初始化 /************************************************************************** * FlashInit() ***************************************************************************/ ret = FlashInit(&flashSSDConfig); if (FTFx_OK != ret) { ErrorTrap(ret); } 初始化API函数,保护清楚错误状态标志位,设置内存的Dflash以及EEPROM大小等情况,由于KL25没有flexNVM以及flexRAM,所以这部分只是设置了Dflash以及EEPROM大小为0.
|