首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Trace32 对 FLASH 编程——实例

使用 Trace32 对 FLASH 编程——实例

实例(AM29F800)目标系统上有两块型号为 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 编程软件的位置,参数块以及数据缓冲区的位置
1
2
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 编程软件FLASH 编程软件的流程为:
1)        定义参数块的数据结构:
struct FlashParameter flash_param;
FlashParameter 的定义见上文。
2)        定义每个功能对应的功能号:
1
2
3
4
#define FLASH_PROGRAM               0x00000001
#define FLASH_ERASE                   0x00000002
#define FLASH_CHIP_ERASE             0x00000005
…其它功能号




3)        主控制流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  switch ( flash_param.status )
  {
    case FLASH_PROGRAM:
      flash_program();
      break;
    case FLASH_ERASE:
      flash_erase();
      break;
    …其它功能
  }
flash_program()  函数从参数块中获取编程的数据、大小以及编程的目标地址,
                 实现对 FLASH 的编程功能。
flash_erase() 函数从参数块中获取擦除的目标地址以及大小,
              实现对 FLASH 的擦除功能。




4)        SCL 文件
1
2
3
4
5
6
7
8
9
10
11
12
RAM 0x200000
{
    CODE 0x200000
    {
      main.o (+RO)
      * (+RO)
    }
    APP_RAM +0x0
    {
      * (+RW, +ZI)
    }
}

返回列表