📄 a-13-1-5-1.htm
字号:
<html><head><title>饮水思源精华区</title><Content-type: text/html; charset=gb2312><link rel=stylesheet type=text/css href="bbsdl.css"></head><table cellspacing=0 class=title width=90%><th class=title align=left width=20%>饮水思源站</th><th class=title align=center width=60%>文章阅读</th><th class=title align=right width=20%>精华区离线浏览</th></tr></table><hr><table align=center cellspacing=1 class=doc><tr><td>发信人: prosignia (猛扛), 信区: DSP<br>标 题: Bootloader 之最终幻想<br>发信站: 饮水思源站 (Tue Aug 21 22:15:52 2001), 转信<br> 看了上面有这么多老兄的讨论,就想起一年前我也是一头雾水地<br>扎在ti的文档里查bootloader的资料,我当时用的还是C542芯片<br>,虽然ti把它的bootloader吹得那么牛,但是我就是用不起来,后<br>来只好痛下决心自己写一个bootloader的程序.<br>但是这个过程浪费了我一个多月的时间,现在想起来,浪费了我<br>多少泡网的好机会!<br>现在我把我的一些想法贴出来,希望减少大家摸索的时间,我想我的<br>第一条忠告就是: 不要用芯片内部的bootloader!!<br>不要管文档上是怎么吹嘘的,我当时就发现几个文档之间居然有自<br>相矛盾的地方.自己写的程序才能自己把握它到底干了些啥,包括<br>能够从什么地方运行,怎么运行,copy多长的程序.<br>所以万一你发现你没法解决你的bootloader程序时,你就自己写吧!<br>幸运的是:它太简单了,下面就是我当时写的bootloader程序:<br> .def load_start<br> .sect "load_prg"<br>load_start:<br> ssbx intm<br> ld #0,dp<br> nop<br> ld #0ff80h,a ;move vectors<br> stm #2780h, ar1<br> rpt #(70h-1)<br> reada *ar1+<br> nop<br> ld #0c000h,a ;move main_prg<br> stm #80h,ar1<br> rpt #(250h-1)<br> reada *ar1+<br>endboot:<br> orm #020h,@1dh ;ovly=1<br> ld #80h,a<br> bacc a<br> .end<br>大家一看就知道她就干了两件事<br>1.把eprom中放到0xff80处的中断矢量表拷贝到片内0x2780处,<br>作为中断向量表的新地方;<br>2.把eprom中放到0xC000处的程序拷贝到以0x80起始的片内<br>内存处<br>最后别忘了置OVLY=1,还有跳转到你的程序上去运转,呵呵.<br><br>另外,在你的程序里初始化DSP芯片时加上一句:<br><br>STM #27e0h,PMST ,保证interput vector pointer正确指向0x2780<br><br>简单吧? ^_*<br><br>让我们再来看中断矢量表:<br> .mmregs<br> .ref SYSTEM_STACK<br> .ref BSP_receive_int<br> .ref BSP_transmit_int<br> .ref TDM_receive_int<br> .ref main_start<br> .ref load_start<br> .def reset<br> .def nmi<br> .def brint<br> .def bxint<br> .def trint<br> .def txint<br> .def int0<br> .def int1<br> .def int2<br> .def int3<br> .sect "vectors"<br>reset: BD load_start ; RESET vector<br> STM #SYSTEM_STACK,SP<br>nmi: RETE<br> NOP<br> NOP<br> NOP ;NMI~<br>; software interrupts<br>sint17 .space 4*16<br>sint18 .space 4*16<br>sint19 .space 4*16<br>sint20 .space 4*16<br>sint21 .space 4*16<br>sint22 .space 4*16<br>sint23 .space 4*16<br>sint24 .space 4*16<br>sint25 .space 4*16<br>sint26 .space 4*16<br>sint27 .space 4*16<br>sint28 .space 4*16<br>sint29 .space 4*16<br>sint30 .space 4*16<br>int0: RETE<br> NOP<br> NOP ; INT0<br> NOP<br>int1: RETE ;<br> NOP<br> NOP ; INT1<br> NOP<br>int2: RETE<br> NOP<br> NOP<br> NOP<br>tint: RETE<br> NOP<br> NOP ; TIMER<br> NOP<br>brint: BD BSP_receive_int ; Buffered serial port receive intr<br> PSHM ST0<br> PSHM ST1<br>bxint: BD BSP_transmit_int ; Buffered serial port transmit intr<br> PSHM ST0<br> PSHM ST1<br>trint: BD TDM_receive_int ; TDM serial port receive intr<br> PSHM ST0<br> PSHM ST1<br>txint:<br> RETE<br> NOP<br> NOP<br> NOP<br>int3: RETE<br> NOP<br> NOP ;INT3<br> NOP<br>hpiint: RETE ; HPI interrupt<br> NOP<br> NOP<br> NOP<br> .end<br>注意这个中断矢量表的第一句话就是跳转到load_start运行,就是<br>我们刚才看到的bootloader程序.注意把这个中断矢量表要放到<br>eprom中的0xff80上去.<br>让我们看看linker的cmd文件,<br>MEMORY<br>{<br> PAGE 0: PROG0 : origin = 00080h length = 00780h /* on-chip program */<br> PROG1 : origin = 02780h length = 00080h<br> PROG2 : origin = 0c000h length = 04000h<br> /* RAM */<br> PAGE 1: RAM0 : origin = 00060h length = 00020h /* 32 word scratch */<br> RAM1 : origin = 00800h length = 00800h /*1k */<br> RAM2 : origin = 01000h length = 01780h /*2k*/<br> }<br>SECTIONS<br>{<br> main_prg: load = 0c000h,run=80h<br> vectors: load = 0ff80h,run=02780h<br> load_prg: load = 0f800h<br><br> ~<br> ~<br> ~<br>}<br>最后就是hex conversion utility所要的 cmd文件,注意程序和中断失量一块儿放到<br>eprom中0xC000开始的地址上去了<br>xifp4.out<br>-i<br>-map xifphex.mxp<br>-o xifp.hex<br>-image<br>-memwidth 16<br>-romwidth 8<br>ROMS<br>{<br> EPROM: org = 0C000h,length =04000h, romwidth = 8<br> files = { eprom.b0, eprom.b1 }<br>}<br>呵呵,好了就着么多了,真是太简单了,根本没必要和ti瞎折腾. 呵呵,希望对大家有用<br><br>--<br>※ 修改:·prosignia 於 Aug 21 22:27:11 修改本文·[FROM: 202.119.32.102]<br><br></tr></table><br><caption align=bottom><hr><table align=center cellspacing=1 class=foot><tr><td class=foot><a href="a-13-1-5.htm">返回</tr></table><p class=copyr align=center>Copyright © 2001 <a class=copyr href="http://bbs.sjtu.edu.cn">SJTUBBS</a>, All Rights Reserved.<br><br>版权所有<a class=copyr href="telnet://bbs.sjtu.edu.cn">上海交大BBS饮水思源站</a></caption></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -