Digital Control Library 是TI用于C2000控制器部署常见控制算法的工具包,具体部署方式可以参考其用户手册,该手册可以在本文中找到,目前已经有更高版本的DCL,有需要的可以自行查找;此前,我的PI控制器通过下面3个步骤完成了配置:
- 添加对应的文件:也即"DCL.h"文件和"DCL_PI.asm"文件
- 在main.c中包含"DCL.h"文件:#include "DCL.h"
- 修改28335_RAM_Ink.cmd文件,添加dclfuncs对应的内存地址:
dclfuncs : > RAML2, PAGE = 0
然后在将代码转为写入Flash,断开仿真器重新上电后,对应的控制代码却无法使用(函数DCL_runPI(PI *p, float rk, float yk)无法调用,导致程序卡死);在经过查阅文档后,得出结论:该部分控制代码需要将Flash部分通过内存拷贝到RAM中才能运行,因为该函数是针对RAM中运行而写的汇编代码,在重新上电后RAM中并不含有对应的指令。
具体解决方式如下:
- 添加"DSP2833x_MemCopy.c"函数到工程中
- 定义需要拷贝的内存地址
extern Uint16 dclfuncsLoadStart; extern Uint16 dclfuncsLoadEnd; extern Uint16 dclfuncsRunStart;
-
在main.c中完成内存拷贝:
MemCopy(&dclfuncsLoadStart, &dclfuncsLoadEnd, &dclfuncsRunStart); InitFlash();
-
修改F28335.cmd文件,添加对应的RAM运行地址和Flash加载地址
dclfuncs : LOAD = FLASHE, RUN = RAML2, LOAD_START(_dclfuncsLoadStart), LOAD_END(_dclfuncsLoadEnd), RUN_START(_dclfuncsRunStart), LOAD_SIZE(_dclfuncsLoadSize), PAGE = 0
其他配置和一般工程的Flash注意事项相同,重新烧写后,大功告成!
最后,关于将Flash拷贝到RAM的其他用法可以在本文提供的文档”Running an Application from Internal Flash Memory on th TMS320F28xxx DSP“中找到: