DSP扩展地址加载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于HPI的代码加载在扩展内存的实现
摘要:
一、扩展内存加载的概述
本例程主要针对5410A进行扩展地址加载的试验,即把DSP代码通过HPI方式加载到扩展页0x18000-0x1ffff内。

5410A的HPIC寄存器的位域描述如下表:
通过HPI口向DSP的扩展页读写数据时,首先要配置HPIA寄存器的值,当XHPIA=1时,向HPIA 写数据时配置的是高7位地址(即页),当XHPIA=0时,向HPIA寄存器写数据配置的是低16位地址。

主机端主程序加载代码的流程图如下图所示,假设DSP代码运行的起始地址为0x18080。

图1 主机的主程序流程图
在XHPIA=1时,向HPIA寄存器写入的高低字节的数据要相同。

并且主机通过HPI口加载代码的时候,XHPIA要为0,否则不能正确加载代码。

代码加载完后,要向DSP的7EH和7FH地址写入程序运行的起始地址。

在向0x007E和0x007F地址写入数据之前,要使HPIA高7位地址为0(即先后写HPIC=0x1111,HPIA=0x0000)。

DSP端要注意的设置有两点:
1、重新设置option---memory map中的程序映射范围。

2、设置project----build option-----compiler中的processor version为548,并选中User Far call(扩展
页加载)。

3、DSP编译链接时CMD文件中,程序的首地址要和通过HPI方式加载的代码的首地址一致。

4、DSP的代码加载到0x18000-0x1ffff地址内时,hex文件中的地址信息已经超过了64K的范围,
所以要选择合适的hex转bin工具,因为一般的转换工具转换的地址范围最大是64K。

可以使用hex2bin.exe文件,在dos下进入dsp.hex(假设hex文件的文件名是dsp)文件夹下,在命令行输入hex2bin.exe dsp.hex即可生成dsp.bin文件。

5、注意在扩展页寻址时的几个指令:FB、FBACC、FCALL、FCALA,FRET、FRETE以及WRITA
和READA。

6、要注意指令作用的数据位长。

如果一个标识符table在0x18000-0xffff地址中,使用ld #table,a
指令将把table所在地址的低16位送给a。

7、因为MP/MC=0的时候,片内的DARAM才定位到0x18000-0x1ffff程序空间,所以要注意MP/MC
的值。

extend_loader.BIN文件是烧写到单片机的二进制文件。

二、中断及其在扩展内存的加载
因为在5410A中,HPI加载的内存映射范围是0x80---0x7FFF、0x18000—0x1FFFF。

所以通过HPI 加载时,中断向量和代码只能写到该范围内。

在CMD文件中,当向量或者代码定位到x0080H—x7FFFH时,应将向量或者代码写到0080H—7FFFH对应的地址内,此时OVL Y=1。

在CMD文件中,当向量或者代码定位到18000H—1FFFFH 空间时,应将向量或者代码写到18000H—1FFFFH对应的地址内。

如果向量和代码连续存放,可以一次把数据写完,然后跳转到写入的起始地址开始执行代码;如果向量和运行代码放到不连续的地址内,应在对应的首地址分别写入,然后跳转到运行代码处执行。

并满足凡是有代码的页一定有一个中断向量表,因为在5410A中,当OVLY=1时,低32K RAM映射到所有页的低32K范围内,所以只需在0页加入中断向量表就可以映射到所有扩展页。

同时也要注意PMST中IPTR的配置,使其与VECTORS映射首地址的低16位一致。

FCALL,FB,FRETE,FRET四条指令说明:
FCALL指令执行时,把XPC和PC的值压入堆栈.
FRET 指令执行时将XPC和PC的值弹出堆栈。

FB指令只把转移地址的高7位和低16位放入XPC和PC,不会对XPC,PC进行保护。

FRETE指令把数据从堆栈弹出到XPC和PC,中断返回。

在中断服务程序中,PC会自动压入堆栈,而程序计数器扩展寄存器XPC不会自动压入堆栈。

如果中断向量表和ISR位于不同的页面,用户必须在分支转移到ISR之前压入XPC到堆栈中。

FRET指令从堆栈恢复XPC和PC的值,并从ISR返回。

在C语言中,FRETE中断返回指令是在far call的时候出现,RETE指令是在near call时出现。

注意使用far call(XPC入栈),near call(XPC不入栈)时,中断跳转之前XPC入栈与不入栈问题。

如:
Int0 :
Nop
Pshm xpc
B #_xxxxxx
此时编译连接时要使用far call,中断结束后FRETE指令正确恢复XPC的值
在0页加载代码时,C语言的运行支持库使用rts.lib,并使用near call。

在扩展页加载时,C语言的运行支持库使用rts_ext.lib,并使用far call。

相关文档
最新文档