TMS570ls3137 之FEE使用

官方手册上写关于FEE,TMS570LS3137中的片上flash分为三部分,如下图1所示
图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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值