DSP新手开发爬坑笔记------持续更新中

以下内容纯属个人经历之谈,如有雷同那就雷同了吧。

开发环境注意事项!!

在进行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" 

## 生成bin文件过大的修改方法:

用仿真器下载程序到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区域被擦除了。
常规做法是先设置配置信息-》保存配置信息——》重新加载到仿真器上。
在这里插入图片描述

然而我采用上述方法始终达不到我要的效果。因此我只能通过以下选项解决我的问题。
更改选项:
在这里插入图片描述

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值。其主要原因是两个相同变量生成的符号表是一样的。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值