花了一个多星期研究了一下dm6437的flash烧写,总结一下:
1 要了解烧写,首先要了解6437的存储器组织
存储器的硬件组织原理可以参看TMSC6000结构原理与硬件设计(北京航天航空大学);具体的存储器的硬件连接可以参照合众达的DEC6437原理图。从原理图可以知道,flash的控制信号线CE/OE/WE都是连接与板子上面的CPLD,如需要控制读写,还要参看flash的datasheet来了解其读写时序,编写CPLD的程序,这里暂且略过,S29AL032D数据线22根,相当于内部有4M*8bit的存储空间(在flash烧写的程序中会有一句
if(FillSize > 0x100000)
{
printf("The OUT file is too big!\n");
}
之所以这里是1M,不是4M,是因为后面调用fread的时候是按照4字节为单位来读取的!),地址线连接于EM_BA0-1(用于bank区分) EM_A0-A19
片选是选择的cs2,因此flash用到的空间是EMIF_CS2 = 0x0x4200 0000,查看存储器映射表(详见TMS320DM6437 Digital Media Processor中table 2-3)
因此,在烧写的程序中基址被定为
#define FLASH_BASE ( EMIF_CS2_BASE )
数据总线与dsp的连接是:EM_D0-7 8位
因此,flash写数据时,指针设置为从FLASH_BASE开始的地方。

2 CCS烧写flash的办法
a.Ti提供的软件flashburn,需要将.out->rom格式;
b 将编写两个工程:一个主程序工程(即用户应用程序,其中包括二次引导程序),一个搬运程序工程。搬移程序不能使用与主程序的程序空间和中断向量表重合的物理空间,以免覆盖。烧写时,同时打开主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后执行搬移程序,烧写OK!
C 用户应用程序(必须包含boot引导程序,否则无法启动)编译生成.out,然后编写烧写程序,在烧写程序中将生成的.out烧写到flash中。
我们将采用第三种办法。网上有人说烧写flash需要修改cmd文件,实际上不用,因为如果自己编程实现的话,只要注意三个地址的区别就可以:一是flash物理地址,文件烧入的地方;二是文件load的地方,也就是程序运行的地址,一般是ram中(当然如果你想直接在flash中跑程序的话,那cmd的确要改);三是在flash烧写或者load启动时将文件读入内存时的一个地址(这个地址实际上是个偏移量,最终操作时是将其与对应的物理地址加起来作为实际的物理地址)

3 cmd中用到的ram
本质上是分为内部ram和外扩的ram,在我们的应用中外部ram是DDR2(0x8000 0000),内部ram分为L1D(数据存储器)、L1P(程序存储器)和L2,查看地址映射表会看到L1D ram、L1Dram/cache、L1Pram/cache、L2 ram/cache的区别。其中包含cache说明可以作为高速缓存用。在6437中,根据寄存器的配置,可以将内部ram的一部分配置成存储器映射ram,也可以配置成高速cache,具体寄存器参见TMS320DM6437 Digital Media Processor table 2-3 Memory map summary中的脚注(1).
Cache的意义
在于保留最近读入数据。在开始阶段,cache中是没有数据的,这时如果cpu到cache中来搜索需要的数据,就肯定会有cache的缺失,导致读取外部存储器,并将内容缓存于cache中。后续的操作中若有同样的数据,cpu将优先命中cache,可以有效提高程序的读写速度。新存入cache的数据总是覆盖LRU(least recently use)最近最少使用行,将最少使用的覆盖,以提高cache的命中率。在dsp的程序设计中,cache命中率的提高也是提高效率的一个重要方面。
存储器映射的概念:片内和片外存储器以字节为单位统一编址。在我们的应用中,flash通过emif接口扩展,ddr2通过dm6437专有的ddr2 memory controller来扩展。
EMIF异步扩展存储器接口引脚参看EMIF的手册TMS320DM643x DMP Asynchronous External Memory Interface (EMIF) UG (Rev. A) page9.
DDR2 memory controller 引脚参看对应手册TMS320DM643x DMP DDR2 Memory Controller User's Guide (Rev. B) page11

