官方手册上写关于FEE,TMS570LS3137中的片上flash分为三部分,如下图1所示
我们所用的FEE功能只适用于BANK7,因为这一块是TI采用的特殊工艺65nmflash,我们可以以任意字节进行读写。
这个东西的配置比较简单直接在HCG中进行配置,唯一需要注意的是,我们需要从官方下载F021FLASH-libary这个库文件,这个是免费的下载地址如下:
http://www.ti.com/tool/f021flashapi
这里面有源代码,和一些库文件,我们只需要选择其中一个库文件即可。
接下来我们进行工程演示:
1.HCG配置
配置SCI是为了串口打印,然后配置FEE。
这里我们就是用默认的180Mhz操作频率,
Number of FEE Blocks我们选择2个,选择完成有下面会自动打钩两个,我们可以在block size中设置大小,
这个设置的大小就是我们以多少字节进行写入,我选择的是20,和8字节写入。
这一块实验中还没有涉及到,我会在下个实验中继续深入使用,所以我们就是用默认的配置。
HCG就配置完成了,生成代码。
2.建立CCS工程,将HCG配置的代码进行导入。
会发现导入完成后,编译会报错,提示我们F021.h文件没有定义。这时候我们就需要将F021flash-libary移植进去,
官网下载完成后我们将C,H文件导入到CCS中,如下图所示。
关于上面的lib文件,我是选择其中的一个lib,具体的使用那个得看用户手册,上面有详细解释。
以上配置完成后,我导入main代码,如下:
int main(void)
{
/* USER CODE BEGIN (3) */
unsigned int BlockNumber;
unsigned int BlockOffset, Length;
unsigned char *Read_Ptr=read_data;
unsigned int loop;
unsigned int set_w_num = 0;
for(loop=0;loop<100;loop++)SpecialRamBlock[loop] = loop;
TI_Fee_Init();
sciInit();
printf("FEE Init complete\r\n");
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0 );
}
while(Status!=IDLE);
BlockNumber=0x1;
TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
TI_Fee_WriteSync(BlockNumber, &SpecialRamBlock[0]);
set_w_num = TI_FeeInternal_GetBlockIndex(BlockNumber);
set_w_num = TI_FeeInternal_GetBlockSize(set_w_num)-TI_FEE_BLOCK_OVERHEAD;
printf("set_w_num is %d\r\n",set_w_num);
BlockNumber=0x2;
TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[set_w_num]);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
TI_Fee_WriteSync(BlockNumber, &SpecialRamBlock[set_w_num]);
set_w_num = TI_FeeInternal_GetBlockIndex(BlockNumber);
set_w_num = TI_FeeInternal_GetBlockSize(set_w_num)-TI_FEE_BLOCK_OVERHEAD;
printf("set_w_num2 is %d\r\n",set_w_num);
BlockOffset = 0;
Length = 0xFFFF;
oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
for(loop=0;loop<100;loop++)
{
printf("%d\r\n",*Read_Ptr);
Read_Ptr++;
}
TI_Fee_Format(0xA5A5A5A5U);
while(1);
/* USER CODE END */
return 0;
}
实现的效果图如下:
通过以上结果发现了问题,我开始的意愿是打印0到27的数字,为什么只打印了20-27,我做了一下分析,
结果发现是我的打印出现问题。
这里应该是需要把两块的block都打印出来,我做了如下改动。
int main(void)
{
/* USER CODE BEGIN (3) */
unsigned int BlockNumber;
unsigned int BlockOffset, Length;
unsigned char *Read_Ptr=read_data;
unsigned char *Read_Ptr2=read_data2;
unsigned int loop;
unsigned int index = 0;
unsigned int set_w_num = 0;
TI_Fee_AddressType cur_address = 0;
TI_Fee_AddressType next_address = 0;
for(loop=0;loop<100;loop++)SpecialRamBlock[loop] = loop;
TI_Fee_Init();
sciInit();
printf("FEE Init complete\r\n");
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0 );
}
while(Status!=IDLE);
BlockNumber=0x1;
TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
//TI_Fee_WriteSync(BlockNumber, &SpecialRamBlock[0]);
index = TI_FeeInternal_GetBlockIndex(BlockNumber);
set_w_num = TI_FeeInternal_GetBlockSize(index)-TI_FEE_BLOCK_OVERHEAD;
cur_address = TI_FeeInternal_GetCurrentBlockAddress(BlockNumber,0,index);
printf("index is %d,set_w_num is %d\r\n",index,set_w_num);
BlockOffset = 0;
Length = 20;
oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
printf("block 1:");
for(loop=0;loop<20;loop++)
{
printf("%d,",*Read_Ptr);
Read_Ptr++;
}
printf("\r\n");
BlockNumber=0x2;
TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[set_w_num]);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
TI_Fee_WriteSync(BlockNumber, &SpecialRamBlock[set_w_num]);
index = TI_FeeInternal_GetBlockIndex(BlockNumber);
set_w_num = TI_FeeInternal_GetBlockSize(index)-TI_FEE_BLOCK_OVERHEAD;
cur_address = TI_FeeInternal_GetCurrentBlockAddress(BlockNumber,0,index);
printf("index %d,set_w_num2 is %d\r\n",index,set_w_num);
BlockOffset = 0;
Length = 8;
oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr2,Length);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
printf("block 2:");
for(loop=0;loop<8;loop++)
{
printf("%d,",*Read_Ptr2);
Read_Ptr2++;
}
printf("\r\n");
BlockNumber=0x1;
BlockOffset = 0;
Length = 20;
oResult=TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length);
do
{
TI_Fee_MainFunction();
delay();
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
printf("block 1:");
for(loop=0;loop<20;loop++)
{
printf("%d,",*Read_Ptr);
Read_Ptr++;
}
printf("\r\n");
TI_Fee_Format(0xA5A5A5A5U); //格式化就是将整个bank7进行格式化。
while(1);
/* USER CODE END */
return 0;
}
打印结果如下所示:
通过这个例子,应该可以理解如何使用block。就是将一整块的sector化为为若干个block,然后在这些block中进行读写,
已达到存储的目的。
工程源码详见:https://download.csdn.net/download/weixin_42259397/12497297