TMS320F28xx DSP中内部Flash的应用研究

发布者:星辰小鹿最新更新时间:2007-02-01 来源: 国外电子元器件关键字:周期  存储  定时器 手机看文章 扫描二维码
随时随地手机看文章

1 前言

TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度来配置各个存储器必须有合适的方法,而这些方法一般都与片内Flash有关。另外,TMS320F28xx DSP片内有看门狗定时器模块(WDT)、引导ROM(ROM bootloader)模块、代码安全模块(CSM),要合理地使用这些模块为整个系统服务,必定也要用到Flash。

由此可以看出,Flash的地位和作用比较显著.所以本文就Flash的几种用法作了研究。

2 从Flash拷贝段到RAM

2.1拷贝中断向量

在TMS320F28xx器件中,外设扩展中断(PIE)模块管理中断请求。上电时,所有中断向量必须位于非易失性存储器(如Flash)中,但是要把中断向量拷贝到PIEVECT RAM中,这是用户代码中器件初始化程序的一部分。PIEVECT RAM是一个特定的RAM块,它在当前TMS320F28xx器件中是一个256×16的块.在数据空间中的起始地址为Ox000D00。

把中断向量连接到Flash,然后在运行时把中断向量拷贝到PIEVECT RAM中,有许多方法可以实现。一个方法是创建包含函数指针的常量C结构体,该结构体包括128个32-bit向量。如果使用DSP281x或者DSP280x外设的结构体.这个结构体叫做PieVectTableInit,它已经在DSP281x_PieVect.c或者DSP280x_PieVect.c创建(参看TI提供的例程)。因为这个结构体使用const类型关键词,所以它将会被编译器放置在.econst段中。运行时只需要把这个结构体拷贝到PIEVECT RAM中。C编译器运行时支持库包含名为memcpy的存储器拷贝函数,该函数可以被用来完成拷贝任务,其用法如下所示:

以上这个例子为PIE RAM起始地址使用的硬编码地址(hard coded address),明确指定为0x000D00。但是硬编码地址并不是较好的编程方式,用户可以使用DATA_SECTION指令创建一个非初始化的假变量(dummy variable),并把这个变量连接到PIE RAM.然后用这个假变量的名字来代替硬编码地址。例如,当使用DSP281x或者DSP280x外设结构体时,创建一个名为PieVectTable的非初始化结构体,并把该结构体连接到PIEVECT RAM。前面例子中的memcpy()函数可以被替换为:

memcpy(&PieVectTable,&PieVectTableInit,256);

注意拷贝长度是256个16-bit字.对应为128个32-bit字。

2.2初始化Flash控制寄存器

Flash控制寄存器FOPT、FPWR、:FSTDBY-WAIT、FACTIVEWAIT、FBANKWAIT、FOTPWAIT的初始化代码不能从Flash存储器当中运行.否则就会有不可预料的结果出现。所以,Flash控制寄存器的初始化函数在运行时必须从Flash(它的装载地址)拷贝到RAM(它的运行地址)。

Flash控制寄存器由Code Security Module(CSM)保护。如果CSM被保护起来了,那么必须从被保护的RAM(例如:L0或者L1 SARAM)运行Flash控制寄存器的初始化代码,否则Flash控制寄存器的初始化代码无法访问Flash控制寄存器。要注意的是,当器件复位的时候CSM一般都是被保护起来的,虽然使用假密码0xFFFF时ROM BOOTLOAD-ER会把它解锁。

C编译器的CODE_SECTION指令可以用来为Flash控制寄存器的初始化函数创建独立的可连接段。例如:假定Flash控制寄存器的配置在C函数InitFlash()中实现,并且想把这个函数放置在名为secureRamFuncs的可连接段当中。下列的C代码例程显示了CODE_SECTION命令在Flash存储器配置中的正确用法:

