<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 科伟奇电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=23 </link><title>关于C6000的引导过程的一点认识</title><author>aaron</author><pubDate>2009/11/24 11:17:59</pubDate><description><![CDATA[<strong>
<p>关于C6000的引导过程的一点认识</p>
<p>我是这样认为的（有不对的希望大家指正）：<br />
CPU复位后首先把系统程序加载到内部RAM或者外部高速RAM中，然后在RAM中运行，<br />
bootloader就是完成加载的过程。</p>
<p>C6000有3钟引导方式（1）无引导（2）ROM引导 （3）主机引导<br />
我只用过ROM引导。</p>
<p>ROM引导加载过程：</p>
<p>（1）当CPU的Reset引脚处于低电平状态时，BOOTMODE的引脚状态根据预设设定（我的目标版上面有这几个开关可设置），RESET信号处于上升沿的时候，相应加载方式启动。</p>
<p>（2）ROM加载方式是通过DMA控制器，将外部ROM的一段固定大小的代码复制到内部RAM中（加载时CPU处于stall状态），对于不同型号芯片，复制的代码大小不同。67X的应该是1KB</p>
<p>（3）加载完毕后，CPU开始从0地址执行。<br />
想象一下，有的程序都很大，1K是不能解决问题的，所以，一般在0地址处建立一个叫做&ldquo;bootloader&rdquo;的段（代码小于1KB），这一小段程序也叫&ldquo;引导程序&rdquo;，上电或者重启后首先执行它，完成将其余程序（真正完成用户要求算法的程序）加载，然后跳转到主程序入口地址运行。</p>
<p>举例：<br />
我的目标版FLASH地址为0x9000 0000, 在完成源代码编写，编译，连接后生成*.out文件，通过hex6x.exe工具转换成*.hex文件（16进制数据文件），然后使用Flashburn工具烧写到外部Flash Rom中。</p>
<p>程序boot.asm ，功能：完成数据大小为FLASH_SIZE 的数据搬移，源地址FLASH_START，目的地址RAM_START，搬移结束后跳转的主程序入口点_c_int00运行</p>
<p>FLASH_START .set 0x90000400 ;DMA已经加载可1KB（400H），所以地址从0x90000400开始<br />
RAM_START .set 0x400<br />
FLASH_SIZE .set 0x40000 <br />
.ref _c_int00<br />
.def start<br />
.sect &quot;.bootload&quot;<br />
start:<br />
mvkl FLASH_START,A4<br />
mvkh FLASH_START,A4<br />
<br />
mvkl RAM_START,B4<br />
mvkh RAM_START,B4<br />
mvkl FLASH_SIZE,B5<br />
mvkh FLASH_SIZE,B5<br />
zero A1<br />
loop<br />
ldw *A4++,B0<br />
nop 5<br />
stw B0,*B4++<br />
add 1,A1,A1<br />
cmplt A1,B5,B0<br />
nop<br />
[B0] b loop<br />
nop 5 <br />
b _c_int00<br />
nop 5</p>
<br />
</strong>]]></description></item></channel></rss>