您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI C2000 >> 28x 定点系列 >> 正文
  DSP28x_usDelay()           ★★★ 【字体:
DSP28x_usDelay()
作者:wangkeye…    文章来源:wangkeyen    点击数:    更新时间:2013-4-3    

程序为了实现精确的定时,使用了一个用汇编编写的延时函数DSP28x_usDelay(),该函数在文件DSP281x_usDelay.asm中,细节请阅读该文件。为了调用该函数,在Main.c中做了如下声明:
 

extern void DSP28x_usDelay(Uint32 time);
 
该函数的定时仍然不够精确,因此在文件DSP281x_Examples.h中做了如下的宏定义修正:
 
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
 
函数DSP28x_usDelay(Uint32 time)要想非常精确,必须在SARAM中运行,因此需要在运行时将其调入SARAM中。为此,需要做如下工作:
 
首先,在DSP281x_usDelay.asm中使用
 
.sect "ramfuncs"
 
将该段代码定义到段“ramfuncs”中,段ramfuncs的位置在编译时指定,实际上由F2812.cmd文件中的如下语句来指定:
 


ramfuncs LOAD = FLASHD, PAGE = 0,
 
RUN = RAML0, PAGE = 1,
 
LOAD_START(_RamfuncsLoadStart),
 
LOAD_END(_RamfuncsLoadEnd),
 
RUN_START(_RamfuncsRunStart)
 


第1行表示该段的装载在PAGA0的FLASHD中(PAGA0和FLASHD的分段请见F2812.cmd文件,后文将有详解);
 
第2行表示该段的运行地址在PAGE1的RAML0中(PAGA1和RAML0的分段请见F2812.cmd文件,后文将有详解);
 
LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);
 
LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见CCS的帮助文档);
 
LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);
 
从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际运行时DSP并会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。
 
在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必须先声明,本工程在文件DSP281x_GlobalPrototypes.h中做了如下声明:
 
extern Uint16 RamfuncsLoadStart;
 
extern Uint16 RamfuncsLoadEnd;
 
extern Uint16 RamfuncsRunStart;
 
然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart—RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,在DSP281x_GlobalPrototypes.h声明。
 
注意:即使这样,定时仍然可能不精确,因为可能有中断打断DSP28x_usDelay()的运行,所以在调用之前要关中断。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2