4 dm6437的启动过程
Dsp上电或复位后,根据设定的dsp自举方式进行引导。引导方式有三种,可以参看SEED-DEC6437用户指南 (Rev.A) page27,SEED-DEC6437 所使用的启动方式是EMIFA ROM FASTBOOT 不采用AIS 模式,即BOOTMODE[3:0] = 1001b, FASTBOOT = 1,AEM[2:0] = 001b。在这种模式下,板卡上电后,先进入地址0x1000 0000(boot rom),
这里有一段出厂时就烧写好的bootloader,这段程序的功能通常是从EMIF CE1端口自动地复制一块数据到地址,实际上就是从flash首地址开始拷贝一段数据出来(具体数据放在什么地方,因为没有boot rom程序参考,因此个人认为是放在应用程序的cmd文件为bootld所指定的1k运行空间,可能是flash,也可能是ram,我自己设置的是ram)
L2ram BOOT_RAM: o = 0x10800000 l = 0x00000400
其实这里是有点疑问的:因为指导书上是这样说的:,先进入地址0x1000 0000,而后直接进入Flash 的首地址0x4200 0000,开始执行烧写在Flash 的程序。我个人认为程序具体在哪里运行应该是看boot rom中一级bootloader将程序拷贝到哪里去了。。。
一般的说法是,一级bootloader复制的数据块大小是有一定限制的,根据芯片不同而不同,许多地方提到的都是1k,有些也提到64k。具体dm6437的手册中应该也会提到,但我没有具体看。当然用1k的程序来实现flash程序的二级搬移应该是够了的。通过二级bootloader就可以实现全部用户程序到cmd指定区域的ram的搬移,搬移完成后,就跳转到c程序的入口。
反正后面的段是按照引导表COPY_TABLE来拷贝到对应的ram区,而COPY_TABLE的内容是在flash烧写时,由烧写程序根据.out文件的内容解析得到的各个段的大小、装载地址及内容而制成的,flash烧写时写入COPY_TABLE的地址就是从0x4200 0000开始后的1k偏移地址0x4200 0400开始。(也许有人会问为何设置在这个地方,因为二级bootloader是在flash开始1k空间,后面才是用户真正的应用程序,你总不能让bootloader自己拷贝自己吧,^_^)

5 boot.asm 和flash烧写程序
好多页,算了,这个在光盘里面都有,原理知道了,自己看看也能明白!
这次调试中遇到一个问题:boot程序中有些寄存器要设置一下,有的boot程序不同,要注意。

6 未解决的问题
;****************************************************************************
;* Copy code sections
;****************************************************************************
mvkl COPY_TABLE, a3 ; load table pointer 加载用户程序代码的起始地址
mvkh COPY_TABLE, a3 ;

ldw *a3++, b1 ; Load entry point 加载用户c语言入口地址
; nop 5
; mvkl 0x80001680, b1 ; load table pointer
; mvkh 0x80001680, b1

copy_section_top:
ldw *a3++, b0 ; byte count 本段加载字节个数size 32bit
ldw *a3++, a4 ; ram start address 本段要被加载到内存中ram起始地址
nop 3

[!b0] b copy_done ; have we copied all sections? 判断是否所有段加载完成
nop 5

copy_loop: ; 循环加载当前段内容
ldb *a3++,b5 ;将flash地址中的数放到B5 8bit
sub b0,1,b0 ; decrement counter 每加载一个,字节数减1
[ b0] b copy_loop ; setup branch if not done 判断加载字节数是否为零
[!b0] b copy_section_top ; 当前段加载成功后转入加载下一段
zero a1 ; 执行完这条指令B5和A4中才有新的数据
[!b0] and 3,a3,a1 ; 什么条件下执行??
stb b5,*a4++ ; 将flash读出到B5中的段内容放到对应的ram地址中,
; 按bit8搬移
[!b0] and -4,a3,a5 ; round address up to next multiple of 4
[ a1] add 4,a5,a3 ; round address up to next multiple of 4

;****************************************************************************
;* Jump to entry point
;****************************************************************************
copy_done:
mvkl 0x00000100, b0 ; set pll_div1 register value
nop 5
copy_done1:
sub b0,1,b0
[ b0] b copy_done1 ; have we copied all sections?
nop 9

b .S2 b1 ;跳转到c入口标签地址 这句还不太懂
nop 9

