以下内容纯属个人经历之谈,如有雷同那就雷同了吧。
文章目录
开发环境注意事项!!
在进行DSP开发的过程中,CCS的安装环境和运行环境一定要卸掉杀毒软件及相关产品。
项目工程创建
能自己搭建工程的情况下,千万别用别人已有模版。不会搭建工程的情况下直接用官方实例(定时器工程)。特别是开发双核DSP时,如果CPU1与CPU2代码不是一个人独立开发时,一定要每个CPU核单独建立工程,要特别注意每个CPU核对应的CMD文件修改情况,共享RAM使用权的分配。
官方实例学习要点
以TI 系列芯片为例,直接参考C2000Ware_DigitalPower中的实例及解决方案。把参考实例都在开发板上跑一遍,在自己建工程跑一遍。特别是实例中硬件初始化的顺序,以DMA+SPI为例,参考下图:
实例中 dma初始化在spi初始化之前,如果你将dma初始化放到spi初始化之后 DAM 将无法自动初始化。
算法仿真
我们在开发DSP算法时,大多数开发者采用正向算法设计的方式。
1.即先采用仿真软件对要开发的对象建模;
2.进行参数设定、仿真。再根据仿真结果生成,或者编写C语言代码最后在实物上进行联合调试。
或者采用半实物仿真,即最前端的数据采集部分采用硬件完成。后面的算法通过PC机采样进行算法设计,最后在迭代优化到DSP硬件上。
然而这些算法开发最终的都要转换为代码进行验证。
其实在开发算法时,也可以采用S-function对代码进行仿真。
1.根据matlab或其他工具将仿真结果进行计算。
2.将仿真算法转换为c语言代码。开发的过程中,利用S-function进行仿真。
当matlab仿真与代码仿真结果基本一致时,我们就可以认为该系统具备了实物仿真的基础。剩下的调试就是对一些基本的初始化,特殊工况的调试。
CCS如何生成hex和bin文件
方法一:
请查看此贴
以下为 C2000生成bin文件的配置如下:
1.
"${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd2000" "${CG_TOOL_ROOT}/bin/hex2000" "${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd2000" "${CG_TOOL_ROOT}/bin/hex2000" "${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin"
如果采用非C2000的芯片只需修改以下这段
"${CG_TOOL_ROOT}/bin/ofd2000"
"${CG_TOOL_ROOT}/bin/hex2000"
用仿真器下载程序到flash中,然后通过ccs或者unflash导出falsh内容发现,生成的flash中有很多字节为0x00与导出的文件中0xff不一致。因此在要通过命令填充这些字节。具体操作如下:
## 生成bin文件中0xff替换0x00的方法:
两个项目同时烧写至一个dsp时,Flash区域误擦除
问题描述:
Bootloader 区域: Sector A;Sector B;Sector C;
App 区域:Sector D;Sector E;Sector F;
烧写APP时 Bootloader区域被擦除了。
常规做法是先设置配置信息-》保存配置信息——》重新加载到仿真器上。
然而我采用上述方法始终达不到我要的效果。因此我只能通过以下选项解决我的问题。
更改选项:
这个问题还有一个解决方案。我这里把CCS重新安装了一遍,也解决了Selected Sectors Only选项无效的问题。
DSP 宏定义参与数学运算
#define A 1000
Uint32 u32test = 0
u32test = u32test + (Uint32)A;
参与运算时必须强制转换为对应的数据。不然结果就会强转其它类型(CCS 10);
DSP 强转数据时CCS数据补位的问题:
遇到一个奇怪的现象:
数据强制转换类型时:
28377D 官方实例 核1工程 CCS会给该数据高位 置0。
核2工程 CCS会给该数据高位 置1,而非置0 (DSP28377D_CPU2_工程);
一个文件内,不同函数中两个静态变量同名,仿真器无法读取数值:
实例如下:
void FuncA(void)
{
static int SciaByter = 0;
.
.
.
SciaByter++;
}
void FuncB(void)
{
static int SciaByter = 0;
.
.
.
SciaByter++;
}
计算收到SCI接收到的包数。查看map文件及仿真器。发现程序只更新第一个定义的SciaByter值。其主要原因是两个相同变量生成的符号表是一样的。
串口无法接收数据,并且RXERROR位置1
1.先查看 状态位的FE位,BRKDT位。如果置位后无法接收数据,先用下面的代码解决:
if (SciaRegs.SCIRXST.bit.FE == 1 ||SciaRegs.SCIRXST.bit.BRKDT == 1 || SciaRegs.SCIRXST.bit.RXERROR == 1)
{
InitSciA();
asm(" RPT#10 || NOP");
}
2.查询硬件问题。
我这遇到的事串口总线上有干扰,SciaRegs.SCIRXST.bit.FE 一直清除不掉。