secureRamFuncs段可以使用用户连接命令文件(.cmd)进行连接。这个段需要独立的装载和运行地址。另外,还想让连接器生成一些全局符号,这些全局符号可以用来决定装载地址、运行地址、段长度。在实现把这个段从装载地址拷贝到它的运行地址时需要这些信息。用户连接命令文件如下所示:


在这个例子中,假定存储器Flash和SECURE_RAM都已经在用户连接命令文件中的MEMORY段中定义。这些存储器的PAGE标识符要与它们的存储器定义相匹配。在上面的例程中假定两个存储空间都已经在PAGE 0(程序存储空间)中声明过了。RUN_START、LOAD_START、LOAD_END指令将生成全局符号,这些全局符号有特定的名称,对应着相应的地址。最后,这个段必须在运行时从Flash拷贝到RAM,可以用到编译器运行支持库里面的函数memcpy()。
 
2.3性能最优化

常数是那些用C语言的const类型关键词声明的数据结构。编译器把所有的常数放置在.econst段中(假定为大存储模式)。当前TMS320F28xx器件上的特殊管道(special pipelining)提高Flash上运行代码的性能时.每次访问位于片上Flash中的数据常数会占用许多周期。特别是在150 MHz TMS320F281x DSP上Flash等待状态要达到5个周期.100 MHz TMS320F280x DSP达到3个周期。所以,访问片上RAM中的常数与常数表则成为沉重的负担。然而,分立式嵌入式系统要求所有的初始化数据(如常数)最初都是位于非易失性存储器中,所以,必须为想访问的RAM中的常数建立独立的装载和运行地址.在运行时把这些常数从片上Flash中拷贝到RAM中。这里介绍两种不同的实现方法。

方法一:在RAM中运行所有的常数阵列。

这种方法是为整个.econst段指定独立的装载和运行地址。其好处是容易使用,而坏处是RAM的使用量非常大(可能只有少量常数需要快速访问,但是用这种方法所有的常数都位于RAM)。

在用户连接命令文件中简单地为整个.econst段指定独立的装载和运行地址,然后在运行时通过拷贝整个.econst段的方式往工程中添加代码。例如:
 
方法二:在RAM中运行特定的常数阵列。

这种方法是在运行时有选择性地从Flash拷贝常数到RAM。与方法一相似,这个流程能够完成预期功能,不同点是只有在命名段中被选择了的常数才会被拷贝到RAM中(而不是把所有的常数都拷贝到RAM中)。

假定想创建在RAM中运行的5个字的常数阵列,并命名为table[]。DATA_SECTION指令用来把table[]放置在名为ramconsts的用户自定义段中。相应的C源程序如下所示:
 
使用用户连接命令文件连接ramconsts段,装载到Flash而从RAM中运行,生成全局符号来帮助存储器拷贝。用户连接命令文件如下所示:
 
最后,在运行时必须把table[]从装载地址拷贝到运行地址:
 
3 CSM密码的编程

TMS320F28xx器件上的代码安全模块CSM提供了保护,防止非法的程序拷贝。在当前的TMS320F28xx器件中,整个Flash、OTP存储器,LO和L1都被CSM保护(Flash配置寄存器同样被保护)。当器件被保护的时候,只有从被保护的存储空间运行的代码可以访问(读或写)其他被保护存储空间中的数据。从非保护的存储空间运行的代码不可以访问被保护存储空间中的数据。

CSM使用128-bit密码组成8个单独的16-bit字。在当前的TMS320F28xx器件上,这些密码被存储在Flash的最高8个字中(如地址:Ox3F7FF8-Ox3F7FFF)。在开发过程中,建议在密码位置放入假密码0xFFFF。使用假密码时,对CSM解保护只需假读密码位置。把假密码放在密码位置是很容易的.因为在Flash编程过程中.Flash被清除后这些位置的状态将会是0xFFFF。用户只需要在自己的代码工程中避免连接任何段到密码地址,密码将保持为OxFFFF。

