TMS570LS3137笔记-内部Flash FEE使用
1、基本简介
TMS570LS3137内部Flash分为三个 Bank,主Flash 数据存储区3MB,是Bank1和Bank2.还有一个Bank7是作为内部Flash模拟EEPROM使用。内部存储器如下图所示:
FEE功能只是用于Bank7,需要使用这块存储器就需要相应的函数实现数据的读取、写入和擦除。Ti为我们准备了F021FLASH-library实现了程序代码和系统存储器之间的桥梁。因此我们只需要调用F021FLASH-library的接口代码即可实现对存储器的读写操作。这可比翻手册写代码简单多了。
2、使用流程
2.1需要使用FEE功能,首先需要在HALCoGen软件配置相应功能,使能FEE驱动库等操作。然后配置内部存储器的Block操作等。
FEE配置:
FEE驱动配置就完成了,HALCoGen生成代码。然后进入Code Composer Studio 编译。
2.2添加F021FLASH-library代码;
在前面的HALCoGen生成代码完成后,进入CCS编译,会报错。提示:F021.h文件找不到。那是因为我们前面说过的F021FLASH-library驱动代码没有添加到工程中。在Ti网站下载:https://www.ti.com/tool/HERCULES-F021FLASHAPI#downloads F021FLASH-library包,下载下来后是一个压缩包spnc033.zip。将其解压后是一个exe文件,安装exe文件。会默认将F021FLASH-library代码解压到C:\ti\Hercules\F021 Flash API。
将F021 Flash API文件夹复制到工程所在路径下:
接下来配置CCS,首先将新添加到头文件路径加入到CCS工程之中:
由于F021FLASH-library是以Lib 方式提供的,因此还需要将对应的lib添加到CCS工程中去。打开F021FLASH-library文件目录会发现文件夹中除了提供了代码文件和lib文件还有完善的API说明。有兴趣可以详细看看API代码的意思,和操作流程。Ti文档解释的还是比较清楚的。我们发现这里提供了很多lib,那是因为这个工程是服务于TI很多芯片的。因此需要添加正确的lib文件才可以使用该功能。
就F021库而言,BE和LE分别指大端序和小端序,Hercules系列产品中,TMS570系列为大端序,RM系列为小端序;我们使用的是TMS570LS3137因此选择F021_API_CortexR4_BE.lib。
在CCS这个位置添加,如下图所示:
自此,我们所有的配置过程就完成了。
3、代码编写和测试
在需要使用FEE的文件中调用头文件“#include "ti_fee.h"”;
3.1 FEE初始化函数
在进行FEE读写数据之前必须调用 “TI_Fee_Init();”初始化库。
3.2写数据
下面定义写入数据函数,参数是Block号和Buf,单次写入数据我们前面已经定义好 64字节。
void bank7_flash_write(uint16 BlockNumber,uint8 *buf)
{
TI_FeeModuleStatusType Status; //定义状态标志字
do
{
TI_Fee_MainFunction();
delay_ms(1);
Status=TI_Fee_GetStatus(0 );
}
while(Status!=IDLE); //获取 FEE状态并等待为 IDLE
TI_Fee_WriteAsync(BlockNumber, buf); //写入数据
do
{
TI_Fee_MainFunction();
delay_ms(1);
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
}
3.3读取数据
BlockNumber读取数据 block号,BlockOffset读取数据偏移,buf读取数据Buf,Length读取数据长度。
void bank7_flash_read(uint16 BlockNumber,uint16 BlockOffset,uint8 *buf,uint16 Length)
{
unsigned int index = 0;
unsigned int set_w_num = 0;
TI_FeeModuleStatusType Status;
Std_ReturnType oResult;
TI_Fee_AddressType cur_address = 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);
if(BlockOffset<=set_w_num) //检查 Length 长度数据的 合法性
{
if(Length>(set_w_num-BlockOffset))Length=set_w_num-BlockOffset;
}
oResult=TI_Fee_Read(BlockNumber,BlockOffset,buf,Length);
do
{
TI_Fee_MainFunction();
delay_ms(1);
Status=TI_Fee_GetStatus(0);
}
while(Status!=IDLE);
}
3.4 擦除数据
擦除函数可选择使用如下两种函数:
TI_Fee_Format(0xA5A5A5A5U); //格式化就是将整个bank7进行格式化。
TI_Fee_EraseImmediateBlock(1); //Block1 擦除
TI_Fee_EraseImmediateBlock(2); //Block2 擦除
3.5测试函数
我编写了2个block数据写入和读取的测试函数。实现数据写入和读取并在串口中显示数据。
void bank7_flash_test(void)
{
uint8 buf[64],read[64];
uint16 i=0;
for(i=0;i<64;i++)
{
buf[i]=65-i;
read[i]=0;
}
TI_Fee_Init(); //FEE 系统初始化
bank7_flash_write(1,buf); //Block1 写入数据
bank7_flash_read(1,0,read,64); //Block1读取 写入的数据
printf("Block1 读出数据:\r\n");
for(i=0;i<64;i++){printf("%d ",read[i]);} //打印读取的数据
//Block2 数据读写测试开始
for(i=0;i<64;i++)
{
buf[i]=i+2;
read[i]=0;
}
bank7_flash_write(2,buf); //Block2 写入数据
bank7_flash_read(2,0,read,64); //Block2读取 写入的数据
printf("\r\nBlock2 读出数据:\r\n");
for(i=0;i<64;i++){printf("%d ",read[i]);} //打印读取的数据
// TI_Fee_Format(0xA5A5A5A5U); //格式化就是将整个bank7进行格式化。
TI_Fee_EraseImmediateBlock(1); //Block1 擦除
TI_Fee_EraseImmediateBlock(2); //Block2 擦除
}
3.6测试结果
测试结果如下所示:
TMS570LS3137笔记-内部Flash FEE使用的更多相关文章
- STM32学习笔记:读写内部Flash(介绍+附代码)
一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同. RAM起 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- STM32F103使用内部Flash保存参数
在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数.这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能.将这类数据存在指定的 ...
- STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多.平时写的代码,烧写完之后还有大量的剩余.有效利用这剩余的FLASH能存储不少数据.因此研究了一下S ...
- STM32 对内部FLASH读写接口函数
因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...
- STM32 对内部FLASH读写接口函数(转)
源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...
- STM32f030f4p6 内部flash 打包读写
最近做到的项目在运行需要把一组uint8_t(unsigned char)的数据进行掉电储存,想到单片机STM32f030f4p6内部flash可以直接由程序操作,写了以下代码用于uint8_t数据打 ...
- STM32 内部flash的读写程序
/* Base address of the Flash sectors */ #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base ...
- 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
@20119-01-29 [小记] STM32擦除内部FLASH时间过长导致IWDG复位分析
随机推荐
- [loj2978]杜老师
假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数 不难发现以下两个性质 ...
- Taro 3.4 beta 发布: 支持 Preact 为应用开辟更多体积空间
项目体积是困扰小程序开发者的一大问题,如果开发者使用 Taro React 进行开发,更是不得不引入接近 100K 的 React 相关依赖,这让项目体积变得更加捉襟见肘.因此,Taro v3.4 的 ...
- Spring扩展点-v5.3.9
Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...
- 【程序员翻身计划】Java高性能编程第一章-Java多线程概述
目标 重点: 线程安全的概念 线程通信的方式与应用 reactor线程模型 线程数量的优化 jdk常用命令 Netty框架的作用 难点 java运行的原理 同步关键字的原理 AQS的抽象 JUC的源码 ...
- 洛谷 P2791 - 幼儿园篮球题(第二类斯特林数)
题面传送门 首先写出式子: \[ans=\sum\limits_{i=0}^m\dbinom{m}{i}\dbinom{n-m}{k-i}·i^L \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...
- NOIP2020 模拟赛 B 组 Day6
非常巧妙的一场模拟赛,比较偏向于 Atcoder 的风格,考场上做出了 A .C 两题. A. 礼物购买 排完序后一个个礼物地枚举时间复杂度是\(\Theta(nm)\)的,不能接受.但是注意到,若当 ...
- 毕业设计之zabbix---自带模板监控mysql内容
自带模板是不能直接建立连接就可以用的 必须经历一下几步: 建立用户权限: [root@mysql.quan.bbs lib]$mysql -u root -p Enter password: Welc ...
- C语言计算fastq文件GC含量
C语言小练习:计算非压缩fastq格式的GC含量 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <strin ...
- mysql—mysql查询语句提示Unknown column ‘xxx’ in ‘where clause’
运行结果中提示Unknown column 'xxx' in 'where clause'的问题.经过大神的指导,顿时明白其中缘由,如果sql中定义的类型是int型的可以不用加引号,但是如果是字符串类 ...
- yum和apt-get的用法和区别
一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包 ...