DSP学习心得笔记Word文档下载推荐.docx
《DSP学习心得笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP学习心得笔记Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
warning:
creating.stacksectionwithdefaultsizeof400(hex)words.
Use
-stackoptiontochangethedefaultsize.
can'
tallocate.stack,size00000400(page1)inRAMM1(avail:
00000380)
errorsininput-./Debug/GPIO_Study.outnotbuilt
解决办法:
这个问题是关于堆栈存储大小的问题,他是说,创建堆栈段使用与设置400个字,并建议在“堆栈操作”中改变这个与设置。
这时,需要进行如下修改就可通过:
projectbuildoptionsLinkerbasic,在StackSize(-stack):
填入800或者其他小于1024的数值。
调试程序:
在编译完成之后,要来下载程序并进行功能调试。
FileLoadProgram,在工程文件夹下面的Debug文件夹下,选中**.out文件,点击打开,便开始下载程序了。
将**.out文件下载到目标板上2812的RAM中。
注意,这里是调试,所以将程序下载到RAM。
等到最后您要固化程序的时候,就得下载到FLASH了,因为断电之后,RAM里面所有的数据都会消失。
(Run和Animate的区别,Run是如果遇到断点的话它就停下来了。
而Animate就算遇到断点时先停止DSP内核,刷新窗口,然后接着继续启动运行,常用来连续刷新变量窗口和生成graph图形等)——知识储备。
添加断点:
加上断点的方法很简单,只要在该行代码前双击就行。
双击之后,这行代码前面会出现一个红色圆块。
另外一种添加断点的方法,就是在刚才的编译工具栏上,点一下那个小手图形的按钮,前提是你要把光标移动到想要设置断点的哪一行上。
使用watchwindow:
Watchwindow的作用是来观察程序运行过程中的各个变量的值。
调用watchwindow的方法是点击菜单栏的"
View"
"
watchwindow"
,这时watchwindow就会显示在CCS下方的信息区域;
选中所要观察的变量,然后右键,在右键菜单中选择addtowatchwindow。
调试代码观察:
我们在调试程序的时候经常想让程序从Main函数开使运行,点DebugGomain。
既能看到源文件中代码的执行情况,又能看到汇编指令的执行情况ViewMixedSource/Asm;
关于F2812中用C语言来实现中断的说明
1.首先在.cmd中定位系统中断表:
MEMORY
{
PAGE0:
......................................
PAGE1:
PIE_VECT:
origin=0x000D00,length=0x000100
......................................
}
SECTIONS
...................................
PieVectTable:
>
PIE_VECT,PAGE=1
.....................................
2.在C中制定该中断的结构体:
#pragmaDATA_SECTION(PieVectTable,"
PieVectTable"
);
structPIE_VECT_TABLEPieVectTable;
(在DSP28_GlobalVariableDefs.C中初始化)
3.用一组常数(按照中断向量的顺序)初始化该名字为PIE_VECT_TABLE的表:
typedefinterruptvoid(*PINT)(void);
这里有些一问,一下应该为函数名?
?
//DefineVectorTable:
structPIE_VECT_TABLE{
//Resetisneverfetchedfromthistable.
//Itwillalwaysbefetchedfrom0x3FFFC0ineither
//bootROMorXINTFZone7dependingonthestateof
//theXMP/MCinputsignal.OntheF2810itisalways
//fetchedfrombootROM.
PINTPIE1_RESERVED;
PINTPIE2_RESERVED;
PINTPIE3_RESERVED;
PINTPIE4_RESERVED;
PINTPIE5_RESERVED;
PINTPIE6_RESERVED;
PINTPIE7_RESERVED;
PINTPIE8_RESERVED;
PINTPIE9_RESERVED;
PINTPIE10_RESERVED;
PINTPIE11_RESERVED;
PINTPIE12_RESERVED;
PINTPIE13_RESERVED;
//Non-PeripheralInterrupts:
PINTXINT13;
//XINT13
PINTTINT2;
//CPU-Timer2
PINTDATALOG;
//Datalogginginterrupt
PINTRTOSINT;
//RTOSinterrupt
PINTEMUINT;
//Emulationinterrupt
PINTXNMI;
//Non-maskableinterrupt
PINTILLEGAL;
//IllegaloperationTRAP
PINTUSER0;
//UserDefinedtrap0
PINTUSER1;
//UserDefinedtrap1
PINTUSER2;
//UserDefinedtrap2
PINTUSER3;
//UserDefinedtrap3
PINTUSER4;
//UserDefinedtrap4
PINTUSER5;
//UserDefinedtrap5
PINTUSER6;
//UserDefinedtrap6
PINTUSER7;
//UserDefinedtrap7
PINTUSER8;
//UserDefinedtrap8
PINTUSER9;
//UserDefinedtrap9
PINTUSER10;
//UserDefinedtrap10
PINTUSER11;
//UserDefinedtrap11
//Group1PIEPeripheralVectors:
PINTPDPINTA;
//EV-A
PINTPDPINTB;
//EV-B
PINTrsvd1_3;
PINTXINT1;
PINTXINT2;
PINTADCINT;
//ADC
PINTTINT0;
//Timer0
PINTWAKEINT;
//WD
.............
//Group12PIEPeripheralVectors:
PINTrsvd12_1;
PINTrsvd12_2;
PINTrsvd12_3;
PINTrsvd12_4;
PINTrsvd12_5;
PINTrsvd12_6;
PINTrsvd12_7;
PINTrsvd12_8;
};
然后在使我们在.cmd文件中定义的表有以上属性:
externstructPIE_VECT_TABLEPieVectTable;
(在.h文件中)
4.初始化该表(在.c文件中)使之能够为主程序所使用:
conststructPIE_VECT_TABLEPieVectTableInit={
PIE_RESERVED,//Reservedspace
PIE_RESERVED,
//Non-PeripheralInterrupts
INT13_ISR,//XINT13orCPU-Timer1
INT14_ISR,//CPU-Timer2
DATALOG_ISR,//Datalogginginterrupt
RTOSINT_ISR,//RTOSinterrupt
EMUINT_ISR,//Emulationinterrupt
NMI_ISR,//Non-maskableinterrupt
ILLEGAL_ISR,//IllegaloperationTRAP
USER0_ISR,//UserDefinedtrap0
USER1_ISR,//UserDefinedtrap1
USER2_ISR,//UserDefinedtrap2
USER3_ISR,//UserDefinedtrap3
USER4_ISR,//UserDefinedtrap4
USER5_ISR,//UserDefinedtrap5
USER6_ISR,//UserDefinedtrap6
USER7_ISR,//UserDefinedtrap7
USER8_ISR,//UserDefinedtrap8
USER9_ISR,//UserDefinedtrap9
USER10_ISR,//UserDefinedtrap10
USER11_ISR,//UserDefinedtrap11
//Group1PIEVectors
PDPINTA_ISR,//EV-A
PDPINTB_ISR,//EV-B
rsvd_ISR,
XINT1_ISR,
XINT2_ISR,
ADCINT_ISR,//ADC
TINT0_ISR,//Timer0
WAKEINT_ISR,//WD
//Group12EVectors
rsvd_ISR,
//---------------------------------------------------------------------------
//InitPieVectTable:
//ThisfunctioninitializesthePIEvectortabletoaknownstate.
//Thisfunctionmustbeexecutedafterboottime.
//
voidInitPieVectTable(void)
int16i;
Uint32*Source=(void*)&
PieVectTableInit;
Uint32*Dest=(void*)&
PieVectTable;
EALLOW;
for(i=0;
i<
128;
i++)
*Dest++=*Source++;
EDIS;
//EnablethePIEVectorTable
PieCtrl.PIECRTL.bit.ENPIE=1;
5.中断服务程序:
让以上的数值指向你所要的服务程序,例如:
PieVectTable.TINT2=&
ISRTimer2;
那么,ISRTimer2也就成了中断服务程序,
×
切记:
一定要在主程序的开始先声明该程序:
interruptvoidISRTimer2(void);
然后按照您的需要编制该程序:
interruptvoidISRTimer2(void)
CpuTimer2.InterruptCount++;
编程中遇到的问题:
1、line257:
lastlineoffileendswithoutanewline;
点击出现的问题条,看光标定位在哪里,然后一点点删除,直到把编程的文字删除,最后把删除的写出来,回车就行了,因为回车的格式要在编辑状态哈哈!
28016的定时器笔记
学过2812的人会知道,2812的定时器和28016的定时器的寄存器很不一样。
但是从功能上将差不多。
关于28016定时器的时钟的讨论;
定时器的时钟是由SYSCLKOUT经过TBCTL中的CLKDIV和HSPCLKDIV进行配置;
和
主要说明,我们应该记得SYSCLKOUT和HSPCLK之间还可以分频,但是在这里这个寄存器不影响。
关于28016定时器的时钟同步的讨论;
如果我们想使每个PWM模块具有同步时钟,我们可以通过软件强制各个模块之间同步,设定步骤如下:
EPwm1Regs.TBCTL.bit.SYNCOSEL=0//Passthrough
EPwm2Regs.TBCTL.bit.SYNCOSEL=0;
//Passthrough
EPwm3Regs.TBCTL.bit.SYNCOSEL=0;
EPwm1Regs.TBCTL.bit.SWFSYNC=1;
EPwm2Regs.TBCTL.bit.SWFSYNC=1;
EPwm3Regs.TBCTL.bit.SWFSYNC=1;
以上程序是设定PWM1/2/3同步,我们由于我们只采用向上计数,所以不需要设定计数方向位。
接下来如果我们想PWM1与PWM2输出相位不一样,保持某个相位差,我们可以通过寄存器设定;
EPwm1Regs.TBCTL.bit.PHSEN=TB_ENABLE;
EPwm2Regs.TBCTL.bit.PHSEN=TB_ENABLE;
EPwm3Regs.TBCTL.bit.PHSEN=TB_ENABLE;
EPwm1Regs.TBPHS.half.TBPHS=0;
EPwm2Regs.TBPHS.half.TBPHS=250;
EPwm3Regs.TBPHS.half.TBPHS=500;
首先使能,然后赋予值;
关于一些其他的配置如下:
EPwm3Regs.TBPRD=PWM3_TIMER_TBPRD;
EPwm3Regs.TBCTL.bit.CTRMODE=TB_COUNT_UP;
//Countup
EPwm3Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
//EnableINTonZeroevent
EPwm3Regs.ETSEL.bit.INTEN=PWM3_INT_ENABLE;
//EnableINT
EPwm3Regs.ETPS.bit.INTPRD=ET_1ST;
//GenerateINTon3rdevent
关于28016PWM配置的讨论
PWM1的A/B的独立配置;
除了counter-compare比较寄存器,CMPA,CMPB,主要还是配置控制寄存器CMPCTL,对于影子寄存器的配置,还有影子寄存器的装载模式。
这里主要讲关于PWM中actionqualifier的配置;
模式1:
//SetupshadowregisterloadonZERO
EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
//SetComparevalues
EPwm1Regs.CMPA.half.CMPA=EPWM1_MIN_CMPA;
//SetcompareAvalue
EPwm1Regs.CMPB=500;
//SetCompareBvalue
//Setactions
EPwm1Regs.AQCTLA.bit.ZRO=AQ_CLEAR;
//SetPWM1AonZero
EPwm1Regs.AQCTLA.bit.CAU=AQ_SET;
//ClearPWM1AoneventA,upcoun
EPwm1Regs.AQCTLB.bit.ZRO=AQ_SET;
//SetPWM1BonZero
EPwm1Regs.AQCTLB.bit.CBU=AQ_CLEAR;
//ClearPWM1BoneventB,upcount
//InterruptwherewewillchangetheCompareValues
EPwm1Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
//SelectINTonZeroevent
EPwm1Regs.ETSEL.bit.INTEN=1;
EPwm1Regs.ETPS.bit.INTPRD=ET_3RD;
//GenerateINTon3rdevent
其中红色的为PWM的输出方式配置,当PWM1.A在counter==0时,输出为0,在counter==CMPA时,且在向上计数,输出为1;
而PWM1.B相反。
模式二:
EPwm2Regs.AQCTLA.bit.PRD=AQ_CLEAR;
//ClearPWM2AonPeriod
EPwm2Regs.AQCTLA.bit.CAU=AQ_SET;
//SetPWM2AoneventA,upcount
EPwm2Regs.AQCTLB.bit.PRD=AQ_CLEAR;
//ClearPWM2BonPeriod
EPwm2Regs.AQCTLB.bit.CBU=AQ_SET;
//SetPWM2BoneventB,upcount
其中红色的为PWM的输出方式配置,当PWM1.A在counter==period时,输出为0,在counter==CMPA时,且在向上计数,输出为1;
而PWM1.B相同;
模式三:
//SetActions
EPwm3Regs.AQCTLA.bit.CAU=AQ_SET;
//SetPWM3AoneventB,upcount
EPwm3Regs.AQCTLA.bit.CBU=AQ_CLEAR;
//ClearPWM3AoneventB,upcount
其中红色的为PWM的输出方式配置,当PWM1.A在counter==CMPA时,输出为1,在counter==CMPB时,且在向上计数,输出为0,也就是计数在CMPA与CMPB之间时输出为1;
模式四:
EPwm3Regs.AQCTLB.bit.ZRO=AQ_TOGGLE;
//ToggleEPWM3BonZero
此模式强制整个周期输出高或者输出地,与CMPA与CMPB无关,
关于28016PWM死区时间配置的讨论
主要与死区有关的是三个寄存器:
Dead-BandGeneratorControlRegister(DBCTL);
Dead-BandGeneratorRisingEdgeDel