TRICONEX DO3401
引言
在许多基于DSP的系统设计中,程序代码总是保存在ROM、Flash或其他非易失存储器中,以保证掉电时代码仍存在,因此必须要解决引导装载的问题。自举引导(Bootload)是指系统上电时,DSP将一段存储在外部非易失性存储器的代码搬移到内部的高速存储器单元中执行(如片内RAM)。本文以TI 公司的TMS320C6713(以下简称为C6713)浮点DSP和AMD公司的AM29LV040Flash存储器为例,通过JTAG口加载来设计一个完整的引导装载方案。
TMS320C6713的引导配置
外部信号BOOTMODE[4:3]决定了C6713的引导配置,在RESET信号的上升沿BOOTMODE[4:3]信号被获取。C6713DSP只有2种引导方式:
(1)ROM/Flash引导。外部存储器的一部分通过EDMA控制器拷贝到DSP内部地址0处。尽管引导程序在器件从外部复位释放后才开始执行,但在 CPU被保持在内部复位时,这个拷贝就进行了。Flash宽度也通过BOOTMODE[4:3]选择。在Flash宽度小于32bit的情况下,DSP通过EMIF读取时,可以自动将相邻的8bit字节或16bit半字打包形成32bit的指令字,并且这些数值在外部存储器中可以通过设定HD8来确定 endian存储模式。
(2)主机引导。核心CPU停留在复位状态,器件其余部分保持正常状态。外部主机通过HPI或扩展总线初始化CPU的存储空间。在必要的初始化完成之后,主机在HPI控制寄存器的DSPINT位写1,这个写操作引起DSPINT信号的跳变,从而导致引导配置逻辑使CPU脱离复位状态,然后CPU从地址0处开始运行。
Flash引导模式的实现
硬件设计
C6713引导引脚说明如表1所列。
C6713引导引脚说明


设计时将DSP主机口引脚HD[4:3]中的HD4通过下拉电阻接地,HD3通过上拉电阻接3.3V电源,即HD[4:3]=01B。C6713的 EMIF含有4个CE空间寄存器,由于Flash加载程序是从CE1空间搬入的,因此DSP的CE1与Flash(AM29LV040)的片选相连,这种连接将Flash的内部地址映射到DSP的090000000处,从而完成了基本的硬件设计。DSP与Flash接口的硬件连接如图1所示。

图1 DSP与Flash的引脚连接
引导程序的设计
在对AM29LV040Flash进行读写操作之前,应对其进行擦除,擦除操作需要6个总线周期:
(1)向555H地址的存储单元写入数据AAH;
(2)向2AAH地址的存储单元写入数据55H;
(3)向555H地址的存储单元写入数据80H;
(4)向555H地址的存储单元写入数据AAH;
(5)向2AAH地址的存储单元写入数据55H;
(6)向555H地址的存储单元写入数据10H;
完成上述操作后,Flash存储器完全擦除。
在CCS环境下,用C语言编写上述操作如下:
voidFlash_Erase()
{
*(char*)FLASH_ADR1=0AA;
*(char*)FLASH_ADR2=055;
*(char*)FLASH_ADR1=080;
*(char*)FLASH_ADR1=0AA;
*(char*)FLASH_ADR2=055;
*(char*)FLASH_ADR1=010;
}
根据前面的设计,Flash的内部地址已经映射到C6713的CE1空间,其开始地址为090000000。因此FLASH_ADR1,FLASH_ADR2的定义如下:
#define FLASH_ADR1 090000555
#define FLASH_ADR2 0900002AA
汇编源代码文件
对于C6713而言,DSP上电复位后,EDMA自动从CE1空间拷贝1KB数据(引导代码应定位与此)到地址0处,然后从0地址处开始执行引导代码指令。本引导代码的主要功能是将用户程序段从Flash复制到DSP内部RAM中,然后再跳转到程序的入口处开始执行主程序。在引导程序内复制程序段要使用 EDMA,以快速、灵活地实现DSP存储空间内数据的搬移。数据搬移的源/目的可以是片内存储器、片内外设或外部器件。而此时需要对EDMA的源、目的地址、搬移长度以及基本的传输方式进行相关的设置,如表2所示,然后运用汇编语言编程加入到引导程序即可。
EDMA传输参数设置


