在现有的硬件基础上开发DSP软件大体步骤如下:
一、准备阶段
1、分析开发项目需求,即软件所需要具备的功能,如AD采样、通讯、外设控制等等;
2、了解硬件平台资源,如硬件存储器资源、外设IO资源、通讯接口等等,为DSP的初始化工作做准备的;
3、结合硬件资源和需求制定一个可行的软件方案;
二、代码编写阶段
代码编写因人而异,大体步骤:
1、搭建文件框架,一般一种功能对应一个C文件和H文件,根据11软件需求来;(特别提醒不要把所有代码都放在一个或几个文件里,不然哪怕注释得再清楚,在后期的调试和维护时都很费劲)
2、搭建函数框架,文件搭好后,在对应的文件中添加对应的功能函数,函数只需要定义函数名即可,如VoidSystemInit(){;};
3、函数框架也搭好后就可以开始添加代码了,首先是添加DSP器件相关程序,比如系统时钟配置,中断函数;I/O功能脚配置等;其次逐块添加算法代码,原则是从易到难,每个函数框架代码搭建完后最好都进行测试。
三、调试优化阶段
以上一块块功能测试正常后,就可以开始整体测试了,直至最终调试完成。
用的都是CCS编程。
CCS有两种工作模式:
1软件模拟器模式:可以从DSP芯片中分离出来,在PC上模拟DSP的指令集和工作机制,主要用于前期算法的实现和调试。
2硬件在线编程模式:在DSP芯片上实时运行,将应用程序的在线编程和调试与硬件开发板集成。
CCS的开发系统主要由以下组件构成:
1TMS320C54x集成代码生成工具;
2CCS综合开发环境;
3DSP/BIOS实时内核插件及其应用程序接口API;
4实时数据交换RTDX插件及相应的编程接口API;
5由第三方TI公司对外提供多种应用模块插件。
扩展资料:
dsp编程中双重循环、多重循环的优化:
(1)多重循环拆成单层循环,减少循环层数;
例如,双重循环内一个百cycle只使用了一个乘法器,拆成单层循环后,一个cycle可使用2个乘法器,充分利用DSP乘法器资源,同时运算速度也会加快;
(2)如果循环次数较少,则将其放入外循环;如果循环次数更多,则将其放入内存循环;
(3)二维数组的双环:二维数组的行循环置于外环,列循环置于内环;
(4)避免循环内的乘除 *** 作:循环内的乘除 *** 作移到循环外,由加法代替。
FPGA与DSP的区别如下:
1、硬件层面的不同。
在硬件层面,DSP是ASIC,如同CPU GPU一样,适宜于量产降低成本,缺点是(硬件)设计一旦确定,便不易于修改。而FPGA较灵活,可以通过硬件描述语言进行快速设计和改进,但成本较高,传统上讲用于ASIC的prototype设计。
2、软件层面的不同。
在软件层面上,给DSP写程序和给多核CPU写程序,给GPU写程序,没有太大区别,DSP有完善的C语言编译器。目前高端的FPGA中都集成了硬核DSP。
3、编程语言不同。
FPGA主要使用HDL,包括VHDl,Verilog,还有数模混合的描述语言Verilog-AMS等。DSP使用C,汇编语言编程。
4、 功能角度不同。
FPGA普遍用于实现数字电路模块,基本上能实现所有的数字电路,传统的数字功能模块,以及客户产品特定需求的数字处理模块。FPGA的IO桥接种类繁多,不同种类的级别的FPGA支持的IO标准和协议都不尽相同,但是这些IO的驱动能力或是电压都是可编程配置的。
这个挺简单的吧
不知道你的DSP设置情况,我就说下我怎么设置吧。我设置的DSP频率是150M,你要发的PWM波周期是20KHz,设置连续增减模式,计数的最大值应该设为150M/40k=3750,你在设置比较值,如果占空比是50%,就设一半。然后你设个计数值,确定是什么时候开通哪个PWM,定义个flag就可以
了,设置为012,到了你的PWM长度就加1,到3时清0,等于0开PWM1,1开PWM2,2开PWM3就ok了。
设计
内容
及
功能
说明
设计内容:
本次设计内容为基于DSP定时器的LED控制系统设计,具体要求如下:
(1)给定电源5V,设计供电电路。
(2)给定外部晶振30M,系统时钟工作在150M,给出寄存器如何配置。
(3)利用定时器定时1秒,实现四个LED灯的秒闪。
(4)自主完成发挥功能。
(5)撰写设计报告。
功能说明:
本设计利用F28335DSP芯片来控制模拟基本的LED闪烁,给予系统额定电压来保证系统的正常工作,用中断的方式定时控制LED灯的集体闪烁频率。
设
计
步
骤
设
计
步
骤
设
计
步
骤
设
计
步
骤
设
计
步
骤
步骤一:DSP最小系统分析
1DSP最小系统
能够用于基本的数字信号处理,运行一些简单的程序。此部分主要包括电源电路、复位电路、时钟电路等。
2晶振电路
DSP的时钟可以有两种连接方式,即外部振荡器方式和谐振器方式。如果使用内部振荡器,则必须在X1/XCLKIN和X2两个引脚之间连接一个石英晶体。如果采用外部时钟,可将输入时钟信号直接连到X1/CI。KIN引脚上,X2悬空。本设计采用外部晶振,直接选择一个33V供电的30MHz晶振实现。系统工作是通过编程选择5倍频的PLL功能,可实现最高工作频率(150MHz)。如图1所示:
图1 晶振电路图
3复位电路
对于实际的DSP应用系统,特别是产品化的DSP系统,其可靠性是一个不容忽视的问题。由于DSP系统的时钟频率较高,在运行时极有可能发生干扰和被干扰的现象,严重的系统问题可能出现死机现象。为了克服这些情况,除了在软件上做一些保护措施外硬件上必须做相应的处理。硬件上最有效的保护措施是采用具有看门狗(Watchdog)功能的自动复位电路相结合的方式。
TMS320F28335的复位输入引脚XRS为处理器提供了一种硬件初始化的方法,它是一种不可屏蔽的外中断,可在任何时候对TMS320F28335进行复位。本设计采用了简单的RC复位电路,复位电路如图所示2:
图2 复位电路图
4电源电路
F28335DSP采用了双电源供电机制,以获得更好的电源性能,其工作电压为33V和18V。其中,18V主要为该器件的内部逻辑提供电压,包括CPU和其他所有的外设逻辑。与33V供电相比,18V供电大大降低功耗。外部接口引脚仍然采用33V电压,便于直接与外部低压器件接口,而无需额外的电平变换电路。在本设计里我用TI公司的TPS7301单输出可调电压调节器作为主器件的电源电路,将5V转换为33V和19V供给DSP,使系统正常工作。电源电路如图3所示:
图3 电源电路图
步骤二:本次设计硬件电路分析
1定时器中断的实现
为了实现定时器的精确走时功能,系统利用定时器0、PIE模块和CPU中断共同作用产生定时器中断。首先为定时器0设置定时初值,并开启定时器使其计数。当定时器计数器寄存器递减到零时,定时器会产生一个中断TINT并将其传送给PIE外设中断模块,当PIE中的中断时能位PIEIER被时能后,PIE会将这个中断传送给CPU,如果CPU的中断使能位和INTM被使能,则CPU会相应定时器0中断,转而执行定时器0的中断服务子程序。
2LED显示电路
在定时结束后LED要不停地闪亮,提醒用户定时结束。在本次设计中,将一个发光二极管的输入段与电源相连接,输出与DSP芯片的GPIO4端口相连接,当GPIO端口为低电平时,LED点亮。
步骤三:CMD文件介绍
text段:存放C程序代码;
cinit:存放C程序中的变量初值和常量;
stack:为C程序系统堆栈保留存储空间、用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;
bss:为C程序中的全局和静态变量保留存储空间;
const:存放C程序中的字符常量、浮点常量和用const声明的常量;
sysmem:用于C程序中的malloc、calloc和realloc函数动态分配存储空间;
far:为C程序中用far声明的全局和静态变量保留空间。
MEMORY用于定义目标存储器的映射,描述了目标系统可以使用的物理存储地址范围及其类型。
PAGE 0 为程序存储空间,起始地址为0x000000包含BEGIN 、BOOT_RSVD、RAMM0 、RAML0、RAML1、ZONE7A 存储区。
PAGE 1为数据存储空间,起始地址为0x000400包含了RAMM1、RAML4、RAML5、RAML6、RAML7、ZONE7B存储区。
SECTIONS用于指示连接器怎样组合输入端,以及如何将输出段定位到存储器中,用于将COFF目标文件中的各个段定位置MEMORY伪指令定义的存储区域。
步骤四:流程图及软件设计
1系统时钟的详细配置如下
PLLSTS[OSCOFF]=0;
PLLSTS[PLLOFF]=0;
PLLCR[DIV]=1010;
PLLSTS[DIVSEL]=2;
PLLKCR0的ADCENCLK=0。
2PLL模块的寄存器
锁相环模块的寄存器包括锁相环控制寄存器PLLCR和锁相环状态寄存器PLLSTS,以及外部时钟输出控制寄存器XINTCNF2。其中XINTCNF2用于配置XCLKOUT与SYSCLKOUT的关系。PLLCR和PLLSTS用于振荡器和锁相环模块的配置,以产生CPU时钟输入CLKIN,其位分布如下:
15 4 0
PLLCR
R-0 R/W-0
15 9 8
PLLSTS
R-0 R/W-0
7 6 5 4 3 2 1 0
R/W-0 R/W-0 R/W-0 R/W-0 R-0 R/W-0 R-0 R/W-0
OSCOFF和PLLSTS分别用于振荡器时钟和锁相环时钟的允许;PLLOCKS为锁相环锁定状态标志;MCLKOFF、MCLKCLR、和MCLKSTS用于输入时钟失效检测。
3流程图
图4 程序流程图
步骤五:系统调试及设计结果分析
按下电源按钮,写入程序,刚开始,4个LED灯全灭,等待一秒钟,4个LED等全亮,如此循环测试结果成功完课程题目的。效果图如图5所示:
图5 效果图
设
计
小
结
通过这次DSP课程设计,我觉得学到了很多东西。它让我懂得了什么是课程设计,为我们以后的毕业设计打下了一些基础。更重要的是通过这次课程设计,我多少清楚了在以后的工作中我们这个专业能做些什么,也为我们以后的工作积累了一些经验,很有意义。
在本次课程设计过程中出现了一些不该出现的失误。一是不会使用CCS软件,在同学的帮助下使用并编写程序。其二是不能DSP程序烧入试验箱的问题,但是在老师的指导下成功将程序烧入试验箱;之后又遇到DSP程序烧入试验箱后试验箱无反应,同样在老师的帮助下完成实验,并在试验箱上得到想要的实验结果。
通过这次课程报告,使我更深入的掌握了DSP的许多知识,学会了如何让配置寄存器、系统时钟,如何设计电源等等很多知识,不仅复习了以前所学过的知识,而且还接触并学到了很多书本上没有的知识。使我解决问题时更加冷静和熟练,遇到不会知识的积极查阅相关资料,并做好笔记。经过仔细调查确定问题的原因和解决问题的能力有了很大提高。
最后,感谢刘老师的帮忙以及同学之间的相互帮助,使我能顺利完成这次课程设计。
评
分
标
准
(一)系统设计部分(50分,分三档,达不到最低档的小组需重新设计上交)
1完成规定的全部功能,硬件电路设计正确,程序简洁、可读性、逻辑性强,较好的演示了全部功能。(50分)
2完成规定的全部功能,硬件电路设计正确,程序较简洁、可读性、逻辑性较强,基本演示了全部功能。(45分)
3完成规定的部分功能,硬件电路设计无明显错误,程序设计无明显错误,能够完成部分功能的演示。(40分)
(二)设计报告撰写情况(45分)
1态度认真,报告内容充实、撰写规范。(20分)
2对所做设计进行了详细的介绍,语言组织精炼,测试数据记录准确。(25分)
(三)发挥部分(5分)
在完成规定功能的基础上,有创新性功能设计个人,获得此项成绩。
总分
任课教师签字
审核人签字
附录:
附录A:实物图
图A
图B
附录B:CMD文件
MEMORY
{
PAGE 0 :
BEGIN : origin = 0x000000, length = 0x000002
BOOT_RSVD : origin = 0x000002, length = 0x00004E
RAMM0 : origin = 0x000050, length = 0x0003B0
RAML0 : origin = 0x008000, length = 0x001000
RAML1 : origin = 0x009000, length = 0x002000
ZONE7A : origin = 0x200000, length = 0x00FC00
CSM_RSVD : origin = 0x33FF80, length = 0x000076
CSM_PWL : origin = 0x33FFF8, length = 0x000008
ADC_CAL : origin = 0x380080, length = 0x000009
RESET : origin = 0x3FFFC0, length = 0x000002
IQTABLES : origin = 0x3FE000, length = 0x000b50
IQTABLES2 : origin = 0x3FEB50, length = 0x00008c
FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0
BOOTROM : origin = 0x3FF27C, length = 0x000D44
PAGE 1 :
RAMM1 : origin = 0x000400, length = 0x000400
RAML4 : origin = 0x00B000, length = 0x002000
RAML5 : origin = 0x00D000, length = 0x001000
RAML6 : origin = 0x00E000, length = 0x001000
RAML7 : origin = 0x00F000, length = 0x001000
ZONE7B : origin = 0x20FC00, length = 0x00040
}
SECTIONS
{
codestart : > BEGIN, PAGE = 0
ramfuncs : > RAML0, PAGE = 0
text : > RAML1, PAGE = 0
cinit : > RAML0, PAGE = 0
pinit : > RAML0, PAGE = 0
switch : > RAML0, PAGE = 0
stack : > RAMM1, PAGE = 1
ebss : > RAML4, PAGE = 1
econst : > RAML5, PAGE = 1
esysmem : > RAMM1, PAGE = 1
IQmath : > RAML1, PAGE = 0
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
DMARAML4 : > RAML4, PAGE = 1
DMARAML5 : > RAML5, PAGE = 1
DMARAML6 : > RAML6, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1
ZONE7DATA : > ZONE7B, PAGE = 1
reset : > RESET, PAGE = 0, TYPE = DSECT
csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT
csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT
adc_cal : load = ADC_CAL, PAGE = 0, TYPE= NOLOAD
}
附录C:源程序
#include"DSP2833x_Deviceh"
#include"DSP2833x_Examplesh"
interrupt void zz(void);
#define LED ((unsignedshort int )0x180000)
#define SRAM_Base_Adress 0x100000
void main(void)
{
InitSysCtrl();
InitXintf16Gpio();
DINT;
InitPieCtrl();
InitPieVectTable();
EALLOW;
IER = 0x0000;
IFR = 0x0000;
PieVectTableTINT0=&zz;
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0,150,1000000);
CpuTimer0RegsTCRall=0x4001;
IER |=M_INT1;
PieCtrlRegsPIEIER1bitINTx7=1;
EINT;
ERTM;
LED=0xff;
for(;;); }
interrupt void zz(void)
{LED=~LED;
PieCtrlRegsPIEACKall=PIEACK_GROUP1;
}
cpufreqinmhz是dsp的实际工作频率,这个参数的单位是mhz,
periodinusec是要定时的时间长度,单位是微秒
定时值=定时长度/(cpu的周期)=定时长度×cpu的频率
timer->regsaddr->prdall=
temp
向定时器周期寄存器赋值
timer->regsaddr->tprall
=
0;
timer->regsaddr->tprhall
=
0;
上面两句是配置定时器预定标寄存器,每个定时器源时钟周期tim(定时器计数器)减一
timer->regsaddr->tcrbittss
=
1;
//
1
=
stop
timer,
0
=
start/restart
timer
timer->regsaddr->tcrbittrb
=
1;
//
1
=
reload
timer
timer->regsaddr->tcrbitsoft
=
0;
timer->regsaddr->tcrbitfree
=
0;
//
timer
free
run
disabled
timer->regsaddr->tcrbittie
=
1;
//
0
=
disable/
1
=
enable
timer
interrupt
上面这五句是配置定时器控制寄存器,tss写1,停止定时器;trb写1,使能定时器重新装载;soft=0、free=0是配置cpu定时器仿真模式;tie写1,cpu定时器中断使能。
以上是我的理解,我也是刚学,如有错误,还望高三指点
以上就是关于DSP项目开发步骤_dsp开发是什么全部的内容,包括:DSP项目开发步骤_dsp开发是什么、dsp用什么编程_dsp用什么编程语言、请问FPGA与DSP有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)