【转】使用Trace32使用教程之 对FLASH 编程-chiantrace|super trace

在 Trace32使用教程之 的界面中,可以使用菜单,鼠标完成操作,也可以完全使用命令操作。事实上,Trace32使用教程之 内嵌了强大的命令和脚本处理功能。使用 Trace32使用教程之 的命令不仅可以完成所有的功能,而且可以获得比菜单方式更大的操纵性和灵活性。脚本以 .CMM 为后缀。

下面就介绍 Trace32使用教程之 中与 FLASH 操作相关的命令,见下表:


这里列出后面需要使用到命令的详细格式,以便参考。

1. FLASH.Create
格式:

FLASH.Create <unit_number> <physical_range> <sector_size> <family_code>  <bus_width>  <family_code>: I28F001B | I28F200B | ... | TARGET | EEPROM | NOP  <bus_width>: Byte | Word | Long | Quad  

 

例如,定义Am29LV640(16 bit mode, 16 bit bus, 128 sectors, 64Kbyte/sector)

FLASH.RESet  FLASH.Create 1. 0x0 -- 0x7FFFFF 0x10000 AM29LV100 Word

对于采用 "Target controlled flash programming" 方式,familiy_code 必须选择为TARGET。与 FLASH 编程软件的连接由 FLASH.Target 完成。

2. FLASH.Erase
格式:

FLASH.Erase <unit> | <address_range> | ALL  

 

例如:

FLASH.Erase 0x0 -- 0x1FFFF  FLASH.Erase ALL

3. FLASH.Program
格式:

FLASH.Program [<unit> | <address_range> | ALL | OFF]  

 

一旦激活了编程模式,任何对 FLASH 地址空间的写访问操作将会导致对 FLASH 的编程。例如:

FLASH.Program ALL  Data.LOAD.Binary data.bin /Word  <-  装载数据到FLASH空间  FLASH.Program OFF  …  

 

4. FLASH.TARGET
格式:

FLASH.TARGET <code_address> <data_address> [<buffer_size>] [<file>] <code_address>  

 

运行在目标系统上的 FLASH 编程软件被下载到的 RAM 起始地址,占用的大小为FLASH 编程软件本身的大小,另外再加上 32 字节。

  • <data_address>
    参数块的起始地址,大小为 32 字节(参数块)+ <buffer_size> + 256 字节(stack)。
  • <buffer_size>
    从 Trace32使用教程之 软件一次传递给 FLASH 编程软件的数据字节数。建议的缓冲大小为 4KB。
  • <FLASH_algorithm>
    二进制形式的 FLASH 编程软件。

使用上面这些命令进行 FLASH 编程的一般步骤是:

1) 首先使用 FLASH.Create 定义目标 FLASH 的地址空间,类型,及总线配置。

2) 对于"Target controlled flash programming"方式,必须向目标系统加载 FLASH 编程软件。FLASH.Target 命令把 FLASH 编程软件的起始地址,参数块的起始地址,以及缓冲区大小等信息通知 Trace32使用教程之。FLASH.Program 和 FLASH.Erase 命令就会调用确定的 FLASH 编程软件,并传递合适的参数。

3) FLASH.Program 启动编程模式后,如果有数据传输命令执行(如 Data.Set 或者Data.LOAD),Trace32使用教程之 会检查数据传输的地址是否落在 1)中定义的 FLASH 地址空间内。如果是,Trace32使用教程之 会根据缓冲区的大小,把部分数据填充到数据缓冲区中,初始化参数块,设置目标系统的 PC 为 FLASH 编程软件的起始地址,并开始执行。执行结束后,控制权回到 Trace32使用教程之。Trace32使用教程之 检查返回的信息(也在参数块中),如果正常,继续处理剩余的数据。

下面通过一个例子来说明:

目标系统的配置了的 FLASH 为 Intel Strata FLASH 28F320J3A(16 bit mode, word access),CPU 为 ARM core。

目标系统的内存影像(memory map)为:

  • FLASH: 0x0 - 0x3FFFFF
  • RAM 起始地址:0xA0000000

相应的 Trace32使用教程之 脚本为:

FLASH.RESet  FLASH.Create 1. 0x0--0x3FFFFF 0x20000 TARGET Word  FLASH.Target 0xA0000000 0xA0001000 0x1000 ~~/demo/arm/FLASH/word/i28f200j3.bin  FLASH.Erase 1.  FLASH.Program 1.  Data.LOAD.Elf my_application.elf /Word  FLASH.Program OFF  

 

首先,通过 FLASH.Create 创建一个 FLASH 区域1,地址范围为 0x0 到 0x3FFFFF,Sector 的大小为 0x20000,对此 FLASH 区域的编程软件由 TARGET 指定。WORD 参数则指明目标系统 CPU 访问 FLASH 的数据宽度(还可以是 BYTE, LONG, QUAD)。

FLASH.Target 指定对 FLASH 区域编程软件的位置在 0xA0000000,参数块在0xA0001000。参数块后面一般紧跟着数据缓冲区,缓冲区的大小为 0x1000。编程软件是~~/demo/arm/FLASH/word/i28f200j3.bin。

接着擦除 FLASH 区域 1,然后启动 FLASH 编程模式。

Data.load.elf 命令将 my_application.elf 装载到 FLASH 区域,触发了 FLASH 编程软件,从而被写入到指定的 FLASH 区域中。

