微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TMS320C5410烧写Flash实现并行自举引

TMS320C5410烧写Flash实现并行自举引

时间:12-10 来源:互联网 点击:

Flash内部的编程或擦除算法可自动完成编程或擦除操作,但我们必须了解其内部的操作检测机制,以便知道操作是否完成或正确。常用检测的状态位有:跳变位(DQ6)、超时标志位(DQ5)、数据查询位(DQ7)和Ready/Busy引脚(RY/)。检测的方法有三种。第一种是判断引脚RY/的状态,在编程、擦除或擦除挂起操作过程中,RY/引脚一直为“0”,操作完成后变为“1”。 第二种是检测跳变位DQ6,在编程或擦除时对任何地址进行连续的读均引起DQ6连续跳变,直至操作结束才停止跳变。最后一种是使用数据线的DQ7、DQ5:DQ7位在编程或擦除过程中输出的数是写入该位数据的反码,当操作完成时输出才变为写入该位的数据;DQ5的状态为“1”时表示操作超时,此时应再读一次DQ7的状态,若DQ7输出仍不是写入的数据,则操作失败,复位Flash,其流程如图1所示。


图1 Flash操作检测流程

  检测程序如下:

_JUDGE .macro par,pdr;检测宏程序。par是编程地址寄存器,pdr是存放编程数据的寄存器
_JUDGEBEGIN?: PSHM AR1
  LD pdr,B ;获取写入的数据
  AND #00FFh,B ;取被写入数据的DQ7~DQ0
  LD par,A ;读被烧写地址的数据
  AND #00FFh,A ;取DQ7~DQ0
  STL A ,TEMP ;保存
  LD A,-7,A ;读DQ7状态
  XOR B,-7,A ;是否是反码?
  BC _JUDGESUCCESS?,AEQ ; DQ7不是反码而是写入数据表示操作成功
  BITF TEMP,#20h
  BC _JUDGEBEGIN?,ntc;DQ5=1表示操作超时
  LD par,A ;再读被烧写地址的数据
  AND #00FFh,A
  LD A,-7,A
  XOR B,-7,A
  BC _JUDGESUCCESS?,AEQ; DQ7不是写入数据,表示操作失败
_JUDGEERRO?
  _RESETFlash ;复位Flash
_JUDGESUCCESS?
  POPM AR1
  .endm

2 C5410 的自举引导

  脱离仿真器独立运行程序一般有两种方式:一种是上电后用户程序直接在Flash存储器中运行,这种运行速度比较慢;另一种是上电或复位后将用户程序从Flash存储器引导到高速数据存储器中运行,此方法最常用,可以较低的成本实现高速的运行。为了实现这个过程就必须运用DSP自举引导功能。

  (1) 自举引导

  C5410上电复位后,首先检查MP/MC状态:如果为高电平,说明DSP处于微处理器工作方式,即从外部程序存储器0FF80H地址开始执行用户程序;若为低电平,说明DSP被设置为微计算机工作方式,从片内ROM的0FF80H地址开始执行程序。0FF80H地址存放的是中断向量表,它实为一条分支转移指令(BD 0F800H),使程序跳转至0F800H执行自举引导程序(Bootloader)。Bootloader是固化在DSP芯片内ROM中的一段程序代码,其功能是将用户程序从外部加载至片内RAM或扩展的RAM中,使其高速运行。在搬运程序之前,Bootloader首先完成初始化工作:使中断无效,内部RAM映射到程序/数据区(OVLY=1),对程序和数据区均设置7个等待状态等。C5410有以下几种自举引导方式:主机接口HPI、并行口(8/16位)、标准串行口(MCBSP0是16位引导模式,MCBSP2是8位引导模式)以及I/O口(8/16位)自举引导方式。

  (2) 并行自举引导

  这种方式是比较常用的一种,外部存储器的字宽为8位或16位。在自举引导时,通过外部并行接口总线将这些代码从数据存储空间传送到程序存储空间,而且可以重新设置SWWSR及BSCR寄存器的内容。并行自举引导方式首先从地址为0FFFFH的I/O口读取自举表首地址的内容,如果此内容不符合8位或16位的引导方式,就从地址为0FFFFH的数据存储器读取,进行8位或16位并行自举引导。所以,在烧写Flash数据的同时,也要在0FFFFH烧入自举表的首地址。引导流程如图2所示。


