DSP学习心得笔记Word文档下载推荐.docx

上传人:b****4 文档编号:8167294 上传时间:2023-05-10 格式:DOCX 页数:13 大小:136.07KB
下载 相关 举报
DSP学习心得笔记Word文档下载推荐.docx_第1页
第1页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第2页
第2页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第3页
第3页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第4页
第4页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第5页
第5页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第6页
第6页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第7页
第7页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第8页
第8页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第9页
第9页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第10页
第10页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第11页
第11页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第12页
第12页 / 共13页
DSP学习心得笔记Word文档下载推荐.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DSP学习心得笔记Word文档下载推荐.docx

《DSP学习心得笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP学习心得笔记Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。

DSP学习心得笔记Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2