核心引导程序如下:
.sect“.BootCode” ;将引导代码分配到BootCode段中
.global myBootCode
.ref_c _int00 ;C程序的入口地址
MVKL .S1EDMA0_OPT ,A5
MVKL . S1050010001 ,B4 ;低16bit写入寄存器
MVKH .S1EDMA0_OPT ,A5
MVKH .S1050010001 ,B4 ;高16bit写入寄存器
STW .D1B4,*A5 ;装载EDMA的OPT参数
MVKL .S1EDMA0_SRA ,A5
MVKL .S1090001000 ,B4 ;低16bit写入寄存器
MVKH .S1EDMA0_SRA ,A5
MVKH .S1090001000 ,B4 ;高16bit写入寄存器
STW.D1B4,*A5 ;装载EDMA的SRC参数
....
....
接下来启动EDMA复制主程序段:CPU可以通过写事件置位寄存器(ESR)启动一个EDMA通道。 ESR中某一位写1时,将强行触发对应的事件。程序如下:
MVKL .S1000000001, B4
MVKL .S1EDMA_ESR, A5 ;低16bit写入寄存器
MVKH .S1EDMA_ESR, A5
MVKH .S1000000001, B4 ;高16bit写入寄存器
STW .D1 B4, *A5 ;将ESR第一位置1
NOP5
传输结束后,跳转到C程序的入口地址 _c_int00处,开始执行主程序:
MVKL .S2_c_int00, B0
MVKH .S2_c_int00, B0
B.S2B0
NOP5
链接命令文件
链接命令文件是DSP开发过程中生成可执行文件(.out)必不可少的一个环节。它对段的功能有2 个,一是将由汇编器产生的COFF格式的OBJ文件作为输入块,当有多个文件进行链接时,将相应的段结合在一起生成可执行输出模块;二是重新定位,将输出的段分配到存储器中的指定地址。
编写命令文件时,有时希望将代码装入存储器的一个地方,而在另一个地方运行。例如:一些关键的执行代码必须装在系统的ROM中,但希望在较快的RAM中运行。链接器提供了一个处理该问题的简单方法。利用SECTIONS伪指令选项可让链接器定位2次。第一次使用装载关键字load设置装入地址,再使用运行关键字run设置它的运行地址。装载地址确定段的原始数据或代码装入的地方,而任何对段的引用则参考它的运行地址。在应用中必须将该段从装载地址复制到运行地址,本引导程序便使用EDMA方式完成这一复制过程。链接命令文件(d)如下:
MEMORY
{
VEC:ORG=000000000,LEN=000001000
PMEM:ORG=000001000,LEN=000004000
CEVEC:ORG=090000000,LEN=000001000
CEPMEM:ORG=090001000,LEN=000004000
}
以上设置是将整个存储器分成具有不同名称的存储区域。VEC,PMEM代表内部RAM的两块存储空间,而CEVEC,CEPMEM代表Flash内的两块存储空间。对目标文件中各段的加载地址和运行地址在SECTIONS段实现。
SECTIONS
{
.BootCode:load=CEVEC;用户的引导代码段定位在Flash的最开始。
.text:load=CEPMEM,run=PMEM;用户程序段装载于
Flash空间,而运行在C6713内部RAM中。
}
通过JTAG口的Flash在线烧写
用汇编语言编写一个搬移程序,内容仅是Flash的擦除过程,以及对EDMA的多次操作构成的由片内RAM到片外Flash的写入过程。把该搬移程序直接嵌入主程序中,这样程序代码长度很短,不会占用过多的主程序空间。在主机引导方式下,通过JTAG口load后,手工更改PC值使其指向这段代码,控制其运行结束,完成自举程序的在线烧写。而在此之后,这段短小的搬移程序不会被主程序中任何一段代码所调用。
结束语
工程实际应用表明该方法是切实可行的,与以往Flash引导程序编写方法相比避免了目标代码的格式转换,利用EDMA直接搬移,无需编程器,Flash也不需频繁拆卸,利于工程上的快速开发。
ME6906MYYBY9M0178
F384-CPU
BK4000
ETRI 75GF026AC11
SMT SWISS CNC 571-044-007
Heckler&Koch 050.100.024.05
Festo DRQD-16-180-PPVJ-A-AR-ZW 175801 S141
SICK WL18-3P130
SICK VT180-P410
UFD11A-00
Siemens PS S7-200 6ES7 214-1AC01-0XB0
Festo LFR-D-MIDI 185763 S308
mayr ROBATIC?-E 3/500.200.0S
SICK WS160-G430/WE160-F430
Siemens 3VF5211-1BH41-7KB1
Pneumatik Atlas PDD 006
SIEMENS 6ES5 700-8MA11
SPG S8I25
5IK60GU-SWM
SIEMENS 6SL3255-0AA00-4JA0
Norgren C72S-D0295
GV2 M20 021091
VAP-HH1
Rexroth VT 11024-16
SKF 22218
Festo DNC-63-450-PPV-A-KP 163398
Parker SPZBE1010E32N
Parker D1SE83BNJW
DPM/PT100/B5 635-054
DESTACO 82L25-103B8H0
Parker SPZB1010E32S
Dunkermotor GR63X25
KEB 13AF506-3585
MT-H1AAD10A111100
KWB ID:2531095 P:400V S:110V/16A
Siemens Sinumerik 6FX1126-1AA03
KM6 6-ON PK110
4LF45N-3
BBS-41-1.5
CE032C01N12N10
QY81P
QX 81
QJ71C24N-R4 RS-422/485
Q61P
Q68B
Siemens 3VL9300-3HR20
NZM3-XAD630
Pfannenberg PA 110
Stück Finder Koppelrelais 49.52.9.024.0050
d20DN15
KG5043
WIELAND WIPOS 81.000.6141.0
AC015S
MarelliMotori MOT.3 MAA 63 MC2-B3
Moeller PS4-101-DD1
PF2W720-F04-67
QX 40-S1
Q64AD
Q61P-A2
MCS 20 - 230/24
PKZM4-58
PLC-RSP-24DC/21AU
ABB XLP 00
RSNT 5/2 E
Trafo 160-0057
PMW-10
Stück Finder Relais 55.34.9.024.5040
LEUZE 96K-1080-T2-24 + SLSE 96K/P-1070-T2-21
MS56C/2
KEB POWERBOX 90.98.200-CE09
Siemens 3TF44 22-0AP0
SWITCHmaster SM-M2
SMC IZE112-L
Hahn+Kolb 7221-42
CKD LCS-25-20
SMC, CXSL15-30R
GINO 3G3IV-PLKEB41P5-D
S8PS-15024CD
BALLUFF BES 516-3009-SA2-MO-C-05 BES0341
Rexroth Star 1666-894-10
Festo CPV-14-VI 18210
F376-OPC
Siemens Simatic S7 6ES7131-1BL01-0XB0
Siemens Simatic S7 6ES7131-1BH01-0XB0
Siemens 3RU1146-4MB1
Festo ADVU-63-25-A-P-A
EUCHNER EGT1-2000 001732
SMC CXSL10-30
SIEMENS 6SU59 31-0CB21
Weld Fase F360-IOB
Weld Fase F356-IOE
Weld Fase F383-COM
DM-485CB-10
Georg Fischer +GF+ 161.546.065
Siemens 6ES7132-1BL00-0XB0
Siemens 3RK1903-1BE00
XVBC8B4
Festo CPE14-M1BH-5/3G-QS-8
Festo ADN-80-60-I-P-A
ENDRESS + HAUSER FTL 120 Z 917602-0001
SB0210-2E1 112U-210 AB 5
Festo VPEV-1/8-M12
Bosch-Rexroth 5724550220
PTBF0010KCSA
3F480-016.225230c
3F480-032.225230c
MITSUBISHI MR-JCCBL20M-H
MITSUBISHI MR-JHSCBL20M-H
Wenglor ZW600PCT3
Siemens Simatic 6ES7 314-1AE04-0AB0
ifm PN7024
Siemens 6ES7 212-1AA01-0XB0
WAGO 750-333
ifm efector 200 OU5018
6ES7400-1TA01-0AA0
FANUC A03B-0801-C009
SMC ZSE1-00-14L-Q ZSE1-00-14L-Q
Bernstein 601.2431.877
Cr36/11
Siemens 6ES7 407-0KA01-0AA0
F381-ETH
RPS 60
FLUTEC 913800-157
MK45-1 DN15-25
IFM AC1218
Pilz 240307
WAGO 750-303
SW-110-8-126-100-1PH3-KAL-10-GGVD-K350-F
CM2-BP04ERO
Horn 312.1027.7994 TN32
22218KMBW33
STATRON 5400.2
YM24PAH2ANZ
3UF7010-1AU00-0
HYDAC VR 2 C.1
Siemens 3NC1093
ifm efector100 KB5004
ifm efector150 KG5066
6FX1120-5BB01
RX1A48D51VC
DNC-32-40-PPV-A-S2
5GU12.5KB
ABL8 REM24050
Phoenix Contact IBS ST ZF 24
Weld Fase F353-ADC
Weld Fase F359-MCP
FB-IOT8-1
SIEMENS 6ED1 052-1CC00-0BA6
KUKA Art Nr. 05 71 040 098
ZDPM 25/700 // ISO 6432-Zylinder
VIPA 123-4EJ00
Siemens 3RT 1646-1AP01
SIEMENS Simatic S5 PS3A E24G5/3WRGD DIN 41752
Siemens 3TF48 22-0AP0
Siemens 3TF5022-0AN2
MITSUBISHI Q173DV
JZSP-CSP01-05
CM2-BP04EAA
CM2-BP04EAO
DNC-50-25-PPV-A-KP
CST 575/25/6 380/24V
FEN-12/16-60-KF
Telemecanique GV3 M40 021307
3UF7110-1AA00-0
6AV2100-0AA03-0AA5
4EM5008-0DK00
Siemens Simatic S7 6ES7 193-0CB10-0XA0
SMC 9220-5YO-03F-Q
FANUC A02B-0076-K002
QY80
PULS ML 60.241
SIV433-IP
ifm KI5083
SIEMENS 6ED1 052-1MD00-0BA6
Siemens 6FX1116-8AA00
GOEMA 107 321-1BL00 S7
Rittal Ablagepult PS 4638.800
Festo MDH-2-2,2-AW-QS-6
Festo CPA10-M1H-5/3BS
RM35TF30
Novotechnik RFC 4801-636-211-206
SIEMENS 6ED1 055-1CB10-0BA0
EK110000793NEU
Riegler MV 2217G
MURR MDN 25-400/24 85901
AUTONICS T4YI-N4NP0C
SCHMALZ SMP 15 NOASVD 10.02.02.00567
Bosch CL100 050192-205
BALLUFF BIS009A C-6002-019-xxx-03-ST11
BOSCH 0 821 640 018
Siemens 3RV1721-1GD10
Siemens 3RV1821-1GD10
Wieland SNO4003K
Siemens 6EP1 961-2BA00
GV3L32 32A +GVAN11
BCS0062 M12T4D2-PMS80G-S04G
Omron E2KQ-X10ME1
OMRON CJ1W-IC101 I/O
OMRON CJ1W-II101 I/O