图2 并行自举引导流程图

  (3) 建立自举表

  自举表内容不仅包括欲加载的各段代码,而且包括各段代码长度、各代码段存放的目标地址、程序入口地址等信息。若要完成自举引导功能,必须建立正确的自举表。自举表可以由hex500格式转换器自动生成;也可以手动建立自举表,就是把被烧写的程序直接放在烧写程序中,根据被烧写程序的相关信息手动建立自举表。

3 C5410 烧写Flash和并行自举引导

  下面通过一个Flash烧写实例,介绍怎样将用户程序烧写进Flash,以及怎样手动建立自举表,并且脱离仿真器以并行自举引导方式使用户程序独立运行。被烧写和烧写程序如下:

  .title “FLASH”
  .mmregs
SWCR .set 002BH
TEMP .set 0060H
  .data
  .sect ".BOOT"
  .label BOOTTABLE ; 自举表开始
  .word 10AAH ; 16位自举标记
  .word 7FFFH ; 7个等待周期(SWWSR)
  .word 0F000H ; 块转换寄存器(BSCR)
  .word 0000h ; 程序入口XPC
  .word 0200h ; 程序入口地址(MAIN_START)
  .word LOADEND - LOADSTART
  ; 程序块长度(0116H)
  .word 0000h ; 存放目标XPC
  .word 0100h ; 存放目标地址
LOADSTART: ;中断向量表开始地址
  .copy “vector.asm”;复位处跳转MAIN_START
MAIN_START: ;被烧写的主程序
  STM #0F7h,SP
  STM #012Ch,PMST
  ;IPTR=01(中断向量指针为100,指向目标地址),MP/MC=0,OVLY=1,AVIS=0,DROM=1, CLKOFF=1
LOOPF:RSBX XF ;XF置低
  CALL DELAY ;延时
  SSBX XF ;XF置高
  CALL DELAY
  B LOOPF
DELAY:PSHM AR6
  STM #0090H,AR6
DELAY_LOOP:
  RPT #0FF0h
  NOP
  BANZ DELAY_LOOP,*AR6-
  POPM AR6
  RET
LOADEND ; 被烧写的程序结束
  .space 20h
  .mmregs
  .label FINDTABLE
  .word 8000h
  .text
ERASE_WRITE_Flash: ;烧写程序开始
  STM #0FFA0H,PMST
  STM #07FFFH,SWWSR
  STM #0FFFFH,SWCR
  _RESETFlash ; Flash复位
  _ERASEFlash ;擦除Flash
WRIFlashSTART: ;开始编程Flash
  SSBX SXM
  RSBX OVM
  _RESETFLASH ; Flash复位
  STM #8000H,AR0 ;Flash起始地址8000H
  STM BOOTTABLE,AR5 ;被烧写的源地址(自举
  ;表首地址)
  STM #( LOADEND- BOOTTABLE),AR4
          ; 写入011E个字
WRI_RPT
  _WRITEFlash *AR0,*AR5 ;调入编程宏
  LD *AR0+,A
  LD *AR5+,A ;完成AR0和AR5地址自动加1
  BANZ WRI_RPT,*AR4-
  STM #0FFFFH,AR0; AR0指向数据空间的FFFF
              ;地址
  STM FINDTABLE,AR5
  _WRITEFlash *AR0,*AR5 ; 向数据空间的FFFF
;地址写入自举表的首地址8000H
ENDD: NOP
  B ENDD
  .end

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top