"); //-->
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执行。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。