在开发完成以后.可能想把真正的密码放在密码位置中。另外,为了正确地保护CSM模块,当前TMS320F28xx器件上的CSM模块需要编写值Ox0000到Flash的地址0x3F7F80-Ox3F7FF5。完成这两个任务的最简单的方法是用少量汇编语言进行编程。下面是一个汇编代码例子,这个例子指定了想要的密码值,并且把它们放在一个名为pass-words的初始化段中。另外创建了一个名为csm_rsvd的初始化段,这个段的值全部是0x0000.并且这个段有适当的长度以适合地址Ox3F7F80-0x3F7FF5。注意,这个例子显示的是假密码值0xFFFF.用户可以用自己的密码代替这些假密码。
 
在这里必须警告用户:不要把8个密码的值全部设为Ox0000,这样做会永久地锁定CSM模块!passwords和CSB_rsvd段要由用户连接命令文件放置在存储器中。下面的例子适用于当前TMS320F28xx器件(对于其他器件,请参考器件数据手册以确定密码和CSM保留位置的地址)。
 
4 在DSP复位以后从Flash运行代码

TMS320F28xx具有引导ROM(ROM bootloader),器件复位以后ROM bootloader能把代码运行转到Flash中。当引导模式选择引脚被配置为"跳转到Flash"时.ROM bootloader将跳转到Flash中位于地址Ox3F7FF6处的指令。用户需要在这个地址上安排一条指令,这条指令跳转到用户代码。由于CSM密码从地址Ox3F7FF8开始,所以刚好有2个字可用于存放这个跳转指令。并非巧合的是,长跳转指令(在汇编代码中为LB)刚好占用2个字。

一般情况下,跳转指令将会跳转到C编译器运行支持库中C环境初始化程序的起始位置。这个程序的人口标号是_c_int00。在这个程序没有运行的时候C代码就不能运行。同样地,有时候在开始运行用户的C应用程序之前需要执行少量的汇编代码(例如:禁止看门狗时钟外设)。这样,跳转指令需要跳转到用户汇编代码的起始位置,需要在Flash中正确定位跳转指令。能达到这个目的的最简单的方法是使用汇编代码。在下面的例子中.创建了一个名为Codestart的已命名初始化段.这个段包含了一个长跳转.可以跳转到C环境初始化程序。需要用用户连接命令文件把codestart段放置在存储器中。
 
用户须在用户连接命令文件MEMORY部分的PAGE 0上定义一个名为BEGIN_Flash的存储器块。Codestart段将被连接到这个存储器块。下面的例子针对当前TMS320F28xx器件.对于其他的器件,参考相应的数据手册以确认Flash目标地址的引导。
 
5 C环境引导时禁止看门狗计时

C编译器运行时支持库中的C环境初始化函数是_c_int00,它完成全局和静态变量的初始化。包括为每个初始化全局变量把数据从.cinit段(位于片上Flash存储器)拷贝到.ebss段(位于RAM)。例如,当一个全局变量在源代码中声明为:

int x=5;

"5"被放置在初始化段.cinit,而符号"x"被放置在.ebss段。然后,_c_int00程序在运行时把"5"拷贝到"x"的位置。当软件中有初始化全局和静态变量的大量数值时。在C环境引导程序完成并且调用main()(这里看门狗可以被配置或被禁止)函数之前看门狗定时器会超时。在代码开发的过程中,这个问题可能不会在RAM中显现出来,因为从.cinit段拷贝的数据被连接到RAM后会非常快速地运行。然而,当.cinit段连接到内部Flash时。拷贝每个数据将会耗费大量的周期。因为内部Flash存储器缺省为最大等待状态(等待状态仅在用户代码运行到main()后才会被配置)。另外。代码从Flash中实现数据拷贝.这又会增加完成数据拷贝需要的时间(代码取指和数据读肯定会访问Flash)。看门狗超时周期缺省到尽可能的最小值.结合这么一个事实,看门狗超时变成真实的可能性。有一个简单的方法使用CCS来检测看门狗超时,步骤如下:

(1)为已经写入Flash的代码装载符号(单击File→Load Symbols→Load Symbols Only)

