[讨论] 《TMS320F281x Boot ROM Serial Flash Programming》

安_然   2011-11-7 13:29 楼主
摘要

本应用报告描述了TI Flash应用编程接口(API)的应用,此API是TI Flash算法的软件接口。在使用本报告之前,注意需懂得Flash API文档的基础。本文档不能取代Flash API文档,而是指导你关注包含Flash API文档的一系列TI资料中最重要的地方。详细参考文献列表参见“参考文献”一节。

目前,为TMS320F281x芯片进行在线(in-circuit)串行Flash烧写的可选方案是Spectrum Digital公司的SDFlash。SDFlash是一款卓越的基于Windows的对TMS320F281x芯片进行在线(in-circuit)烧写的软件,遵循IEEE标准1149.1-1190,IEEE标准测试访问接口和边界扫描架构或系统通讯接口(SCI)。推荐使用GUI方式。如果你手头没有安装了Windows的PC,本文档将帮助你配置一个定制测试设备。

在本文档的适当章节可找到样例软件。本文档使用的硬件包括:
● Spectrum Digital公司的F2812 eZdsp(TM)和IEEE标准1149.1-1190(JTAG)仿真器(XDS510(TM) USB)
● Link-research公司的RS-232接口板
本应用报告讨论的工程附属代码和源代码可从
http://www-s.ti.com/sc/techlit/spraaq2.zip下载。

1 介绍
基于串口(RS-232)对TMS320F2812,TMS320F2811,或TMS320F2810(F281x)进行Flash烧写是目前流行的在线烧写方法。它的一个主要优点是减少了线下Flash烧写带来的损坏风险以及损坏处理。SCI通讯可以从PC、产线在线测试仪或其他处理器中产生。

本文讨论了从F281x 引导ROM SCI-A对Flash烧写的每一个步骤:
● 将内核软件和Flash算法从引导ROM传送到目标RAM
● 向目标Flash传送应用代码并烧写
● 将Flash烧写时间最小化