DM6437烧写总结相关推荐

  1. iso镜像文件烧写到U盘

    iso镜像文件烧写到U盘 windows rufus-3.1.exe 百度云盘链接:https://pan.baidu.com/s/16p1O4lXMVTUltTvCm0DnHA 提取码:inzj 文 ...

  2. tiny210V2 Uboot kernel filesystem 烧写和启动

    1.sd启动 将u-boot镜像写入SD卡 将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是 ...

  3. rk3399在linux机上烧写img,烧写固件 — TB-96AI documentation

    Window主机烧写固件¶ 1.安装Windows PC端USB驱动(首次烧写执行). 2.双击DriverAssitant_v4.5DriverInstall.exe打开安装程序,点击"驱 ...

  4. stm32使用flymcu烧写程序

    文章目录 一.使用flymcu烧写程序 一.使用flymcu烧写程序 烧写程序之前要使ASP指示灯保持强亮状态,同时要保证使flashIsp模式下也就是灯闪一下模式 如果长按asp按钮指示灯闪烁两次进 ...

  5. 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文

    单片机怎样用usb烧写程序 首先,需要安装keil软件和STC_ISP程序下载软件. 先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给单片机提供电源就 ...

  6. 如何在Zynq-7000上烧写PL Image

    在Zynq-7000上编程PL大致有3种方法: 1. 用FSBL,将bitstream集成到boot.bin中 2. 用U-BOOT命令 3. 在Linux下用xdevcfg驱动. 步骤: 1. 去掉 ...

  7. bootloader烧写

    http://blog.chinaunix.net/space.php?uid=7313069&do=blog&id=1676091 关于bootloader,先简要地总结一下.经过了 ...

  8. 走进STM32世界之Hex程序烧写

    多数51单片机(STC系列单片机)的初学者都知道,在51单片机初上电时,可以通过PC机上位机软件将程序引导至bootloader,从而将新程序的hex文件下载至单片机中,完成程序的升级或是更新.在32 ...

  9. raspberry 烧写镜像到SD卡

    刚开始接触树莓派,需要烧写系统镜像到SD卡,网上找了些资料,记录于此. raspberry镜像下载: https://www.raspberrypi.org/downloads/ 烧写工具: wid3 ...

  10. H3核心板开发笔记(一):编译及烧写方式

    系统配置文件路径:tools/pack/chips/sun8iw7p1/configs/dolphin/sys_config.fex linux 内核: linux-3.4 u-boot: brand ...

最新文章

  1. java g1 gc ref proc_java – 针对sparc T4 8核的正确G1 GC调优
  2. 有关FPGA比较好的文章收藏(备忘)
  3. 常用的数据分析图表及方法介绍
  4. Spring 实现数据库读写分离(转)
  5. java fileupload 文件_java用Commons fileupload 文件的上传
  6. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
  7. dml语句包括哪些_MySQL数据操作(DML)语句,入门掌握这些足够了
  8. WebSocket 详解 1
  9. C#之DateTime
  10. MongoDB的下载、安装与部署
  11. 通过HttpURLConnection模拟post表单提交
  12. Skyline软件二次开发初级——2如何在WEB页面中控制三维地图的观察点坐标和角度...
  13. PHP redis 清空 整个哈希hash表信息
  14. [深度学习] 自然语言处理 ----- Attention机制中的Q,K,V介绍
  15. chia币新协议矿池搭建教程
  16. 还记的 破坏之王 里面的 锁吗,锁住 断水流大师兄
  17. My Notes Keeper 注册码算法注册机
  18. 怎么把记事本内容导出python_怎么把记事本内容导出python
  19. thrift+springBoot
  20. kubeadm部署k8s集群

热门文章

  1. Roslyn 静态分析
  2. [MATLAB]--曲线拟合(polyfit/polyval)
  3. 超牛无损图片放大神器PhotoZoom
  4. unity中实现多人联机局域网-基于pun v2 + photon server v5
  5. 中国知名个人站长排行TOP91
  6. 机器学习模型的超参数优化
  7. 共模电感 | 关键参数的计算步骤
  8. 为什么你写了一万小时的代码,却没能成为架构师?| 程序员有话说
  9. libCef基本框架与结构
  10. linux系统下面所有命令都失效了,显示bash: xxxxx: command not found...