首先,是延迟函数的使用:在做电机调速时,发现自己用C简单编写的延迟delay函数,会出现实际延迟时间与程序设定时间误差较大的情况,查阅一些资料,发现可以利用例程里已有的延迟汇编文件,编写较为准确的延迟函数DELAY-US(),且调用简单可靠。具体步骤如下:1,下载DSP281x_usDelay.asm文件,将内容改为
extern void DSP28x_usDelay(Uint32 Count);
.def _DSP28x_usDelay
.sect "ramfuncs"
.global __DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR
放于工程的source中;
2,在MOTOR.H文件中定义
#define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT)
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
3,在GlobalPrototypes.h中定义
extern void DSP28x_usDelay(Uint32 Count);
4, 在程序中直接调用DELAY_US(A),例如 DELAY_US(1000L);,表示延迟1ms 。
其次,是2812flash烧写的问题,具体步骤如下:(1) 下载烧写FLASH配套CMD文件、LIB文件以及起始代码asm文件。
CMD文件名称:DSP281x_Headers_nonBIOS.cmd
CMD文件名称:Flash.cmd
LIB文件名称:rts2800_ml.lib
ASM文件名称:DSP281x_CodeStartBranch.asm
(2)配置C文件
配置好主程序的C文件,才能将FLASH成功烧录,并且将FLASH中的文件拷贝到RAM中运行。
关于C文件的配置。
首先在F2812.CMD文件中,我们可以看到有关于加载FLASH到RAM的内容:
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
以及在C文件中调用FLASH 到RAM的函数memcpy,将它放在系统初始化(InitSystem();)之后即可:
InitSystem();
memcpy(&RamfuncsRunStart,
&RamfuncsLoadStart,
&RamfuncsLoadEnd - &RamfuncsLoadStart);
Initflash();
关于ramfuncs,则在系统初始化中定义即可。如:sysctrl.c中
#pragma CODE_SECTION(InitFlash, "ramfuncs");
(3)我们需要定义所用变量:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
我的这些定义都是:DSP281x_GlobalPrototypes.h 当中,当然,也可以放在其他系统初始化的地方。
Memcpy这个函数应该是rts2800_ml.lib库文件中自带的,不需要我们定义。
(4)烧写成功后的注意事项:
1. 一定要拔除仿真器(JTAG端),给电路板重新上电,方能实现FLASH启动。
2. 注意MP/MC引脚的电压。0为方式MC来作为计算机模式启动,3.3V为方式MP作为微处理器模式启动。
3. 由于GPIO引脚的F4F12F3F2决定了DSP2812的启动顺序,而从FLASH必须要在F4(SCITXDA)为1,而F12F3F2随意的状态下启动。请大家启动前确认F4引脚电压。