最后,关闭 FLASH 编程模式。

 




回页首


 

从上面的例子可知,在 Trace32使用教程之 软件与 FLASH 操作程序之间有一个数据交换区-参数块,用来传递控制命令和数据,并返回操作结果。参数块的位置是由FLASH.Target命令中的data_address指定的。紧跟着参数块是缓冲区。

参数块的定义如下:


操作结束后,参数块存放操作的返回结果:


参数块以及紧跟的缓冲区的相应 C 语言定义如下:

struct {      ulong32 flashaddr;      ulong32 flashwidth;      ulong32 width;      ulong32 offset;      ulong32 addr;      ulong32 size;      ulong32 reserved;      ulong32 status;		/* in: 1=program, 2=erase, out: 0=o.k., 0x100=fail */      uchar8 data[4096];		/* Programming Buffer, size can be made smaller   	(FLASH.TARGET command) */  } FlashParameter;  





回页首


 

开发基于"Target controlled flash programming" 方式的一般流程为:

1. 编写在目标系统上运行的 FLASH 编程软件

2. 将 FLASH 编程软件装载到目标系统的 RAM 中(使用 Data.LOAD 命令)

3. 通过命令 FLASH.Create 和 FLASH.Target 命令将 Trace32使用教程之 连接到目标系统上的FLASH 编程软件

4. 使用命令 FLASH.Program,FLASH.Erase 等命令控制对目标系统上 FLASH 的操作,这些命令会调用 FLASH 编程软件中相应的功能,并传递合适的参数

 

目标系统上有两块型号为 AM29F800 的 FLASH,每块 FLASH 的数据宽度为 16bit,两块合并成 32bit 宽度。每块 FLASH 有 1MB 的大小,它们的起始地址为 0x200000。

目标系统上还配置了 SRAM,大小为 8kB,地址范围是 0H 到 1FFFH。

为目标系统开发的 FLASH 编程软件为 FLASHprog.bin(大小为 450H 字节,二进制格式)。参数块被安排在 SRAM 的地址 0H 开始。

需要烧入目标系统 FLASH 的应用程序为 application.elf(ELF 格式,起始位置为0x200000)。这里需要说明的是,在联接产生 application.elf 时,必须通过联接脚本 - SCL 文件指定其起始位置为 0x200000。这样"Data.load.elf application.elf "命令就会将 application.elf 装载到从 0x200000 开始的地址空间。

对于这样的应用,需要编写一个控制脚本(CMM 文件),同时还要开发一个 FLASH的编程软件。下面首先介绍控制脚本的内容,然后给出了 FLASH 编程软件的流程。

 

控制脚本的内容如下:

1) 进行必要的目标系统设置,特别是片选配置,使得 SRAM 和 FLASH 都落在安排的地址空间中

2) 将 FLASH 编程软件 FLASHprog.bin 装载到 SRAM 中地址 0x1200 处: Data.LOAD.B FLASHprog.bin 1200

3) 在 FLSAH 编程软件的结束位置设置断点(break.set swbp),这样在执行结束后,控制可以交回给 Trace32使用教程之

4) 通知 Trace32使用教程之 关于 FLASH 的配置,FLASH 编程软件的位置,参数块以及数据缓冲区的位置

FLASH.Create 200000--3fffff TARGET LONG  FLASH.TARGET 1200 0 1000

此时 SRAM 的内存安排为:


5) 擦除整个 FLASH
FLASH.Erase ALL

6) 编程应用程序 application.elf
FLASH.Program ALL
Data.LOAD.elf application.elf
FLASH.Program OFF

执行 FLASH.Erase ALL 命令时,调用 FLASH 编程软件的擦除功能,相应的参数块填充为:


此时,数据缓冲区没有内容。

擦除结束后,遇到设置的断点,控制权交回给 Trace32使用教程之,参数表中为返回的状态:


执行 Data.LOAD.bin application.bin 时,调用 FLASH 编程软件的编程功能,相应的参数块填充为:


此时缓冲区中填充了需要编程的数据。

编程结束后,控制权交回给 Trace32使用教程之,参数表中为返回的状态:


如果没有错误发生,以上的编程过程会一直下去,直到 application.bin 中的数据全部传输完毕。

 

FLASH 编程软件的流程为:

1) 定义参数块的数据结构:
struct FlashParameter flash_param;
FlashParameter 的定义见上文。

2) 定义每个功能对应的功能号:

#define FLASH_PROGRAM               0x00000001  #define FLASH_ERASE                   0x00000002  #define FLASH_CHIP_ERASE             0x00000005  …其它功能号  

 

3) 主控制流程:

  switch ( flash_param.status )    {      case FLASH_PROGRAM:        flash_program();        break;      case FLASH_ERASE:        flash_erase();        break;      …其它功能    }  flash_program()  函数从参数块中获取编程的数据、大小以及编程的目标地址,                   实现对 FLASH 的编程功能。  flash_erase() 函数从参数块中获取擦除的目标地址以及大小,                实现对 FLASH 的擦除功能。  

 

4) SCL 文件

RAM 0x200000  {      CODE 0x200000       {        main.o (+RO)        * (+RO)      }      APP_RAM +0x0      {        * (+RW, +ZI)      }  }      

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值