网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> ADI DSP代码示例 >> ADSP21xx >> 文章正文
  ADSP218x从FLASH引导方式分析         ★★★ 【字体:
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条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号