(2)复位DSP(单击Debug→Reset CPU)。

(3)重新开始DSP(单击Debug→Restart)。如果bootloader被设置为"Jump to Flash".那么无需进行这一步。

(4)运行到main()(单击Debug→Go_Main)。如果没有到达main(),那么在C环境初始化程序完成之前看门狗很有可能已经溢出。

解决看门狗超时问题最简单的办法就是在开始C环境初始化程序之前禁止看门狗。在main()到达之后重新使能看门狗,并且开始正常的代码执行流程。通过将WDCR寄存器中的WDDIS位设置为1来禁止看门狗。必须使用汇编代码(因为C环境还没有建立)。在上文中,Codestart汇编代码段实现了能跳转到C环境初始化程序_c_int00的跳转指令。为了禁止看门狗,这个跳转要变为跳转到看门狗禁止代码。此看门狗代码然后又跳转到_c_int00的程序。下面的代码例子实现了这些功能:
 

 
6 结束语

文中列举的Flash的这几种用法,在CCS中编程下载到TMS320F28xx DSP开发板上,并通过运行程序验证了其正确性。Flash的这几种用法可以作为系统开发过程中的参考,有助于复杂系统开发。

关键字:周期  存储  定时器 引用地址:TMS320F28xx DSP中内部Flash的应用研究

上一篇:TMS320F28xx DSP中内部Flash的应用研究
下一篇:DSP与单片机通信的多种方案设计

推荐阅读最新更新时间:2024-05-02 20:27

