![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| ADSP218x从FLASH引导方式分析 | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
ADSP218x系列16位定点DSP引导方式分析,主要介绍加电复位时通过外挂的FLASH存储器加载。FLASH存储器在线编程技术及基本指令,结合ADSP218x详细说明了如何在VISUALDSP++集成开发环境下,将用户代码烧入外挂的FLASH存储器中,并实现DSP加电复位后的用户程序的自动引导。 1. 背景 1.1 DSP和FLASH的连接 ADSP218x与FLASH存储器的典型连接如下图所示。 其中DSP型号为ADSP2189M, FLASH型号为AT49BV040, FLASH的CE,OE,WE分别与AD2189M的BMS,RD,WR相连,其中BMS表示片选信号,WR为写信号,RD为读信号。另外FLASH的地址线和数据线也分别与DSP连接好。 在该设计中,FLASH作为DSP的字节存储器使用,DSP只能通过BDMA(Byte DMA)方式访问FLASH。 DSP可以选择多种方式在上电时引导启动,我们采用了从外挂EPROM引导程序的方式进行自启动。当DSP的管脚MODE A,B,C,D设置为如下组合,DSP上电时采用BDMA方式引导: 模式A 模式B 模式C 模式D 引导方式 0 0 0 任意 使用BDMA方式从字节存储空间加载前32个字到DSP片内的程序存储器中。 1.2 FLASH存储器介绍 FLASH与RAM一样可反复读写,但不同的是,对FLASH进行写操作前必须将FLASH的内容全部擦除。对FLASH的操作需遵循一定的时序,AT49BV040系列FLASH存储器的具体控制字内容如下: 主要时序说明: 1) Read:从FLASH读数据,不需进行任何时序设置。 2) Chip Erase:FLASH擦除,经过6个CYCLE的编程,向FLASH的某些特定地址写特定值,完成对整个FLASH的擦除。 3) Byte Program:字节编程,经过4个CYCLES的编程,可完成对FLASH一个字节的写操作。 4) Boot Block Lockout:锁存FLASH的低16K字节空间。即使以后FLASH收到擦除指令,最低的16K字节空间仍保留,只能使用一次,慎用。 5) Product ID Entry:测试FLASH的低16K字节空间是否被锁存。 1.3 BDMA方式 FLASH作为DSP的字节存储空间与ADSP2189M连接好后,DSP只能通过BDMA方式访问FLASH。 BDMA:Byte Direct Memory Access,字节存储器DMA。 完成一次BDMA传送需对4个存储器映像寄存器进行设置,分别是BIAD,BEAD,BDMA Control和BWCOUNT。 具体如下: 映射地址 名称 包含内容及作用 Dm(0x3fe1) BDMA Internal address (BIAD) BDMA内部地址寄存器,14位有效,与BMOVLAY(4位)组合最高可访问256K内部PM,DM空间 Dm(0x3fe2) BDMA External address(BEAD) BDMA外部地址寄存器,14位有效,与BMPAGE(8位)组合最高可访问4M外部BM空间 Dm(0x3fe3) BDMA Control BDMA控制寄存器,包括BTYPE,BDIR,BCR,BMPAGE,BMOVLAY。 Dm(0x3fe4) BDMA Word Count(BWCOUNT) BDMA传送字数,一旦给BWCOUNT赋非零值,即启动BDMA 2. 一个简单的例子 我们通过一个简单的例子说明如何在VISUAL DSP++集成开发环境中将自己编写的程序写入到FLASH里,使DSP复位后能自启动。 2.1 编写测试IRQE中断的小程序 新建一个工程,取名为IRQETEST.DPJ。 然后编写一个测试DSP IRQE中断的小程序IRQETEST.ASM,如下: .section/pm IVreset; /*------Interrupt vector table------*/ jump start;nop;nop;nop; /* 0x0000: Reset vector*/ .section/pm IVirqe; jump resp_irqe; nop; nop; nop; /* 0x0018: IRQE*/ .section/pm program; start: ena ints; imask = 0x11; looping: nop; jump looping; resp_irqe: toggle fl1; rti; 该程序主要功能是:当DSP收到IRQE中断时,就改变FL1的当前状态。我们在目标板上将FL1与LED相连,通过板上的按钮产生IRQE中断。 在IRQETEST工程中加入2189.LDF,编译后得到IRQETEST.DXE文件。 在VISUAL DSP++集成环境中,选择工程属性,改变Type为loader/spilitter file,在load中选择Format为Intel Hex类型,如下所示: 重新编译后,得到IRQETEST.BNM文件。BNM文件为EPROM的镜像文件,可以通过VISUALDSP的Simulatoràload erpom来导入BNM文件,仿真DSP加电复位的情况。 2.2 BNM文件格式 当218x的MMAP和BMODE都保持为低,复位后用BDMA引导。BDMA接口进行以下引导初始化: l BWCOUNT置为32。 l BDIR,BMPAGE,BEAD,BIAD和BTYPE置为0。 l BCR置为1。 l BMWAIT置为7。 该引到初始化将BDMA接口置为:从字节存储器装载32个字,源地址是字节存储器第0页第0字节,目的地址是内部程序存储器地址0,采用24位程序存储器字格式;BDMA上下文复位BCR置1,程序在BDMA传送期间禁止执行,在传送完成后从地址PM(0x0000)处开始执行。 采用BDMA方式引导,VISUAL DSP++会在BNM文件里在原来的程序前面自动加上两段引导程序,称之为Preloader和Page loader。 Preloader 当DSP复位时,就从上图所示的EPROM中装入前32个程序字,即Preloader部分。该部分代码如下: ax0 = 0x0060; dm(3fe2) = ax0 ax0 = 0x0020; dm(3fe1) = ax0 ax0 = 0x0000; dm(3fe3) = ax0 ax0 = 0x0087; dm(3fe4) = ax0 ifc = 0x0008; nop imask = 0x0008 idle jump 20 该Preloader的作用是启动另外一次DMA:从BM装载135个字,源地址是字节存储器第0页第0x60字节,目的地址是内部PM地址0x20,然后跳到PM的0x20地址开始执行。实际上就是将EPROM中的page loader装载到PM中,然后执行page loader。 Page Loader 页装载程序的作用是启动多次BDMA(最多15次),从外部字节存储器中以8K一个页为单位装载用户指令或数据到DSP内部存储器的PM,DM中。 Page loader一共有135条指令,由于启动一次BDMA需要9条指令,因此Page loader一共可启动15次BDMA。ADSP218X系列中2188N内部存储空间最大,固定的PM,DM各一页,PM重叠存储区5页,DM重叠存储区6页,共计13页内部存储空间。Pageloader提供的15次BDMA足够初始化DSP所有的内部存储空间。 Page loader中的BDMA顺序执行,当执行完最后一次BDMA后,DSP指针会跳到PM的0x0000地址开始执行。 以下是IRQETEST的Page loader,由于程序很小,一次BDMA就可以完成。 ax0 = 0x01f5; dm(3fe2) = ax0 ax0 = 0x0000; dm(3fe1) = ax0 ax0 = 0x0008; dm(3fe3) = ax0 ax0 = 0x0036; dm(3fe4) = ax0 idle Application Data 用户编写的程序,就是前面所编写的IRQETEST.ASM的内容。 下面是用任一文本编辑器打开IRQETEST.BNM所显示的内容: :020000020000FC :2000000040060093FE2040020093FE1040000093FE3040087093FE403C008C0000003C0078 :200020008302800018020F0000000000000000000000000000000000000000000000000092 :2000400000000000000000000000000000000000000000000A001F00000000000000000077 :20006000000000000000000000000000000000000000000000000000000000000000000080 :20008000000000000000000000000000000000000000000000000000000000000000000060 :2000A000000000000000000000000000000000000000000000000000000000000000000040 :2000C000000000000000000000000000000000000000000000000000000000000000000020 :2000E000000000000000000000000000000000000000000000000000000000000000000000 :200100000000000000000000000000000000000000000000000000000000000000000000DF :20012000000000000000000000000000000000000000000000000000401F5093FE2040001F :200140000093FE1040008093FE3040045093FE400280000000000000000000000000000096 :2001600000000000000000000000000000000000000000000000000000000000000000007F :2001800000000000000000000000000000000000000000000000000000000000000000005F :2001A00000000000000000000000000000000000000000000000000000000000000000003F :2001C00000000000000000000000000000000000000000000000000000000000000000001F :2001E00000000000000000000000000000000000000000000018030F0000000000000000D5 :2002000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :20022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1803BF01 :20024000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :20026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :20028000FFFFFFFFFF0400603C01133C01044000104000140000003C008C00000002800080 :2002A00000000018037F00000000000040001123C10F0D004A2AE0AA02030002020100004B :2002C000000A001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 :00000001FF 可以大概看到上面的机器代码分成了三部分,即preloader,page loader和application data。 固定的Preloader汇编代码和机器码对应如下: /* standard preloader (32 instructions) address opcodes */ ax0 = 0x0060; dm(0x3fe2) = ax0; /* BEAD */ /* 0x0000: 400600 93FE20 */ ax0 = 0x0020; dm(0x3fe1) = ax0; /* BIAD */ /* 0x0002: 400200 93FE10 */ ax0 = 0x0000; dm(0x3fe3) = ax0; /* CTRL */ /* 0x0004: 400000 93FE30 */ ax0 = 0x0087; dm(0x3fe4) = ax0; /* BWCOUNT */ /* 0x0006: 400870 93FE40 */ ifc = 0x0008; nop; /* BDMA IRQ *//* 0x0008: 3C008C 000000 */ imask = 0x0008; /* 0x000A: 3C0083 */ idle; /* 0x000B: 028000 */ jump 0x0020; nop; nop; nop; /* 0x000C: 18020F 000000 . . */ 我们就可以从BNM文件中得到三个部分的机器代码,将其以8位形式存储为.dat文件,以便在烧写FLASH时以数据文件格式导入。 例如Preloader.dat内容如下: 0x40 0x06 0x00 0x93 0xFE 0x20 ….. 2.3 烧写FLASH 在获得的烧写FLASH的数据文件(Prelader.dat,pagloader.dat,code.dat)后,就可以在VISUAL DSP++里面采用FLASH在线编程技术,编写程序将数据烧写进FLASH。 烧写FLASH时,需遵循FLASH厂商所提供的FLASH时序进行操作,此处使用的FLASH是ATMEL公司AT49BV040,4Mbit FLASH MEMORY。 首先对FLASH进行擦除操作,然后循环调用BDMA方式,对FLASH进行字节编程。具体程序参见附带的FLASH_PROGRAMMER.asm。 2.4 加电复位DSP 烧写完成后,给DSP目标板供电,复位DSP,反复按下IRQE按钮产生中断时,与FL1相连的LED闪烁,试验成功。 参考文档及资料 l ADSP-218X DSP Hardware Reference l EE-125: ADSP-218x Embedded System Software Management and In-System-Programming (ISP) from www.analog.com |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| C28x 滤波器库 ADSP21160调试经历 ADSP流水线 ADSP2116x的几个常用算法库函… ADSP系列SHARC与FIFO的典型连… The simple examples for AD… ADSP-218x 加载器指南 ADI DSP的单精度随机斜率滤波… ADI DSP双精度除法的例子 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|