DSP学习笔记.docx
- 文档编号:29796023
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:44
- 大小:43.72KB
DSP学习笔记.docx
《DSP学习笔记.docx》由会员分享,可在线阅读,更多相关《DSP学习笔记.docx(44页珍藏版)》请在冰豆网上搜索。
DSP学习笔记
一、如何开始DSP的学习
以下为各网友学习DSP的一些经验
fxw451:
大家先大体上看一遍书,把大体的知识了解一下。
其次就是看例子了,例子是关键,例子里有你学的所有的东西,这次你再拿出一本书来看,这次是有针对性的看,比如你做的spi的,你就直接看spi那张,一边看例子一边看书,这样你就可以把一些重要的寄存器给记住了。
对于初学者来说,一直好奇的就是ccs的使用,拿我第一次使用ccs来说,当我把ccs和板子连载一起时,我相当高兴,成功感油然升起,接下来就是用ccs里的看自带的例子了,看完后你就会发现,这些是什么东东哦,什么都不会,这就对了,你要是看一开始看会了你就是神仙了,dsp不像单片机那么容易上手,所以你要花费点功夫吃透它,好东西不是那么容易就可以搞定的。
到了自己编程的时候了,这个时候不要要求自己能编一个什么样的程序,你要仿着例子里的东西全部搞定就可以了,这就是你编程的第一步,当然也是成功的一步,在这成功下,我相信你的积极性肯定被调到起来,对dsp越来越热爱了。
suary:
1)把存储器映射结构搞清楚----说的具体点就是dsp内到底有那些存储器(ram,rom,flash,etc),这些存储器到底是如何分配的,这个可以参考相关的.cmd文件的写法,它定义了存储器映射和输入输出段的位置
2)编译器的堆栈操作---有关这点我还是没有具体弄清楚,就是中断或是子程序调用时,系统自己的堆栈操作。
2407有一个8级硬件堆栈,而2812没有,这个区别比较大,所以在编一边针对堆栈操作的程序(eg.rtos)时就要特别注意了。
3)中断系统----每个mcu的中断系统搞清楚了,会给编程带来很大的便利,所以一定要对所用的mcu的中断过程了解的清清楚楚。
4)数据结构---设计好的,适合的数据结构会使自己的程序编写变得结构清楚而且“容易”。
dsp31:
我的经验是:
DSP不管是软件和硬件开发一定要多思考,多比较。
软件人员一定要会调试和定位硬件电路的问题点。
硬件人员一定要考虑接口设计,电平转换,电源稳定性,还有ESD防护等等。
cysmwander:
首先得对C熟悉,但会C语言并不能说明你会编程,编程有结构设计的问题,C语言只是工具,看不懂的就好好去想,想通了就发现自己又上了一个台阶;在学习DSP之前,我觉得应该需要去明白DSP能干什么,所以你一定要先看看DATASHEET,看看DSP的外设和资源,看看你能做啥。
开发环境建立完了你要熟悉开发流程,就是说你有一个IDEA,怎么把这个IDEA在目标板上实现,先做什么后做什么,这个一定要想清楚。
这些都准备好了,你就可以开始干了,千万别犹豫,古人说:
临渊慕鱼,不如退而结网。
千万别怕。
一定要立即动手,毫无顾忌,不要想着,这个东西这么复杂,我从哪里动手阿,万事开头难,你就从你认为对的开始做,做错了重头来。
我和我们公司新来的同事都说:
多动手,烧掉几块板子和几个MCU都是小事,关键是你要动手。
我不建议大家直接拿例程来做试验,因为那样你MCU的结构没有把握,你把例程跑得再好,那也不是你的东西,一定要自己写,例程只能作为参照,一定要一个字母一个字母地去写程序。
yangyansky:
1、看书,这是必要的,也是基础。
第一遍,不用太详细,不过要让自己大概知道书里都有些什么内容。
2、重点了解2812的片内资源的分配情况,尤其是存储器的映射,知道了这个你就明白了你写的哪部分内容是具体存到哪里去了。
掌握bootload的工作原理,知道程序是在哪里,怎么启动的运行的。
至于spi、sci这些外设,我觉得等到具体运用的时候再看不迟。
结合具体的运用还比较容易理解。
3、看例程,在自己编写自己需要功能的代码时要看看已有的例程,看看例程里的各种寄存器是怎么配置的,配置时又是怎么实现的,根据看懂的编写自己想要的,然后跑跑自己的程序看和已有的例程有什么异同,是不是自己想要的。
当然,调试环节是最难的一个环节,这个过程中会出现很多意想不到的问题,只能慢慢摸索慢慢前进了。
4、重点理解中断、定时器、系统时钟的工作过程,这对程序里的时间分配问题很重要。
5、我觉得写程序要规范,这会简便很多操作,使编译得以优化,比如相关的文件定义要放在相应的头文件里,全局变量等的定义最好放在GlobalVariableDefs.c里,相应的中断程序要放在DefaultIsr.c里,等等。
最后是自己的一些感悟:
开发板,仿真器是必要的,它能带给我们更加直观的感受,有空去TI官网转转,里面东西还是挺多的,另外坚持不懈的等待TI--MM拒绝我的芯片申请。
。
囧......资料书推荐清华的那个《tms320c28x系列dsp的cpu与外设》可当工具书查,还就是一本关于例程详解的,两本配合看。
另外一个好的程序模板也是很关键的,TI官网上2812例程,结构严谨并且最大的发挥了CCS的功能,建议先搞懂后再依据此创建自己的模板程序.还有就是芯片的DATASHEET,由于大多数都是英文的看起来比较痛苦,但确都是必须的....想我,四级都还没过来着。
关键还是耐心...最后友情提点下谷歌金山词霸。
。
。
我汗...~
二、完整工程的构成
首先那些最基本的仿真驱动安装,CCS配置等我就不在此累赘了...
一个完整工程文件的构成
总的说一个完整的工程需要由库文件(.lib),头文件(.h),源文件(.c)和CMD文件(.CMD)组成,缺一不可。
至于各文件内容将在以后中详细说明
2812的库文件--文件夹地址C:
\CCStudio_v3.3\C2000\cgtools\lib\rts2800.lib
rts2800_ml.lib---大存储器模式
头文件
头文件的作用是定义了2812内部寄存器的数据结构。
头文件一般情况下不需要修改,如果你需要定义一些在整个工程内都具有作用域的全局变量的时候,可以在头文件中定义这些变量,具体的方法我们以后在例程或项目实践中应该会有介绍。
C文件(主函数)
ADC.C——外设AD的初始化函数,与外设AD相关
CodeStartBranch.asm——引导过程中屏蔽看门狗定时器。
DSP28_CpuTimers.C——CPU定时器的初始化和配置函数,与CPU的定时器相关
DefaultIsr_nonBIOS.C——包含了2812所有的中断函数,写中断时,只要将程序写在对应的函数内就可以,大大保证了中断的成功率。
DelayUs.asm——延时微秒
DSP28x_GlobalVariableDefs.C——全局变量的定义,定义了2812的寄存器,中断向量表等内容。
Ev.C——外设EV的初始化函数,与外设EV相关。
Gpio.C——GPIO的初始化函数,只和GPIO相关。
Main_nonBIOS.c——主函数
PieCtrl_nonBIOS.C——PIE初始化函数,和中断相关,很重要。
PieVect_nonBIOS.C——PIE中断向量表定义以及初始化,很重要。
SetDBGIER.asm——realtime仿真
SysCtrl.C——系统初始化,主要对开门狗,时钟等模块进行初始化,以保证2812正常工作,非常重要。
Watchdog.C——看门狗初始化
Xintf.C——外部接口的初始化函数。
通过上面的分析我们可以看到几个文件非常重要,因此大家每次新建工程的时候,就把这些未编辑过的文件复制过来。
其他的外设相关的文件,您这个工程中涉及到哪个外设,您就把这个外设相关的源文件复制过来,一起加入工程。
CMD文件
以.CMD为扩展名的文件,这个文件的作用是用来分配存储空间的。
由于DSP编译器的编译结果是未定位的,DSP也没有操作系统来定位执行代码,DSP系统的配置需求也不尽相同,因此我们根据实际的需求,自己定义代码的存储位置。
打个通俗的比喻,就是我们有一个仓库,现在需要把货物存放到仓库里面去,为了便于日后取用货物,我们将货物分门别类,然后把它们存放到指定的位置去。
把哪些货物放到哪个位置的规则,就是我们的CMD文件的内容。
CMD文件又分成两种。
一种是分配RAM空间的--微计算机模式(仿真模式)---XMP/MC`=0,用来将程序load到RAM内进行调试,因为我们大部分时间都是在调试程序,所以多用这类CMD,另一种是分配FLASH空间;
微处理器模式---XMP/MC`=1,当程序调试完毕后,需要将其烧写到FLASH内部进行固化,这个时侯我们就需要使用这类CMD文件了。
其中DSP281x_Headers_nonBIOS.cmd---用于分配编译产生的各个段至存储器
F2812_EzDSP_RAM_lnk.cmd---用于将281x的外设寄存器结构产生的数据段映射至对应的存储器空间以上2个CMD文件均为仿真模式下无BIOS的CMD文件,CMD文件内容将在以后详细解释
第二课课后
1.什么是GEL文件?
GEL文件的作用是什么呢?
答:
GEL是通用扩展语言(GeneralExte;2.Lib文件内部究竟是什么内容,我们自己能编辑;答:
.lib是库文件,rts.lib是TI提供的;我们也可以添加自己的库,可在newproject;三、CCS的操作;中国有句古话叫“磨刀不误砍柴工”,如果您将CCS;1、CCS的布局和结构;菜单栏——和CCS所有功能相关的菜单都在这里面;编译工具栏——编译程
答:
GEL是通用扩展语言(GeneralExtensionLanguage)是一种解释语言,类似于C语言。
GEL函数可以用来扩展CC的功能,方便用户调试程序。
CCS提供丰富的内嵌GEL函数,用户也可以定义自己的GEL函数。
在处理器属性的GEL文件窗内为每个处理器选择用户的GEL文件(扩展名为.gel)GEL文件用于初始化DSP。
GEL在CCS下有一个菜单,可以根据DSP的对象不同,可以用gel来调用一些菜单命令,对DSP的存储器进行配置,设置不同的初始化程序。
2.Lib文件内部究竟是什么内容,我们自己能编辑LIB文件吗
答:
.lib是库文件,rts.lib是TI提供的运行时支持库,如果是C代码写的源程序,必须要包含该库。
该库由TI公司做好了,放在CCS的\cgtools\lib中,源代码TI网站可以下载。
但是我们无法查看.编辑TI所提供的库文件内容
我们也可以添加自己的库,可在newproject中新建
三、CCS的操作
中国有句古话叫“磨刀不误砍柴工”,如果您将CCS这把常用的利刃磨锋利了,那么我相信为您的DSP开发过程节省不少的工夫。
1、CCS的布局和结构
菜单栏——和CCS所有功能相关的菜单都在这里面。
编译工具栏——编译程序时常用的一些工具。
调试工具栏——调试程序时常用的一些工具。
工程文件框——打开的工程所有文件会按类别放在这里
代码编辑区——代码都是在这里编辑完成的了,最主要的工作区域。
编译信息输出区——编译时产生的信息会在这个区域内输出
值得一提的是CC3.3和CCS2.2工具栏的区别,CCS2.2工具栏的图如下面所示,
我们将其和CCS3.3的工具栏比对之后发现CCS2.2中的探针工具已经不在CCS3.3的工具栏中了,这是因为CCS3.3中的断点就包含了探针功能。
2、开始调试程序
在编译完成之后,要来下载程序并进行功能调试。
“File”,”LoadProgram”,在工程文件夹下面的Debug文件夹下,选中**.out文件,点击打开,便开始下载程序了。
将**.out文件下载到目标板上2812的RAM中。
注意,这里是调试,所以将程序下载到RAM。
等到最后您要固化程序的时候,就得下载到FLASH了,因为断电之后,RAM里面所有的数据都会消失。
调试程序常用的一些按钮:
Run和Animate的区别,Run是如果遇到断点的话它就停下来了。
而Animate就算遇到断点时先停止DSP内核,刷新窗口,然后接着继续启动运行,常用来连续刷新变量窗口和生成graph图形等。
(1)如何添加断点
我们调试代码时有时候想看看某一行或者某几行代码是否有执行,或者想看看执行前后变量的一些变化,那么我们就需要在这行或者这几行代码前加上断点了。
加上断点的方法很简单,只要在该行代码前双击就行。
双击之后,这行代码前面会出现一个红色圆块。
另外一种添加断点的方法,就是在刚才的编译工具栏上,点一下那个小手图形的按钮,前提是你要把光标移动到想要设置断点的哪一行上。
这时运行Run按钮,程序就会在断点处停下,黄色的小箭头又出现了。
那如何取消断点呢,在刚刚设置断点的那行再双击一下,代表断点的红色标记就消失了,断点也就被取消了。
如果想要清除文件内的所有断点,那么我们可以按一下刚才小手按钮旁边的那个打了叉叉的小手按钮“Debug:
Removeallbreakpoints”。
(2)单步调试
让我们来了解一下CCS给我们提供的调试工具吧。
调试工具栏上分两类,一类是用于在源代码中调试的,另一类是用于在汇编代码中调试的。
---Source-singlestep源代码单步调试了,就是按一下,走一步的模式。
---Source-stepover这个按钮是指在单步执行时,如果在函数内遇到子函数,那么不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。
---Source-stepout当单步执行到子函数内时,用stepout就可以执行完子函数余下部分,并返回到上一层函数。
用于汇编调试的两个工具Assembly-singlestep和Assembly-stepover含义和上面源文件调试的两个类似,就不再重复叙述了。
(3)使用watchwindow
Watchwindow的作用是来观察程序运行过程中的各个变量的值。
调用watchwindow的方法是点击菜单栏的"View","watchwindow",这时watchwindow就会显示在CCS下方的信息区域,如下图所示:
如果想观察某个特定的变量,在代码中选中这个变量,然后右键"Addtowatchwindow"
(4)其他一些
我们在调试程序的时候经常想让程序从Main函数开始运行,点击"Debug"--"Gomain"。
既能看到源文件中代码的执行情况,又能看到汇编指令的执行情况----"View","MixedSource/Asm"
我们看到,每一行源代码下面就会有相应的汇编代码,黄色的指针指示源代码,绿色的指针指示汇编代码。
如果要取消源代码和汇编代码在一个文件内的话,重复刚才的操作就可以了。
3、统计代码运行时间
在CCS3.3中如何统计代码的运行时间,首先,将代码的阅览模式设置成前面的源码和汇编同时显示的模式。
点击"Profile"--"Clock"--"Enable",来使能CLOCK功能。
接下来点击"Profile"--"Clock"--"View",在CCS最下面会出现一个类似于秒表的工具,旁边显示数字“0”。
我们关注main函数这一块,在代码“int*in;这时,底下的CLOCK工具开始显示的是753,当;统计汇编指令的执行时间,点击一下Assembly;第三课课后:
如何使用CCS3.3来显示图表?
;CCS3.3的探针功能使用:
首先设置断点,点击b;选择"Action"下的&q;出现并设置以下窗口;同时我们还可看到;形的输出然后就是选择图形菜
我们关注main函数这一块,在代码“int*input=&inp_buffer[0];”前面设置断点,然后点击Run,这样程序就会停在这一行代码前面,而且黄色指针指示源码,绿色指针指向汇编。
这时,底下的CLOCK工具开始显示的是753,当然不同的环境显示的数字应该是不一样的。
这就是从开始执行到这一语句所花的时间了,那753的单位是“CPUCycles”,CPU的时钟周期。
统计汇编指令的执行时间,点击一下Assembly-singlestep。
汇编指令下移一行,CLOCK工具显示754,也就是刚才这句代码执行了1个CC。
统计执行一段代码所花的时间,在需要统计的那段代码开始和结束的地方分别设置断点,如下图所示。
第三课课后:
如何使用CCS3.3来显示图表?
CCS3.3的探针功能使用:
首先设置断点,点击breakpointmanager按钮(中间有个红色圆),出现窗口
选择"Action"下的"readfromFile"
出现并设置以下窗口
同时我们还可看到
形的输出然后就是选择图形菜单观察了
。
这个是用来控制数据输入的停止和开始,便于观测正弦图
设置输入输出地址等参数
点击"Animate"开始仿真,就能看到我们想要的图像了
关于Graph的一些:
SingleTime---单时域曲线---显示幅度-时间曲线
DualTime---双时域曲线---在显示两条信号的幅度-时间曲线
FFTMangnitude---FFT幅度---进行FFT变换,显示幅度-频率曲线
ComplexFFT---复数FFT---对复数的实部和虚部分别进行FFT变换,显示两条信号的幅度--频率曲线
FFTMangnitudeandPhase---FFT幅度和相位---在显示幅度-频率曲线和相位-频率曲线
FFTWaterfall---FFT多帧显示---对数据(实数)进行FFT变换,其幅度-频率曲线构成一帧。
这些帧按时间顺序构成FFT多帧显示图
Constellation---星座图---显示信号的相位分布
EyeDiagram---眼图---显示信号间的干扰情况
Image---图像显示---显示YUV或RGB图像
四、F2812的资源
首先解释下TI的DSP型号中各个字母所表示的含义
TMS320F2812是32位的定点DSP,它既具有数字信号的处理能力,又具有强大的事件管理能力和嵌入式控制功能,特别适合用于需要大批量数据处理的测控领域,例如自动化控制、电力电子技术、智能化仪表、电机伺服控制。
下面是F2812的内部资源框图。
2812采用了高性能的静态CMOS技术,时钟频率;1、F2812的片内资源;2812有3个32位的CPU定时器,支持动态的改;F2812的片内外设;1.2个事件管理器EVA、EVB;2.2个串行通信接口SCI,标准的UART(SC;3.1个串行外围接口SPI;4.改进的CAN通信ECAN;5.多通道缓冲串行接口McBSP;6.12位的ADC,一共有16个通道
2812采用了高性能的静态CMOS技术,时钟频率可达150MHZ(6.67ns),其核心电压为1.8V/1.9V,I/O口电压3.3V,Flash编程电压也为3.3V,所以我们在设计2812电源部分的时候,需要将常用的5V电压转换成1.8V和3.3V的电压之后,才能供给2812。
1、F2812的片内资源
2812有3个32位的CPU定时器,支持动态的改变锁相环的频率,有片内振荡器和看门狗定时器模块。
2812具有3个外部中断,但是2812具有外部中断的扩展模块(PIE),它可支持96个外部中断,不过当前仅仅使用了45个外部中断,其他为保留。
具有128位的密钥,用于保护FLASH、OTP和L0、L1中的内容不被盗读。
F2812的片内外设
1.2个事件管理器EVA、EVB
2.2个串行通信接口SCI,标准的UART(SCIASCIB)。
3.1个串行外围接口SPI。
4.改进的CAN通信ECAN。
5.多通道缓冲串行接口McBSP。
6.12位的ADC,一共有16个通道,实现AD转换的功能
7.最多有56个可独立编程的,多功能复用的GPIO引脚。
8.XINTF外部扩展接口--异步,非复用的总线结构--用于扩展并口外设
2、地址总线和数据总线
地址总线,这类总线的作用就是来传送存储单元的地址的。
1.PAB(ProgramAddressBus)程序地址总线,它是一个22位的总线,用于传送程序空间的读写地址。
程序运行的时候,假如执行到了某一个指令,那么需要去找到这段代码的地址,就是用PAB来传送。
2.DRAB(Data-ReadAddressBus)数据读地址总线,它是个32位的总线,用于传送数据空间的读地址。
假如要读取数据空间某一个单元的内容,那么这个单元的地址就是通过DRAB来传送。
3.DWAB(Data-WriteAddressBus)数据写地址总线,它也是个32位的总线,用于传送数据空间的写地址。
类似的,如果我要对数据空间的某一个单元进行写操作,那么这个单元的地址就是通过DWAB来传送。
数据总线,这类总线传送的就是数据了,也就是单元内的具体内容
1.PRDW(Program-ReadDataBus)程序读数据总线,它是一个32位的总线,用于传送读取程序空间时的指令或者数据。
我们在执行代码的时候,首先是通过PAB传送并找到了存放该指令的存储单元,但是这个存储单元下的具体内容就要由我们的PRDW来传送了。
2.DRDB(Data-ReadDataBus)数据读数据总线,它是一个32位的总线,在读取数据空间时用来传送数据。
我们在进行读操作时,先通过DRAB总线确定了需要进行读操作的数据单元的地址,接下来传送这个数据单元下面的具体内容时就需要DRDB了。
3.DWDB(Data/Program-WriteDataBus)数据写数据总线,它是一个32位的总线,在进行写操作时,向数据空间/程序空间传送相应的数据。
也就是假如我们要对数据空间的某一个单元进行写操作,我们通过DWAB传送了这一个单元的地址,同时我们需要DWDB来传送写入的内容。
3、内部的存储器资源
4、存储器映射
2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M的数据空间和4M的程序空间。
32位的数据地址,就是能访问2的32次,是4G,而22位的程序地址,就是能访问2的22次,是4M。
其实,2812可寻址的数据空间最大是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分配采用的是分页机制,分页机制采用的是形如0xXXXXXXX的线性地址,所以数据空间能寻址的只有4M。
2812的存储器被划分成了下面的几个部分:
1.程序空间和数据空间。
2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。
2.保留区。
数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。
3.CPU中断向量。
在程序空间里也保留了64个地址作为CPU的32个中断向量。
通过CPU寄存器ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。
5、映射和空间的统一编址
F2812内部的映射空间低地址空间
高地址空间
6、2812CMD详解;CMD:
command命令,顾名思义就是命令文件;1.)#pragma,CODE_SECTION和;#pragmaDATA_SECTION(func;将funcA数据块定位于用户自定义的段";2.)MEMORY和SECTIONS是命令文件中;以常用的F2812_nonBIOS_RAM.cm;CMD文件里有两个基本的段:
初始化段
6、2812CMD详解
CMD:
command命令,顾名思义就是命令文件指定存储区域的分配.2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。
1.)#pragma,CODE_SECTION和DATA_SECTION伪指令
#pragmaDATA_SECTION(funcA,"dataA");------函数外声明
将func
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 学习 笔记