TMS320DM642启动模式(Bootmode)(转)
原文地址:http://www.cnblogs.com/xiangai10000/p/JamesYang.html
在TI官方的文档《TMS320DM642 Video/Imaging Fixed-Point Digital Signal Processor Data Manual(SPRS200)》中“Bootmode”小节讲述了DM642的启动方式。DM642使用低有效RESET信号。当RESET信号为低 时,DM642就复位并被初始化为复位状态。当RESET信号被释放,即电平转换为高,处理器开始运行。DM642有三种启动模式:Host boot、EMIF boot、No boot。实际使用的DM642开发板采用第二种启动模式——EMIF boot。接下来我们仅介绍EMIFI boot。当RESET信号被释放,DM642完成自检后,按照设置的EMIF boot模式启动,通过EDMA自动将CE1空间起始1K-Bytes代码复制到起始地址0处。在这个过程中,CPU停止不运行,这个复制完成后,CPU 从停止状态释放,开始从0地址开始运行。需要注意的是,CE1空间起始1K-Bytes数据要与系统使用的端格式相同,我们使用小端格式。在文档 SPRS200中这样写道,After completion of the block transfer, the CPU is released from the “stalled” state and starts running from address 0.单 词stalled被加上双引号。我认为CPU不是真的停止,而是在运行一级bootloader进行装载二级bootloader,这样就跟我们从书本上 所学的知识联系起来。CPU被释放后,自动运行一级bootloader,配置EMIF和EDMA,使其能够将CE1地址空间起始1K Bytes数据复制到起始地址0处。但是这1k字节大小一般是不足以存储用户的应用程序。因此,CE1地址空间起始的1K字节存储二级 bootloader,由二级bootloader将用户的应用程序和数据加载到RAM中。综上所述,首先,DM642自检后运行一级 bootloader,完成加载二级bootloader的任务。接着,CPU跳转到地址0处运行二级bootloader,完成加载用户的程序和数据。 然后跳转到__c_init_出运行。至此,完成系统的引导与加载。
上段讲述了DM642的启动方式,其中涉及到DM642的地址空间,接下来讲讲DM642地址空间映射。文档SPRS200中的“Memory Map Summary”小节对DM642的地址空间做了总结。这里着重介绍Internal memory(Internal RAM/L2,我习惯称为L2)、EMIFA地址空间。L2为DM642片上集成Cache/SRAM可配置的存储器,大小为256K-Bytes,映射 地址为0x0000 0000-0x0003 FFFF。L2是使用频繁,关乎程序优化的重要存储器。EMIFA空间分为4个,分别为CE0-3,每个空间大小为256MB,详见下图。
实际项目中,CE0地址空间配置为SDRAM,大小为32M*64bit, 地址范围:0x8000 0000 – 0x81FF FFFF。项目中使用的FLASH为AM29LV320D异步静态存储器,大小为4M*8bit,但实际中FLASH工作在Byte模式下,只映射了 1MBytes,因为CE1地址线只有A[3-22]。在不使用FPGA/CPLD条件下,充分利用FLASH大小4M*8bit存储容量,可以使用 DM642丰富的GPIO来扩展地址空间,实现FLASH的分页访问,值得注意的是,被选用的GPIO必须满足DM642上电/复位时为低电平。下图使用 GPIO3实现对FLASH分页访问,大小为2M*8bit,配置在CE1D地址空间:0x0000 0000 – 0x900F FFFF。引脚图如下
如果需要全部使用FLASH的4M*8bit空间,可以使用更多的GPIO来实现分页访问,只需要选用的GPIO在复位/上电时为低电平,另外要注意,软件访问是的分页控制。
除了在硬件上的启动配置外,在软件上也需要做相关配置。
1、向自己的工程中加入二级bootloader(*.asm)汇编代码,(我使用的是IDE:CCSv5)
.title "Flash bootup utility for DM642 EVM"
.option D,T
.length 102
.width 140 COPY_TABLE .equ 0x90000400
EMIF_BASE .equ 0x01800000 .sect ".boot_load"
.global _boot _boot:
;************************************************************************
;* Debug Loop - Comment out B for Normal Operation
;************************************************************************ zero B1
_myloop: ; [!B1] B _myloop
nop 5
_myloopend: nop ;************************************************************************
;* Configure EMIF
;************************************************************************ mvkl emif_values, a3 ; load pointer to emif values
mvkh emif_values, a3 mvkl EMIF_BASE, a4 ; load EMIF base address
mvkh EMIF_BASE, a4 mvkl 0x0009, b0 ; load number of registers to set
mvkh 0x0000, b0 emif_loop:
ldw *a3++, b5 ; load register value
sub b0,1,b0 ; decrement counter
nop 2
[ b0] b emif_loop
stw b5, *a4++ ; store register value
nop 4 ;****************************************************************************
;* Copy code sections
;****************************************************************************
mvkl COPY_TABLE, a3 ; load table pointer
mvkh COPY_TABLE, a3 ldw *a3++, b1 ; Load entry point copy_section_top:
ldw *a3++, b0 ; byte count
ldw *a3++, a4 ; ram start address
nop 3 [!b0] b copy_done ; have we copied all sections?
nop 5 copy_loop:
ldb *a3++,b5
sub b0,1,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1
[!b0] and 3,a3,a1
stb b5,*a4++
[!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:
b .S2 b1
nop 5 emif_values:
.long 0x00052078 ; GBLCTL
.long 0x73a28e01 ; CECTL1 (Flash/FPGA)
.long 0xffffffd3 ; CECTL0 (SDRAM)
.long 0x00000000 ; Reserved
.long 0x22a28a22 ; CECTL2
.long 0x22a28a22 ; CECTL3
.long 0x57115000 ; SDCTL
.long 0x0000081b ; SDTIM (refresh period)
.long 0x001faf4d ; SDEXT2、DSP/BIOS的MEM配置。
如前所说,二级bootloader加载完成后,CPU将从0地址开始运行,因此要将二级bootloader分配在0地址开始的1KB地址空间,即将L2的前1KB配置为boot区。
并且要在cmd文件中将1中的代码段分配到BOOT存储器中。
SECTIONS
{
.boot_load > BOOT/**/
}本文就简单结合实际将DM642的EMIF启动模式做了介绍。如有纰漏,请多多指教。
TMS320DM642启动模式(Bootmode)(转)的更多相关文章
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- Android Activity的4种启动模式详解(示例)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...
- Centos7更改默认启动模式(转载)
今天心血来潮安装一个centos7的图形界面,但发现用之前的方式无法修改默认启动为命令行模式. 之前的方法:修改/etc/inittab文件中的 id:3:initdefault ...
- Android进阶--Acticivity的启动模式
一.引言 我们在多次启动同一个Activity时,系统默认会重复创建多个实例,这样看上去便十分的愚蠢,所以android在设计时提供了启动模式来修改系统的默认行为.目前有四种启动模式:standard ...
- android 启动模式介绍
Android启动模式 (1)Task:与Android系统是个多任务的系统中的任务是不同的.后者更倾向于多进程和多线程来说的,而这里的任务与application(应用程序)和activity(活动 ...
- activity的启动模式
有四种启动模式:standard.singleTop.singleTask.singleInstance. 可在AndroidManifest.xml设置android:launchMode属性,如: ...
- Android启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Activity四种启动模式
转载博客:http://blog.csdn.net/shinay/article/details/7898492 Activity启动方式有四种,分别是:standardsingleTopsingle ...
- Activity的四种启动模式
Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...
随机推荐
- Volley网络框架的使用
Volley的特点: 使用网络通信更快.更简单 Get/Post网络请求网络图像的高效率异步请求 可以对网络请求的优先级进行排序处理 可以进行网络请求的缓存 可以取消多级别请求 可以和Activi ...
- Spark Netty与Jetty (源码阅读十一)
spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼.它基于NIO的服务端客户端框架,具体不再说了,下面开始. 创建了一个线程工厂,生成的线程都给定一个前缀名. 像一般的n ...
- 如何把maven项目转化为webapp
1.右键Project Facets, Convert to faceted from 2.改Dynamic Web Module的Version3.点击下面的Further configuratio ...
- 【javascript进阶】异常
前言 最近有些时间了,今天看了看博客的后台记录,好多都没有写博客呢,争取尽快把以前的补上,javascrit中的异常在前端大家用的好像不是很多,其实javascript的异常和大多数的后端语言差不大, ...
- 可提高工作效率的 PL/SQL Developer 设置
1.将Window List 列表展示出来并保存当前布局 ①Tools-->Windows List (展示窗口列表) ②Window-->Save Layout (保存当前布局) 2.设 ...
- delphi 一个线程和主界面的交互的演示代码
求一个线程和主界面的交互的演示代码求一个线程和主界面的交互的演示代码.线程和主界面处于两个Unit.线程中的user中不能引用主窗口.我只是想学习一下,线程和主界面交互的方法.去网上查了好几天资料,能 ...
- 没想到cnblog也有月经贴,其实C#值不值钱不重要。
呵呵,就不倚老卖老了,从basic走过来,一路经历vb,vf,delphi,C#,php,asp,html,js,css,太多太多的开发语言,包括面向对象编程思想,语义化页面结构等等,除了高级的编程技 ...
- Url路径重写的原理
ASP.net的地址重写(URLRewriter)实现原理及代码示例 吴剑 2007-01-01 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 概述 访问 ...
- Oracle 11.2.4.0 ACTIVE DATAGUARD 单实例安装(COPY创建备库)
Oracle 11.2.4.0 ADG 单实例安装(COPY创建备库) 规划: 主: OS: Linux Centos 6.5 X64 hostname:ORA11G-DG1 ipaddress:19 ...
- python字典嵌套字典的情况下获取某个key的value
最近在用python写接口的测试程序,期间用到解析字典获取某个key的value,由于多个接口返回的字典格式不是固定的并存在多层嵌套的情况.在字典的方法中也没有找到可直接达到目的的方法(也可能是我对字 ...