目标板支持的任何通讯方式都可以与TI提供的Flash烧写API一起使用。下载TMS320F2810, TMS320F2811和TMS320F2812 Flash API (http://www-s.ti.com/sc/techlit/sprc125.zip)。F281x引导ROM提供的将Flash API传送到RAM的方法有:SCI、SPI和并行GPIO。对其他通讯接口,你可以将通讯方式固化在OTP中或Flash的保护扇区中。Figure 1展示了这些引导加载方式。

【Figure 1 F281x Flash引导加载选项】

本应用文档使用引导ROM中的SCI-A Flash引导加载方式。

目前,为TMS320F281x芯片进行在线(in-circuit)串行Flash烧写的可选方案是Spectrum Digital公司的SDFlash。根据Spectrum Digital公司的描述,SDFlash是一款Windows软件,能通过Spectrum Digital公司的JTAG仿真器对目标DSP进行Flash烧写。使用的Flash烧写算法要和DSP的型号、容量相对应。

关于C2000(TM) Flash选项的详细列表,请访问www.ti.com

 

2 方法论

这里描述的过程,关键是:
● F281x引导ROM SCI-A方式
● 通讯内核与Flash API(CKFA)
● 你的应用代码(AppCode)

基本过程是:
● 在引导ROM控制下将CKFA由SCI传送到F281x内部RAM
● 在CKFA控制下将AppCode传送到F281x RAM并烧写到Flash

注意:
本应用报告中使用的CKFA代码源自《TMS320F2810,TMS320F2811 and TMS320F2812 Flash API》(以下简称《Flash API》)Flash API样例代码,因此,《Flash API》对API、随API提供的样例代码,以及本文档来说都是极佳的参考书。在修改CKFA源代码之前,务必详尽阅读《Flash API》。

2.1 将CKFA传送到F281x RAM

首先,通过引导ROM SCI-A方式将CKFA二进制文件传送到非安全RAM中的加载地址(Figure 2)。由于F281x可能处于加锁状态,因此CKFA代码必须首先从非安全RAM开始运行。更多信息,参考《TMS320x281x DSP System Control and Interrupts Reference Guide》(SPRU078)的代码安全模块(CSM)章节。

【Figure 2 将CKFA传送到RAM加载地址】

引导ROM代码一旦结束CKFA传输,就将控制权由F281x CPU转移给CKFA(Figure 3)。在CSM被解锁后,CKFA代码可以访问所有内部RAM和Flash。

【Figure 3 CKFA将自己传送到RAM运行地址】

CKFA代码使用的cmd文件定义了加载地址。如果解锁成功,CKFA代码将自己的主要部分从非安全RAM中的加载地址拷贝到安全RAM中的运行地址。如果解锁不成功,CKFA会将状态通过SCI发出来。

CKFA的目标不是使用安全RAM,而是使H0大RAM可用于上传AppCode。如果CKFA软件足够小,则它将被传送到M0/M1非安全RAM,并从那里执行。

2.2 传送应用代码并烧写

在CKFA代码开始执行并控制了目标DSP的SCI-A外设的情况下,应用代码的二进制文件被传送到4K word RAM buffer 1 (Figure 4). 这个buffer满了以后,开始Flash烧写,并且CKFA代码将应用代码的下一个4K word传送到RAM buffer 2 (Figure 5)。

【Figure 4 CKFA将AppCode传送到RAM buffer #1】

Flash API函数提供了一个call-back函数,当烧写Flash时,它允许SCI继续将数据传送到RAM。CKFA代码使用call-back函数功能烧写Flash:
● 当向RAM buffer 2传送下一个AppCode块时,从RAM buffer 1烧写Flash;
● 当向RAM buffer 1传送下一个AppCode块时,从RAM buffer 2烧写Flash;

当RAM buffer 1填满时,Flash烧写就开始了。当烧写Flash时,SCI的16级FIFO仍在持续的接收SCI字符,从而减少了总的烧写时间。

本应用文档中使用的方法要求对F2810的整个64K word空间都可以访问。这也适用于F2811和F2812的128K word Flash。Flash的所有地址都应可配置。因此,本文中的代码的Flash烧写开始地址,对于F2810都是固定的0x3E8000,对于F2811都是固定的0x3D8000。芯片的memroy map和Flash扇区参见附录A和附录B。

【Figure 5 CKFA开始Flash烧写】

2.3 烧写结束,定义应用代码的Entry Point

当烧写结束时,F281x程序计数器指向Flash的entry point(0x3F7FF6)(Figure 5与附录B)。DSP现在已经准备好运行烧写在Flash中的应用代码了。如果引导GPIO引脚被配置为Flash执行模式,则在重启后将运行这些代码(Figure 6)。

【Figure 6 Flash烧写结束】

3 过程

本应用报告描述的Flash烧写步骤包括:准备应用代码、准备CKFA软件、建立串行通讯、烧写Flash。下面的章节将详细说明这些步骤。

3.1 准备应用代码

要将应用代码烧写到Flash,CKFA代码需先通过SCI接收应用代码的二进制文件,然后对全部Flash地址区域进行烧写。CKFA代码要求应用代码做如下事情:
● 填充未用的Flash地址区域
● 为SCI单独创建一个二进制文件

【Figure 7 AppCode文件处理过程概览】

3.1.1 填充未用的Flash地址区域

在AppCode通过SCI传送到RAM并随后烧写到Flash过程中,CKFA软件控制DSP。AppCode必须被配置为填满Flash所有地址区域,包括未用到的地址。这样CKFA处理的就是连续的块数据,可以减少Flash烧写时间。

另外,在未用到的地址区域填充特定的固定数值会增强系统的健壮性。如果用一个已知的非法操作码填充未用地址区域,则当应用软件从程序地址之外的地址取指令时(软件bug),就会进入非法指令陷阱。0xFFFF就是这样一个非法操作码,详见《TMS320C28x DSP CPU and Instruction Set Reference Guide》(SPRU430)。

使用0xFFFF填充Flash未用地址区域还会减少Flash烧写时间,因为Flash在烧写时仅烧写值为0的位,不烧写值为1的位。F281x出货时,TI是全部擦除过的,也就是说每个Flash地址在出货时都是0xFFFF。因此,在一个新的芯片上,未用地址区域都是推荐值0xFFFF。

3.1.1.1 根据存储区是64K word还是128K word选择cmd文件

随本应用报告提供了适用于64K word的F2810和128K word的F2811/F2812的cmd文件。如Figure 8所示,F2810.cmd包含在AppCode工程中,却排除在build过程之外,因为F2810.cmd文件的图标没有向下的小箭头。

【Figure 8 适用于128Kw的AppCode工程】

你可以为工程中每个文件指定build属性,例如排除在工程build之外等等。要设定文件的build属性,右键单击该文件,选择"File Specific Options"。取消"Exclude file from build"前面的勾,则F2812.cmd被包含在下一次工程build中(Example 12),勾选此项,则被排除。只能从F2812.cmd和F2810.cmd中选一个,取决于你的应用软件存储器要求。

【Figure 9 将一个cmd文件排除在build之外】

在改变某个文件build属性之后,需要重新编译链接工程。

3.1.1.2 使用链接器填充未用的Flash地址区域

Figure 7展示了AppCode从源代码到二进制文件的build过程。在链接阶段可以填充未用的Flash地址区域。链接器使用cmd文件定义目标处理器的存储区。随后它将AppCode的程序段和数据段放在这些存储区中。如果存储区没用完,可以使用一个填充值,保证所有的地址区域都被加载。Example 1展示了填充值0xFFFF是如何被用来填充存储区FLASHE,FLASHD和FLASHC的未用区域的。注意FLASHB没有填充值。下一节将讨论hex转换器用0xFFFF填充FLASHB区。

Example 1. 用0xFFFF填充未用地址区域的cmd文件
MEMORY
{
PAGE 0:    /* Program Memory */
   RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
   FLASHE      : origin = 0x3E8000, length = 0x004000,  fill =0xFFFF     /* on-chip FLASH */
   FLASHD      : origin = 0x3EC000, length = 0x004000,  fill =0xFFFF     /* on-chip FLASH */
   FLASHC      : origin = 0x3F0000, length = 0x004000,  fill =0xFFFF     /* on-chip FLASH */
   FLASHB      : origin = 0x3F4000, length = 0x002000     /* on-chip FLASH */
  
Example 2展示了链接AppCode产出的MAP文件。注意填充值0xFFFF在最右边列出,并且填充值与cmd文件中定义的存储区相关联。

FLASHB区没有关联的填充值,MAP文件显示出它有0x2000的地址区域未使用。它将在下一节中使用hex转换器填充。

Example 2. 用0xFFFF填充未用地址区域的MAP文件
******************************************************************************
        TMS320C2000 COFF Linker PC v4.1.0                     
******************************************************************************
OUTPUT FILE NAME:   <./Debug/AppCode.out>
ENTRY POINT SYMBOL: "_c_int00"  address: 003ec000

MEMORY CONFIGURATION

                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RAML0                   00008000   00001000  00000086  RWIX
         FLASHE                  003e8000   00004000  00004000  RWIX  ffff
         FLASHD                  003ec000   00004000  00004000  RWIX  ffff
         FLASHC                  003f0000   00004000  00004000  RWIX  ffff
         FLASHB                  003f4000   00002000  00000000  RWIX
         FLASHA                  003f6000   00001f80  00001f80  RWIX  ffff
         CSM_RSVD                003f7f80   00000076  00000076  RWIX
         BEGIN                   003f7ff6   00000002  00000002  RWIX
         CSM_PWL                 003f7ff8   00000008  00000008  RWIX
         ROM                     003ff000   00000fc0  00000000  RWIX
         RESET                   003fffc0   00000002  00000000  RWIX
         VECTORS                 003fffc2   0000003e  00000000  RWIX
        
        
3.1.1.3 使用hex转换器填充未使用Flash地址区域

hex转换器(HEX2000)将链接器产出的COFF格式输出转换为ASCII hex文件。与链接器类似,此ASCII hex文件的格式可以由一个cmd文件控制。Example 3展示了AppCode使用的F2810 HEX2000 cmd文件(AppCode_hex_2810.cmd)。HEX2000的文档参见《TMS320C28x Assembly Language Tools User's Guide》(SPRU513)第11章。

Example 3. AppCode HEX2000 cmd文件
AppCode.out

-map AppCode_hex.map
-o AppCode.hex
-m
-memwidth 16
-image

ROMS
{
 FLASH2810: origin = 0x3e8000, len = 0x10000, romwidth = 16, fill = 0xFFFF
}

在Example 4中,FLASHB的填充值是0xFFFF,其他Flash区由链接器填充,它们的填充值由$fillxxx开头的标识符代表。

Example 4. 使用0xFFFF填充值的hex转换器MAP文件
********************************************************************************
TMS320C2000 COFF/Hex Converter                                            v4.3.0
********************************************************************************

INPUT FILE NAME: <AppCode.out>
OUTPUT FORMAT:   Motorola-S

PHYSICAL MEMORY PARAMETERS
   Default data width   :  16
   Default memory width :  16
   Default output width :   8

OUTPUT TRANSLATION MAP
--------------------------------------------------------------------------------
003e8000..003f7fff  Page=0  Memory Width=16  ROM Width=16  "FLASH2810"
--------------------------------------------------------------------------------
   OUTPUT FILES: AppCode.hex [b0..b15]

   CONTENTS: 003e8000..003e80ff   .econst Data Width=2  
             003e8100..003ebfff   $fill000 Data Width=2  
             003ec000..003ec3b9   .text Data Width=2  
             003ec3ba..003ec43f   ramfuncs Data Width=2  
             003ec440..003ec458   .cinit Data Width=2  
             003ec459..003effff   $fill001 Data Width=2  
             003f0000..003f3fff   $fill002 Data Width=2  
             003f4000..003f5fff   FILL = 0000ffff
             003f6000..003f7f7f   $fill003 Data Width=2  
             003f7f80..003f7ff5   csm_rsvd Data Width=2  
             003f7ff6..003f7ff7   codestart Data Width=2  
             003f7ff8..003f7fff   csmpasswds Data Width=2
  


3.1.2 创建AppCode二进制文件

至此,所有未使用的Flash地址区域已经被填充了。本节将阐述如何创建适于CKFA SCI传输与Flash烧写的AppCode二进制文件,见Figure 7。

本应用报告已经使用了HEX2000产出的1个ASCII格式文件,但有2个缺点:
● Flash烧写需要的每8bit二进制数据,在ASCII文件中要占用16bit
● 这个转换(16bit转换为8bit)将使Flash烧写时间延长

FileIOShell.exe用于将HEX2000产出的ASCII格式转换为二进制格式。此软件被设计为将Motorola-S记录格式(16bit,big endian)转换为二进制文件格式。关于Motorola-S记录格式参见附录D。

Example 3展示了HEX2000根据AppCode_hex_2810.cmd生成Motorola-S格式的ASCII文件。AppCode_hex_2810.cmd的语法如下:
● AppCode.out               =COFF可执行输入文件
● -map AppCode_hex.map      =HEX2000 MAP产出文件(其内容见Example 2)
● -o AppCode.hex            =产出的hex文件
● -m                        =指定Motorola-S记录格式
● -memwidth 16              =16bit存储位宽,big endian
● -image                    =允许使用fill参数

产出文件是AppCode.hex,它将被FileIOShell.exe转换为二进制格式,从而适于CKFA SCI传输和Flash烧写。

Example 5. AppCode.hex(ASCII文件阅读器),Mot-S格式,FileIOShell.exe的输入文件
S00600004844521B
S2223E8000C1F5003EC1F5003EC1F5003EC1F5003EC1F5003EC1F5003EC1F5003EC1F5BD
S2223E800F003EC1F5003EC1F5003EC1F5003EC1F5003EC1F5003EC0B0003EC0B5003EAD
S2223E801EC0BA003EC0BF003EC0C4003EC0C9003EC0CE003EC0D3003EC0D8003EC0DDF3

Example 6. AppCode.bin(二进制文件阅读器),二进制格式,FileIOShell.exe的输出文件
C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E
C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E
C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E C1 F5 00 3E
C1 F5 00 3E C0 B0 00 3E C0 B5 00 3E C0 BA 00 3E
C0 BF 00 3E C0 C4 00 3E C0 C9 00 3E C0 CE 00 3E
C0 D3 00 3E C0 D8 00 3E C0 DD

3.1.2.1 从CCS生成AppCode.bin

在AppCode工程中,build配置为每次build时调用AppCode_COFF2BIN_281x.bat。这种批处理文件有2个,一个适用于64K word Flash的F2810(AppCode_COFF2BIN_2810.bat),一个适用于128K word Flash的F2811/F2812(AppCode_COFF2BIN_2812.bat)。这2个文件基本相同,不同的地方在于为HEX2000选择不同的cmd文件,以定义2种Flash范围。

Example 7. AppCode_COFF2BIN_2810.bat
cd debug

C:\CCStudio_v3.1\C2000\cgtools\bin\hex2000.exe AppCode_hex_2810.cmd

FileIOShell.exe -i AppCode.hex -o AppCode.bin

Example 8. AppCode_COFF2BIN_2812.bat
cd debug

C:\CCStudio_v3.1\C2000\cgtools\bin\hex2000.exe AppCode_hex_2812.cmd

FileIOShell.exe -i AppCode.hex -o AppCode.bin

配置CCS工程build选项,以执行与工程存储区相关的批处理文件。

【Figure 10 AppCode CCS工程-配置COFF2BIN批处理文件】

3.1.2.2 不借助CCS生成AppCode.bin

如果不使用CCS,则需将COFF或Motorola-S记录文件转换为适于CKFA SCI传输和Flash烧写的二进制文件。如果是COFF文件,则使用AppCode_COFF2BIN_2810.bat或AppCode_COFF2BIN_2812.bat。如果是Motorola-S记录文件,则使用FileIOShell Only.bat文件。

Example 9. FileIOShell Only.bat文件
FileIOShell.exe -i AppCode.hex -o AppCode.bin

3.1.3 计算应用软件的期望校验和

应用代码的校验和可以用CCS的Flash烧写器插件计算出来。CKFA软件使用校验和检查应用代码是否正确的烧写到Flash中。

3.1.3.1 使用CCS计算校验和

烧写Flash至少一次之后,就可以使用CCS片内Flash烧写器计算校验和。Flash被主机PC通过JTAG扫描,将存储区内每个16bit数据相加,得到总和。在Figure 11中,片内Flash烧写器计算出应用软件的校验和为0x6E13。

计算出校验和后,要把它加入CKFA软件中,以便在烧写完应用代码后进行核对。

【Figure 11 CCS的On-Chip Flash Programmer计算校验和】

3.1.3.2 不借助CCS计算校验和

CKFA在执行开始时计算Flash校验和,以确定Flash是否已擦除过。这个过程不借助CCS就计算出AppCode校验和。AppCode必须通过CKFA烧写到Flash。烧写完成后,如果计算的校验和与期望校验和不同,CKFA会报告一个校验和错误,并且将计算校验和发出来。这个值是正确的AppCode校验和,可以把它包含在CKFA软件中,用于下一次Flash烧写后的核对。

【Figure 12 CKFA在启动时计算AppCode的校验和】

3.2 准备CKFA

CKFA代码包含通讯内核与Flash API。先前已提及,CKFA是通过F281x SCI-A引导代码传送到F281x RAM中的。传送完成后,SCI-A引导代码将CPU控制权交给CKFA代码,CKFA随后将应用代码传送到RAM中,然后将其烧写到Flash。要完成这些,步骤如下:

1. 配置F281x PLL,调整CPU时钟频率
F2812 eZdsp 使用30MHz晶振,因此,PLL配置为150MHz(最大值)

注意:如在《TMS320x281x Boot ROM Reference Guide》(SPRU095)中所述,引导ROM不改变PLL,因此,根据F281x是被CCS软件重启还是重新上电,PLL的设置是不一样的。

2. 用AppCode密码更新CKFA,以解锁F281x的CSM模块
CKFA软件要求CSM模块是解锁的。TI的芯片出厂时,片内Flash是完全擦除过的,CSM也是解锁的。因此第一次烧写不要求解锁过程。关于CSM的更多信息,参见《TMS320x DSP System Control and Interrupts Reference Guide》(SPRU078)。

3. 配置CKFA适用于64KW或128KW的Flash

4. 为SCI传送创建一个二进制文件


【Figure 13 CKFA文件处理概览】

3.2.1 将CKFA软件中的AppCode校验和更新为期望值

期望的AppCode校验和保存在Example_Flash281x_API.c中。计算好一个新的校验和后,用该校验和更新CHECKSUM_EXPECTED常量定义。CKFA软件用这个值和它自己计算的校验和相比较。更新校验和后,需要重新编译CKFA软件,生成新的CKFA二进制文件。

Example 10. Example_Flash281x_API.c中CKFA使用的期望校验和
#define CHECKSUM_EXPECTED 0x6E13

3.2.2 为F281x目标板晶振频率配置CKFA软件

Example_Flash281x_API.h中,常量PLLCR_VALUE定义PLL倍频设置。Flash281x_API_Config.h中,常量CPU_RATE定义系统的CPU频率设置。Flash的时间参数基于这些设置,如果设置的不正确,Flash可能损坏。

检查上述文件的内容,确认PLLCR_VALUE和CPU_RATE符合你的F281x目标板,如果不符合,修正设置值,将CKFA软件重新编译、链接和生成二进制文件。

Example 11. Example_Flash281x_API.h中定义的PLL设置
/*-----------------------------------------------------------------------------
     Specify the PLLCR (PLL Control Register) value.  

      Uncomment the appropriate line by removing the leading double slash: //
      Only one statement should be uncommented.

      The user's application must set the PLLCR Register before calling any
      of the Flash API functions.
 
      Example:  CLKIN is a 30MHz crystal. 
                The user wants to have a 150Mhz CPU clock (SYSCLKOUT = 150MHz). 
                In this case, PLLCR must be set to 10 (0x000A)
                Uncomment the line: #define PLLCR_VALUE 10
                Comment out the remaining lines with a double slash: //
-----------------------------------------------------------------------------*/

#define PLLCR_VALUE  0x000A     // SYSCLKOUT = (OSCLK*10)/2
// #define PLLCR_VALUE   0x0009     // SYSCLKOUT = (OSCLK*9)/2
// #define PLLCR_VALUE   0x0008     // SYSCLKOUT = (OSCLK*8)/2

Example 12. Flash281x_API_Config.h中定义的CPU_RATE设置
/*-----------------------------------------------------------------------------
   2. Specify the clock rate of the CPU (SYSCLKOUT) in nS.

      Take into account the input clock frequency and the PLL multiplier
      your system will use.
 
      Use one of the values provided, or define your own.
      The trailing L is required tells the compiler to treat
      the number as a 64-bit value. 

      Only one statement should be uncommented.

      Example:  CLKIN is a 30MHz crystal. The PLL is enabled.
 
                If your application will set PLLCR = 0xA then the CPU clock
                will be 150Mhz CPU (SYSCLKOUT = 150MHz). 

                In this case, the CPU_RATE will be 6.667L
                Uncomment the line:  #define CPU_RATE  6.667L  
-----------------------------------------------------------------------------*/

#define CPU_RATE    6.667L   // for a 150MHz CPU clock speed (SYSCLKOUT)
//#define CPU_RATE    7.143L   // for a 140MHz CPU clock speed (SYSCLKOUT)
//#define CPU_RATE    8.333L   // for a 120MHz CPU clock speed (SYSCLKOUT)

3.2.3 正确配置CKFA中的Flash范围(64KW或128KW)
在Flash281x_API_Config.h中指定一个设备。通过把设备宏定义为1来选择F2810、F2811还是F2812。

Example 13. 为CKFA指定Flash范围是64KW还是128KW
Setting for using the F2810 (Flash281x_API_Config.h)

#define FLASH_F2810   1
#define FLASH_F2811   0
#define FLASH_F2812   0

Setting for using the F2811 (Flash281x_API_Config.h)

#define FLASH_F2810   0
#define FLASH_F2811   1
#define FLASH_F2812   0

3.2.4 创建CKFA二进制文件

配置好CKFA的频率、密码和Flash范围后,必须为引导ROM SCI-A传输创建CKFA的二进制文件。

3.2.4.1 使用CCS重新build CKFA软件

在对CKFA软件做修改后,使用本应用报告包括的CCS工程重新build之。CCS工程包括额外的build步骤,来将链接产出的文件转换为适于SCI-A bootloader的二进制文件。注意,在每次重新build CKFA软件或你自己的应用软件时,必须使用本文包含的CCS工程。

从CCS中打开CKFA工程。分别修改Example_Flash281x_API.h和Flash281x_API_Config.h中的PLLCR_VALUE和CPU_RATE,从Project菜单选择Rebuild All。

3.2.4.2 CKFA CCS工程细节

CKFA软件的CCS工程包含如下文件(Figure 14)

【Figure 14】

注意CKFA软件是基于Flash API样例代码的。它们的区别是,Flash API样例代码将代码传送到RAM不是通过SCI-A引导操作,而是直接拷贝到RAM中的,因为Flash API已经固化在F281x Flash中了。这是现场编程的一种典型方案。本文描述的SCI-A引导方式是出厂前产品编程的典型方案。

3.2.4.3 从CCS生成CKFA.bin

CKFA工程build选项里的Final build steps是调用一个批处理文件将build产出的COFF可执行文件转换为适于SCI通讯的二进制格式。(Figure 15)

【Figure 15】

F281x SCI-A引导方式要求传输的文件是二进制格式的,不能传输ASCII-Hex格式。要把COFF可执行格式转换为二进制格式,首先要把COFF格式通过TI hex转换工具转换为ASCII-Hex格式。本应用报告使用Intel风格ASCII-Hex格式。

批处理文件CKFA_COFF2BIN.bat内容如下。它调用C2000 HEX转换工具,将链接器产出的COFF可执行文件转换为ASCII-Hex(Intel)格式。关于HEX转换工具的更多详细信息,参见《TMS320C28x Assembly Language Tools User's Guide》(SPRU513)。

Example 14. CKFA_COFF2BIN.bat
cd debug

C:\CCStudio_v3.1\C2000\cgtools\bin\hex2000.exe CKFA_hex.cmd

HEX2BIN CKFA.hex

CKFA_hex.cmd中含有HEX2000转换工具的命令行指令。这个过程的关键产出是CKFA.hex文件,它作为HEX2BIN转换器的输入,生成二进制文件。
● CKFA.out            = COFF可执行格式输入文件
● -map CKFA_hex.map   = HEX2000 MAP产出文件
● -o CKFA.hex         = 产出的Hex文件
● -I                  = 指定Intel记录格式

Example 15. CKFA_hex.cmd
CKFA.out

-boot
-sci8
-map CKFA_hex.map
-o CKFA.hex
-I

文件变成ASCII-Hex格式后,就可使用任一容易获取的二进制转换工具进行转换。在本应用报告中将Intel hex格式转换为二进制格式的工具是HEX2BIN(http://gnuwin32.sourceforge.net/)。

CKFA.bin遵循SCI-A引导加载选项要求。8bit SCI数据流格式参见F.3章节。

Example 16. CKFA.bin(二进制阅读器),HEX2BIN.exe的二进制产出
AA 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F2 02 6B 01 00 00 00 01 04
FE 1F 76 C1 01 1A 1A 00 40 1A 18 FF DF 1A 1A 00 20 00 8F 6C 02 40 76 37 01 00 8F 6C 02

KeyValue = 0x08AA
Reserved = 0x0000 ...
Entry Point = 0x000002F2
Block #1 Size = 0x016B
Block #1 Destination = 0x00000100

3.3 用引导ROM的SCI-A代码建立通讯

下面的步骤是必需的:用F281x的引导ROM代码使能SCI通讯。


3.3.1 配置F281x目标板的SCI-A引导方式

重启后,F281x扫描4个GPIO口,以确定引导方式。默认模式是Jump to FLASH,也就是这4个GPIO口都悬空。4个GPIO口电平对应的引导方式参见Table 1。GPIOF4有一个内部上拉电阻,通过它可以将Jump to FLASH设为默认。

Table 1. 引导模式GPIO引脚

引导模式                               GPIOF4(SCITXDA)  GPIOF12(MDXA)  GPIOF3(SPISTEA)  GPIOF2(SPICLK)
-------------------------------------------------------------------------------------------------------
GPIO有无内部上拉                             有               无              无              无
跳转到Flash/ROM地址0x3F7FF6                  1                X               X               X
(在重启之前这里需烧写一个跳转指令,以执行期望的重定向代码)
调用SPI_Boot从外部串行SPI EEPROM加载(1)       0                1               X               X
调用SCI_Boot加载SCI-A                       0                0               1               1
跳转到H0 SARAM地址0x3F8000(2)                0                0               1               0
跳转到OTP地址0x3D7800                        0                0               0               1
调用Parallel_Boot从GPIO B口加载              0                0               0               0
-------------------------------------------------------------------------------------------------------
(1) 必须注意SPICLK翻转效应引起的外部逻辑,可能使选择引导模式出错
(2) 如果选择的引导模式是Flash,H0,或OTP,则bootloader不加载任何外部代码。

Table 2给出本应用报告中使用的F2812 eZdsp开发板选择SCI_Boot方式的跳线设置(略)

3.3.2 配置通讯串口硬件

F2812 eZdsp开发板本身没有RS-232收发器,本应用报告使用Link Research公司的LR-2812COM接口板直接与F2812 eZdsp开发板相连,同时也提供了与PC的RS-232接口。Link Research公司的LR-2812COM接口板详细产品信息可从http://www.link-research.com/下载。

3.3.3 配置PC串口软件

本报告中使用的PC端串口通讯软件是超级终端。首先配置通讯格式与引导ROM SCI-A引导方式相同,开始时波特率要设的低一些,例如9600 bps,然后再增加到38400或57600 bps。这可以避免一开始就遇到通讯问题。

Figure 16给出了COM1串行口的配置:
● 115200 bps(推荐从9600 bps开始)
● 8-bit数据位
● 无校验
● 1位停止位
● 无流控制

【Figure 16. 超级终端通讯配置】

配置好超级终端以后,给F281x开发板下电后再上电,这样就制造了一个重启,F281x 引导ROM会扫描4个引导GPIO口。如果已经配置为SCI-A引导模式,F281x将开始执行引导ROM中的SCI_Boot代码。

SCI_Boot代码首先使用SCI端口的自动波特率特性配置SCI-A口的波特率。要将F281x SCI-A的波特率与超级终端的锁定,敲一个'a'或'A',这是SCI的自动波特率特性所要求的。见《TMS320x281x Boot ROM Reference Guide》(SPRU095)中引导ROM代码流程图。引导ROM将字符回送到超级终端,则波特率就配置好了(见Figure 17)。自动波特率功能文档见《TMS320x28xx, 28xxx DSP Serial Communication Interface (SCI) Reference Guide》(SPRU051)。

【Figure 17. 从F2812 SCI 自动波特率逻辑发回的字符】

如果键入的字符没有发回,检查:
● 硬件是否连接到位
● F2812目标板有没有下电再上电
● F2812 引导GPIO引脚(GPIOF4,F12,F3,F2)是否配置为SCI引导模式
● 超级终端设置是否正确
如果上述各项都检查过了,则降低超级终端的波特率设置,重新开始锁定过程。

3.4 Flash烧写过程

应用代码和CKFA软件准备好,并且建立好利用引导ROM SCI代码进行的串口通讯之后,就可以开始Flash烧写过程了。Flash烧写包括CKFA软件传送、解锁SCM、应用代码传送、应用代码校验。

3.4.1 传送CKFA软件

设定目标板的波特率,准备传送CKFA。在超级终端上,点击“传送”——“发送文本文件”,从CKFA工程Debug文件夹中选择CKFA.bin。

SCI引导ROM代码会将发送的字符回送给超级终端,这可以用来检验是否发送成功。本应用报告采用的方法不是检验每个发送的字符,而是检验烧写后的Flash计算的校验和。

在Figure 18中,超级终端显示出CKFA代码已传送到RAM中并执行,CSM也已解锁。

【Figure 18. 超级终端-CKFA软件准备更新F281x波特率】

3.4.2 解锁CSM

如果CSM被锁住并且CKFA软件中的解锁密码不对,超级终端会如Figure 19所示。更正Example_Flash281x_CsmKeys.asm中的解锁密码,重新编译CKFA软件,复位DSP,重新传送CKFA。

【Figure 19. 超级终端-F281x上锁引起的CKFA传送失败】

3.4.3 使用CKFA接口准备目标

CSM解锁后CKFA软件开始执行。CKFA软件使能并配置PLL。在本应用报告中,DSP系统频率为150MHz。如果频率有变,CKFA软件需更新SCI-A波特率。键入'a'或'A'重新使目标板与超级终端波特率锁定,如Figure 20所示。如果无法锁定波特率,降低超级终端的波特率然后重试。

波特率更新后,CKFA软件计算Flash校验和并通过SCI-A发送。你可以利用该校验和确定:
● 如果Flash已擦除,校验和应该是0x0000。擦除步骤可忽略。
● 如果校验和与应用软件的期望校验和相同,则烧写成功。
● 如果校验和与期望值不同,则Flash需擦除,你必须对提示Erase FLASH?回答yes('y')(Figure 20)。
F281x出厂时TI已经擦除了Flash,因此你可以直接烧写Flash。

【Figure 20. 超级终端-CKFA校验和检测出Flash尚未擦除】

如果正在擦除,注意:擦除过程不能被打断。等待擦除过程结束。Flash擦除后你会收到erasing done。此时,CKFA软件已经准备好接受应用代码(见Figure 21)。

【Figure 21. 超级终端-CKFA软件准备好接受和烧写应用代码】

3.4.4 传送应用代码

要利用超级终端传送应用软件,点击“传送”——“发送文本文件”,从AppCode工程Debug文件夹中选择AppCode.bin。应用代码传送并烧写完成后,CKFA软件会计算Flash校验和。校验和通过SCI-A发送并与Example_Flash281x_API.c中保存的值相比较。如果相同,则结果会通过SCI-A发送回来,告知用户校验和验证通过(Figure 22)。

【Figure 22. 超级终端-CKFA软件已经传送并烧写了应用代码】

3.4.5 确认应用代码执行

F281x现在准备好从Flash执行应用代码。
1. 给F281x目标板下电。
2. 将引导GPIO配置为Jump to Flash模式。
3. 给F281x目标板上电,则应用代码会从Flash执行。




4. Flash烧写加速

本应用报告也致力于减少烧写时间,基于此,本报告的方法论考虑的是:
● 轮流利用2个4KW缓冲区,使应用代码的传送得以持续不断
● 消除AppCode.bin中的无关数据带来的开销
● 在烧写前检查Flash,如果没必要擦除,就跳过擦除步骤
● 所有未用存储区填入0xFFFF
● 通过CKFA代码设置PLL,最大化SCI-A波特率

在《TMS320F2810, TMS320F2811, TMS320F2812, TMS320C2810, TMS320C2811, TMS320C2812 Data Manual》(SPRS174)中,列有典型烧写时间:对16KW扇区是500ms,对8KW扇区是250ms。F2810有3个16KW和2个8KW扇区,因此,整个64KW Flash的典型烧写时间是2s。

增大波特率可以显著减少烧写时间。Table 3给出了Flash烧写时间,参考《TMS320F2810, TMS320F2811, TMS320F2812, TMS320C2810, TMS320C2811, TMS320C2812 Data Manual》(SPRS174)。
【Table 3】

4.1 PC到F281x目标板

根据超级终端的计时器,RS-232波特率设置为38400bps时,烧写64KW的应用代码耗时37秒。波特率提高到57600bps时,烧写时间减少到24秒。

4.2 ICT到F281x目标板

如果直接连接到F281x,波特率可以增加很多;SCI-A既能收也能发。RS-232的传送带宽是被限制的,显著延长了烧写时间。在本应用报告中,使用仿真ICT(EICT)硬件,烧写64KW的AppCode只用了1.4秒。

4.2.1 方法论

用PC将CKFA和AppCode二进制文件传送到EICT的RAM中。F2812 eZdsp代表EICT。CKFA二进制文件存储在eZdsp的内部RAM中。AppCode二进制文件存储在F2812 eZdsp中。F2812 eZdsp有64KW的外部RAM。

从PC到EICT的传输是通过RS-232和超级终端进行的,速率相对来说较慢。

【Figure 23】

从EICT到F281x目标板的传输较快,因为不使用RS-232收发器。2块板子上DSP的SCI引脚直接相连,就像在产线上一样。CKFA控制F281x目标板及其PLL设置。以上这些使得EICT与F281x目标板的传输波特率可达1.875Mbps。

【Figure 24】

4.2.2 Flash烧写加速

理解Flash烧写过程后,让我们看看利用本应用报告中提到的技术烧写Flash需要花多长时间。串行传送64KW或128KW应用代码时,烧写时间与波特率直接相关。

4.2.2.1 从EICT向F281x目标板传送CKFA的波特率设置

目标板引导ROM代码决定了CKFA从EICT传送到F281x的波特率,因为引导ROM在重启时不使能PLL。这样,目标板的CPUCLK取决于输入晶振频率,对F2812 eZdsp来说是30MHz。

重启后,低速外设时钟(LSPCLK)默认为CPUCLK/4,引导ROM代码不会改变LSPCLK。因此LSPCLK为7.5MHz。

SCI波特率寄存器最小值是1。因此重启时F281x目标板最大波特率是468Kbps。

以468Kpbs波特率传送CKFA要比通过RS-232以典型PC(超级终端)波特率——38Kbps或56Kbps——传送要快的多。另外,相对于AppCode动辄128KB或256KB的巨大体积,CKFA二进制文件要小的多(6.4KB)。因此关键是增加传送AppCode的波特率。

EICT:
CPUCLK = 150MHz
LSPCLK = 150MHz/2 = 75MHz
BRR=19
Baud-Rate = LSPCLK/((BRR+1)*8) = 468750 bps

Target:
CPUCLK = 30MHz                              【重启时PLL被旁路,引导ROM不使能PLL】
LSPCLK = 30MHz/4 = 7.5MHz                   【重启后默认除以4】
BRR=1                                       【由SCI自动波特率特性设置】
Baud-Rate = LSPCLK/((BRR+1)*8) = 468750 bps

4.2.2.2 从EICT向F281x目标板传送AppCode的波特率设置

CKFA代码控制F281x目标板,因此SCI波特率可以配置为外部链接的硬件所能支持的最大值。F281x SCI最大波特率为20Mbps,受限于F281x IO缓冲器速度。

CKFA软件配置PLL为×5,因此CPUCLK为150MHz。

CKFA软件配置LSPCLK=CPUCLK/2,因此LSPCLK为75MHz.

本应用报告中使用的硬件的SCI波特率最小值为4,对应于F2812 eZdsp目标板最大波特率1.875Mbps。曾测试过BRR值为3(2.34Mpbs),但引起了串行通讯错误。

EICT:
CPUCLK = 150MHz
LSPCLK = 150MHz/2 = 75MHz
BRR=4
Baud-Rate = LSPCLK/((BRR+1)*8) = 1.875 Mbps

Target:
CPUCLK = 150MHz                              【PLL被CKFA使能】
LSPCLK = 150MHz/2 = 75MHz                    【CKFA设置为除以2】
BRR=4                                        【由SCI自动波特率特性设置】
Baud-Rate = LSPCLK/((BRR+1)*8) = 1.875 Mbps

4.2.3 ICT Flash烧写过程

使用ICT,波特率就可以快的多。在前面的章节中,使用PC进行Flash烧写时,RS-232收发器会进行速度限制。现在,将处理器的串行引脚直接相连,就没有限制了。基于ICT的系统,波特率可以大于2Mbps。在本应用报告中,使用F2812 eZdsp仿真ICT时,波特率达到了1.875Mbps。

4.2.3.1 连接PC与EICT

你必须通过一个RS-232线缆将PC和用作ICT的F2812 eZdsp连接起来。由于F2812 eZdsp没有RS-232收发器,因此使用了Link-Research公司的RS-232接口产品。Link Research公司的LR-2812COM-2接口板详细产品信息可从http://www.link-research.com/下载。

LR-2812COM-2接口板与Spectrum Digital eZdsp的接线(略,Table 4略)

4.2.3.2 连接EICT与F281x目标板

将EICT的SCI-A与目标板的SCI-A接口连接起来,注意EICT的SCITXDA应与目标板的SCIRXDA连接。(Table 5略)

4.2.3.3 准备EICT软件

根据下面的步骤,连接IEEE Std. 1149.1-1990(JTAG)仿真器与EICT。
1. 连接IEEE Std. 1149.1-1990(JTAG)仿真器与EICT。
2. 打开CCS工作空间SCI_FLASH_AppReport.wks。
3. 重启CPU。
4. 加载代码。
5. 运行real-time模式。
6. 将Watch和Memory窗口设置为在real-time模式下持续更新。

4.2.3.4 锁定PC与EICT的波特率

EICT软件首先将EICT硬件的波特率与PC(超级终端)的波特率匹配。在CCS中运行EICT软件,在超级终端中键入'a'或'A'(包括引号)。作为回应,EICT软件会确认EICT波特率已锁定,做好了CKFA二进制文件的传输准备(见Figure 25).

【Figure 25. EICT准备好从PC接收CKFA】

4.2.3.5 从PC将CKFA和AppCode传送到EICT RAM中

按照3.4.1节的步骤,用超级终端传送CKFA软件。在超级终端上,点击“传送”——“发送文本文件”,从CKFA工程Debug文件夹中选择CKFA.bin。

【Figure 26. EICT准备好从PC接收AppCode】

按照3.4.4节的步骤,用超级终端传送AppCode软件。在超级终端上,点击“传送”——“发送文本文件”,从AppCode工程Debug文件夹中选择AppCode.bin。

4.2.3.6 锁定EICT与F281x目标板引导ROM代码的波特率

现在CKFA和AppCode二进制文件都保存在EICT的RAM中。EICT现在可以执行前面所述的标准步骤,但不是使用慢速的超级终端RS-232传输,而是使用EICT快速直连。

EICT将要执行的步骤传送到超级终端上(Figure 27)。PC连接到EICT的SCI-B上,这不会对EICT和目标板通过SCI-A进行的通讯产生干扰。

【Figure 27. EICT准备好开始F281x目标步骤】

4.2.3.7 从EICT将CKFA传送到F281x目标板

让CCS运行在real-time模式,将Watch和Memory窗口配置为持续刷新,给F281x目标板先下电再上电。保持第二个Wathc窗口页打开。对F2812 eZdsp,你需先将5V电源关掉,再重新打开。

注意EICT的SCIA有一个接收错误,典型情况下SciaRegs.SCIRXST.all值为178。按照超级终端上的指令,向SciaRegs.SCIFFTX.bit.SCIRST先写0再写1,以复位EICT的SCIA。注意现在SciaRegs.SCIRXST.all值为0.

设定目标板的波特率。在观察窗口中键入自动波特率字符'a'或'A',SciaRegs.SCITXBUF='a'。注意包括引号。作为回应,目标板会将自动波特率字符发回,你会在Watch窗口的SciaRegs.SCIRXEMU中看到它(97='a').

现在目标板准备好接收CKFA了。在开始传输前,准备CCS的Memory窗口来接收目标板传来的信息。在 Edit菜单中,选择Memory——Fill。将从0x3F8000开始,长0x2000的区域用0x3131(“11”)填充(Figure 28)。

【Figure 28. 准备Memory窗口来接收目标板传来的信息】

在Watch窗口中,将flag_ReadyToTransferCKFA设为0,以启动CKFA传输。当Memory窗口显示“Processor is unlocked. Communication kernel received and executing. Type 'a' to relock baud-rate:(见Figure 29)”时,传输完成。下一步是增加EICT波特率。

【Figure 29. 从EICT向目标板传送CKFA成功】

4.2.3.8 锁定新的最大波特率

在Watch窗口中,将EICT波特率寄存器SciaRegs.SCILBAUD设为4。运行在目标板上的CKFA软件已经使能了SCI-A自动波特率逻辑,以将自身波特率与新的EICT波特率锁定。

在Watch窗口中,将SciaRegs.SCITXBUF设为自动波特率字符('a'或'A')(注意包括引号)。作为回应,目标板会发回自动波特率字符,你会在Watch窗口的SciaRegs.SCIRXEMU中看到它(97='a')(Figure 30).

【Figure 30. CKFA波特率重新与EICT锁定在1.875Mbps】

目标板发回消息“Erase Flash?”,作为回应,在Watch窗口中,将SciaRegs.SCITXBUF设为'y'(注意包括引号)。CKFA软件将擦除目标板的Flash。

在Memory窗口中可以看到,目标板发回消息“Erasing...please wait”.

4.2.3.9 从EICT将AppCode传送到F281x目标板

在Watch窗口中,将fllag_ReadyToTransferAppCode设为0,以开始AppCode传输。当Memory窗口显示“*** erasing done. Ready for application data transfer”(见Figure 31)时,传输完成。

【Figure 31. 将AppCode烧写到目标板Flash成功】

当Memory窗口显示“** application programmed. Flash Checksum=0x6E13. **checksum verified”时,AppCode传输与烧写完成。这与用超级终端烧写结束后收到的信息相同。

烧写时间列在Watch窗口中:

(start_time - end_time) / 150e6 = 1.398 seconds

这是使用F28x CPU递减计数器形成的基准时间。

工程 = 数学+物理+经济

回复评论 (4)

这个要顶。
我做CKFA做完了,分享一些经验,但估计很多理解不全面,欢迎指正。

1.在CKFA.cmd里定义了CKFA写入DSP UnsecuredRAM的位置
SECTIONS
{
.text_unsecured        : > RAMM0M1        PAGE = 0
{
.\debug\obj\unlock_main.obj (.text)
.\debug\obj\DSP281x_CodeStartBranch.obj (.text)
.\debug\obj\Example_Flash281x_CsmKeys.obj (.text)
.\debug\obj\DSP281x_MemCopy.obj (.text)
rts2800_ml.lib (.text)
}
  .econst_unsecured        : > RAMM0M1 PAGE = 0
{
.\debug\obj\unlock_main.obj (.econst)
}
............................
用串口工具将CKFA传送到上述地址暂时存放;

2. CKFA开始运行,开始运行的地址也有定义:
CKFA.cmd
codestart           : > RAMM0M1        PAGE = 0
检查方法:CKFA_hex.map
Entry Point:            0x000002f2
最先运行的是解锁步骤,解锁成功后

3. CKFA 的Unlocak_main.c里
MemCopy(&textLoadStart, &textLoadEnd, &textRunStart);
MemCopy(&econstLoadStart,&econstLoadEnd,&econstRunStart);
main2();
这两句表明要把CKFA自身从UnsecuredRAM复制到securedRAM,复制的目的是运行CKFA 的main2()程序
复制的地址在CKFA.cmd里定义
SECTIONS
.text                    :LOAD = RAMH0_1,
                         RUN = RAML0L1,
                         LOAD_START(_textLoadStart),
                         LOAD_END(_textLoadEnd),
                         RUN_START(_textRunStart),
                         PAGE = 1

.econst            :LOAD = RAMH0_1,
                         RUN = RAML0L1,
                         LOAD_START(_econstLoadStart),
                         LOAD_END(_econstLoadEnd),
                         RUN_START(_econstRunStart),
                         PAGE = 1

4.然后CKFA运行AppCode的传送。
采用双RAM-4KW接受,第一个接受满了,开始烧写Flash;同时用另一个RAM接受下一个4KW。

这里还比较糊涂,就先不班门弄斧了。
点赞  2011-11-8 09:40
多谢2楼分享
工程 = 数学+物理+经济
点赞  2011-11-8 11:51
采用双RAM-4KW接受,第一个接受满了,开始烧写Flash;同时用另一个RAM接受下一个4KW。
这点有大侠搞明白了吗?
点赞  2015-11-30 21:47
thanks very much.
点赞  2016-11-4 13:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复