msp430g2553输出PWM波
用msp430g2553的定时器timerA就可以实现PWM波,内容不难!设置下时钟源,定时器配置一下就可以了 仿真: 代码: TA1CTL:选时钟源,计数模式增 TA1CCR0(定时器寄存器)与频率有关; TA1CCR1(定时器寄存器)与占空比有关; TA1CCTL1:OUTMOD_7输出模式选择。 #include msp430.h void main(void){ TA1CTL |= TASSEL_2 + MC_1; //选SMCLK,增计数 P2SEL |= BIT1; P2DIR |= BIT1;//P2.1设为输出TA1.1 TA1CCTL1 = OUTMOD_7; TA1CCR0 = 1115000/2
[单片机]
msp430g2553输出PWM波
低成本555定时器取代微处理器对LED驱动器的控制
本文详细介绍如何使用便宜的555定时器,在一些不需要LED驱动器全部功能的应用中,代替微处理器对专用led驱动器实施控制。这样做可让用户在降低总系统成本的同时,维持 LED驱动器的恒定电流。   相比几年以前,现在使用LED的应用越来越多。这些应用从高端视频显示器到低端照明应用,不一而足。设计人员通常只需要专用LED驱动器的部分功能,但却无力负担控制它们所需的微处理器的相关成本费用。   专用LED驱动器常常被设计为微处理器控制型,旨在实现诸如模拟或脉宽调制(PWM) LED电流控制、每个LED的独立控制、LED状态和故障信息读取等特性。对于一些仅要求恒定LED 电流的应用(例如:LED照明或者发光)来说,可能不需要这些高
[电源管理]
低成本555<font color='red'>定时器</font>取代微处理器对LED驱动器的控制
STM32 学习笔记_TIME定时器详解1
STM32 单片机的定时器的确很强大,参考说明书中就占了一百多页,占参考手册1/4 有多了。 STM32的定时器分了好几个类别,各个类别针对功能作用都不大相同。 分有: 一、高级定时器 二、通用定时器 三、基本定时器 四、看门狗定时器 五、SysTick定时器 其中看门狗定时器和SysTick定时器本篇笔记阐述,这里主要记下对平时使用定时器作用的计时计数器的一些自己的理解。 按照参考手册中的定义 高级定时器 通用定时器基本定时器,这三个定时器成上下级的关系,即基本定时器有的功能通用定时器都有,而且还增加了向下、向上/向下计数器、PWM生成、输出比较、输入捕获等等功能;而高级定时器又包含了通用定时器的所有功能,另外还增加了死区互补输
[单片机]
STM32 学习笔记_TIME<font color='red'>定时器</font>详解1
在嵌入FPGA的IP核8051上实现TCP/IP的设计
0 引言 随着芯片规模的越来越大、资源的越来越丰富, 芯片的设计复杂度也大大增加。事实上, 在芯片设计完成后, 有时还需要根据情况改变一些控制, 这在使用过程中会经常遇到。这时候如果再对芯片设计进行改变将是很不可取的, 因为需要设计人员参与这种改变, 这无论是对设计者还是用户都是不能接受的。于是就有必要让这种可以改变的简单控制在芯片设计时就存在, 而且同时还应该使这种改变相对容易, 比较通用, 并且与芯片的其它设计部分尽量不相关。为了满足上述的要求, 在FPGA中嵌入一个比较理想的选择, 而这个即通用又控制简单的IP核最好选择8051微处理器。 在FPGA中植入8051后, 还可在上面实现简单的TCP/IP协议, 以支持远程访
[嵌入式]
ASML:H1存储器需求续强,逻辑IC营收看增
全球半导体微影技术领导厂商艾司摩尔(ASML),2014年业绩成长逾一成。基于2014年第四季的28亿欧元未出货订单(backlog),公司预期2015年上半年来自于记忆体客户的产品营收将持续强劲,来自逻辑IC客户的营收也可望比2014年下半年成长。 艾司摩尔(ASML)公布2014第四季财报及合并年营收,2014年第四季营收净额(net sales)达到14.9亿欧元,毛利率(gross margin)为44%。2014全年营收总额(sales)58.6亿欧元,净收益(net profit)为12亿欧元。2015第一季营收净额(net sales)预估为16亿欧元,毛利率(gross margin)预估为47%。
[半导体设计/制造]
定时器实现简单时钟功能
#include reg52.h #define PORTLEN P0 sbit bit_select = P2^0; sbit seg_select = P2^1; unsigned char src = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char qrc = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char second1 ; unsigned char shi = 0; unsigned char fen =
[单片机]
彭博社:中国台湾存储主控大厂慧荣科技有意出售
据彭博社报道,知情人士透露,中国台湾NAND快闪存储器控制芯片大厂Silicon Motion Technology Corp.正在探索潜在的出售交易。 知情人士说,这家总部位于中国台湾的公司正在与顾问合作,与潜在的收购方进行谈判。不过,知情人士也表示,目前尚未做出最终决定,该公司仍可能选择不出售。 根据官网显示,Silicon Motion 生产用于固态存储设备的 NAND 闪存控制器。它还提供数据中心以及专业的工业和汽车固态驱动器。Silicon Motion 于 1995 年在加利福尼亚州圣何塞成立,在中国台湾、香港地区和美国设有公司办事处。该公司报告称,截至 12 月 31 日的三个月净收入为 6060 万美元,比第三季
[手机便携]
应用软件运行速度提升16倍:Lightbits与Ceph的存储性能对比
概述 云计算和基于容器的应用是推动当今IT领域产生重大变革的两大趋势。与其他技术和方法相比,二者都能够以更高的灵活性和更低的成本去运行和操作应用,因此日益受到欢迎。然而,在所有新的机遇面前,要实现潜在优势也都会有巨大的挑战。 层出不穷的新技术通常会对业务运营产生渐进式的影响。但是,以云计算作为运行模式,结合管理云原生应用的Kubernetes——这一做法已经改变了信息技术的交付、管理和使用方式。 此外,为支持这些环境而设计的系统需要选择计算、网络,尤其是存储系统,这些系统具备高度可扩展的容量和性能,而无需采用传统管理方式。Kubernetes提供机制,帮助应用以透明的方式利用多种计算和存储资源。但是,要确保应用对持久
[网络通信]
应用软件运行速度提升16倍:Lightbits与Ceph的<font color='red'>存储</font>性能对比
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved