人人范文网 范文大全

DSP学习心得笔记

发布时间:2020-03-03 12:08:48 来源:范文大全 收藏本文 下载本文 手机版

DSP学习心得笔记

---------------- 白建成.baijc.icekoor 建立新工程过程中: 问题1:

\"GPIO_Study.c\", line 61: fatal error: could not open source file \"DSP280x_Device.h\" 1 fatal error detected in the compilation of \"GPIO_Study.c\".解决方法:

因为project build optionscompilerpreproceor中,要包含的头文件的地址没有加进去,你可以找到头文件的地址,然后加进去。

问题2:

undefined

first referenced symbol

in file ---------

---------------- _c_int00

D:\\DSP study\\test3\\Debug\\DSP280x_CodeStartBranch.obj FS$$MPY

D:\\DSP study\\test3\\Debug\\DSP280x_CpuTimers.obj FS$$TOL

D:\\DSP study\\test3\\Debug\\DSP280x_CpuTimers.obj >>

error: symbol referencing errors\'./Debug/GPIO_Study.out\' not built 解决办法都是下面:

这个问题是因为没有加在库文件,请在project build optionslinkerlibraries中加入rts2800.lib。

问题3:

>> warning: creating .stack section with default size of 400 (hex) words.

Use

-stack option to change the default size.>>

error: can\'t allocate .stack, size 00000400 (page 1) in RAMM1 (avail:

00000380) >>

error: errors in input - ./Debug/GPIO_Study.out not built 解决办法: 这个问题是关于堆栈存储大小的问题,他是说,创建堆栈段使用与设置400个字,并建议在“堆栈操作”中改变这个与设置。这时,需要进行如下修改就可通过:project build optionsLinkerbasic,在Stack Size(-stack):填入800或者其他小于1024的数值。

调试程序:

在编译完成之后,要来下载程序并进行功能调试。FileLoad Program,在工程文件夹下面的Debug文件夹下,选中**.out文件,点击打开,便开始下载程序了。将**.out文件下载到目标板上2812的RAM中。

注意,这里是调试,所以将程序下载到RAM。等到最后您要固化程序的时候,就得下载到FLASH了,因为断电之后,RAM里面所有的数据都会消失。

(Run和Animate的区别,Run是如果遇到断点的话它就停下来了。而Animate就算遇到断点时先停止DSP内核,刷新窗口,然后接着继续启动运行,常用来连续刷新变量窗口和生成graph图形等)——知识储备。

添加断点:

加上断点的方法很简单,只要在该行代码前双击就行。双击之后,这行代码前面会出现一个红色圆块。另外一种添加断点的方法,就是在刚才的编译工具栏上,点一下那个小手图形的按钮,前提是你要把光标移动到想要设置断点的哪一行上。

使用watch window:

Watch window的作用是来观察程序运行过程中的各个变量的值。调用watch window的方法是点击菜单栏的\"View \",\"watch window\",这时watch window就会显示在CCS下方的信息区域;

选中所要观察的变量,然后右键,在右键菜单中选择add to watch window。

调试代码观察:

我们在调试程序的时候经常想让程序从Main函数开使运行,点DebugGo main。 既能看到源文件中代码的执行情况,又能看到汇编指令的执行情况ViewMixed Source/Asm;

关于F2812中用C语言来实现中断的说明

1.首先在.cmd中定位系统中断表: MEMORY { PAGE 0 :

......................................PAGE 1 :

......................................

PIE_VECT

: origin = 0x000D00, length = 0x000100 ......................................

} SECTIONS { ...................................

PieVectTable

: > PIE_VECT,

PAGE = 1 .....................................} 2.在C中制定该中断的结构体:

#pragma DATA_SECTION(PieVectTable,\"PieVectTable\"); struct PIE_VECT_TABLE PieVectTable;(在DSP28_GlobalVariableDefs.C中初始化) 3.用一组常数(按照中断向量的顺序)初始化该名字为PIE_VECT_TABLE的表: typedef interrupt void(*PINT)(void);这里有些一问,一下应该为函数名??

// Define Vector Table: struct PIE_VECT_TABLE {

// Reset is never fetched from this table.

// It will always be fetched from 0x3FFFC0 in either // boot ROM or XINTF Zone 7 depending on the state of // the XMP/MC input signal. On the F2810 it is always // fetched from boot ROM.

PINT

PIE1_RESERVED;

PINT

PIE2_RESERVED;

PINT

PIE3_RESERVED;

PINT

PIE4_RESERVED;

PINT

PIE5_RESERVED;

PINT

PIE6_RESERVED;

PINT

PIE7_RESERVED;

PINT

PIE8_RESERVED;

PINT

PIE9_RESERVED;

PINT

PIE10_RESERVED;

PINT

PIE11_RESERVED;

PINT

PIE12_RESERVED;

PINT

PIE13_RESERVED;

// Non-Peripheral Interrupts:

PINT

XINT13;

// XINT13

PINT

TINT2;

// CPU-Timer2

PINT

DATALOG;

// Datalogging interrupt

PINT

RTOSINT;

// RTOS interrupt

PINT

EMUINT;

// Emulation interrupt

PINT

XNMI;

// Non-maskable interrupt

PINT

ILLEGAL;

// Illegal operation TRAP

PINT

USER0;

// User Defined trap 0

PINT

USER1;

// User Defined trap 1

PINT

USER2;

// User Defined trap 2

PINT

USER3;

// User Defined trap 3

PINT

USER4;

// User Defined trap 4

PINT

USER5;

// User Defined trap 5

PINT

USER6;

// User Defined trap 6

PINT

USER7;

// User Defined trap 7

PINT

USER8;

// User Defined trap 8

PINT

USER9;

// User Defined trap 9

PINT

USER10;

// User Defined trap 10

PINT

USER11;

// User Defined trap 11

// Group 1 PIE Peripheral Vectors:

PINT

PDPINTA;

// EV-A

PINT

PDPINTB;

// EV-B

PINT

rsvd1_3;

PINT

XINT1;

PINT

XINT2;

PINT

ADCINT;

// ADC

PINT

TINT0;

// Timer 0

PINT

WAKEINT;

// WD

..........................// Group 12 PIE Peripheral Vectors:

PINT

rsvd12_1;

PINT

rsvd12_2;

PINT

rsvd12_3;

PINT

rsvd12_4;

PINT

rsvd12_5;

PINT

rsvd12_6;

PINT

rsvd12_7;

PINT

rsvd12_8; }; 然后在使我们在.cmd文件中定义的表有以上属性: extern struct PIE_VECT_TABLE PieVectTable;(在.h文件中) 4.初始化该表(在.c文件中)使之能够为主程序所使用: const struct PIE_VECT_TABLE PieVectTableInit = {

PIE_RESERVED, // Reserved space

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

PIE_RESERVED,

// Non-Peripheral Interrupts

INT13_ISR,

// XINT13 or CPU-Timer 1

INT14_ISR,

// CPU-Timer2

DATALOG_ISR,

// Datalogging interrupt

RTOSINT_ISR,

// RTOS interrupt

EMUINT_ISR,

// Emulation interrupt

NMI_ISR,

// Non-maskable interrupt

ILLEGAL_ISR,

// Illegal operation TRAP

USER0_ISR,

// User Defined trap 0

USER1_ISR,

// User Defined trap 1

USER2_ISR,

// User Defined trap 2

USER3_ISR,

// User Defined trap 3

USER4_ISR,

// User Defined trap 4

USER5_ISR,

// User Defined trap 5

USER6_ISR,

// User Defined trap 6

USER7_ISR,

// User Defined trap 7

USER8_ISR,

// User Defined trap 8

USER9_ISR,

// User Defined trap 9

USER10_ISR,

// User Defined trap 10

USER11_ISR,

// User Defined trap 11

// Group 1 PIE Vectors

PDPINTA_ISR,

// EV-A

PDPINTB_ISR,

// EV-B

rsvd_ISR,

XINT1_ISR,

XINT2_ISR,

ADCINT_ISR,

// ADC

TINT0_ISR,

// Timer 0

WAKEINT_ISR,

// WD ..........................// Group 12 E Vectors

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

rsvd_ISR,

}; //------------- // InitPieVectTable:

//------------- // This function initializes the PIE vector table to a known state.// This function must be executed after boot time.//

void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *) &PieVectTableInit; Uint32 *Dest = (void *) &PieVectTable;

EALLOW;

for(i=0; i

// Enable the PIE Vector Table PieCtrl.PIECRTL.bit.ENPIE = 1;

} 5.中断服务程序:

让以上的数值指向你所要的服务程序,例如: PieVectTable.TINT2 = &ISRTimer2; 那么,ISRTimer2也就成了中断服务程序,

×××切记:一定要在主程序的开始先声明该程序: interrupt void ISRTimer2(void);

..........................然后按照您的需要编制该程序: interrupt void ISRTimer2(void) { CpuTimer2.InterruptCount++; }

编程中遇到的问题:

1、line 257: warning: last line of file ends without a newline; 解决方法:

点击出现的问题条,看光标定位在哪里,然后一点点删除,直到把编程的文字删除,最后把删除的写出来,回车就行了,因为回车的格式要在编辑状态哈哈!

28016的定时器笔记

学过2812的人会知道,2812的定时器和28016的定时器的寄存器很不一样。但是从功能上将差不多。

关于28016定时器的时钟的讨论;

定时器的时钟是由SYSCLKOUT经过TBCTL中的CLKDIV和HSPCLKDIV进行配置;

主要说明,我们应该记得SYSCLKOUT和HSPCLK之间还可以分频,但是在这里这个寄存器不影响。

关于28016定时器的时钟同步的讨论;

如果我们想使每个PWM模块具有同步时钟,我们可以通过软件强制各个模块之间同步,设定步骤如下:

EPwm1Regs.TBCTL.bit.SYNCOSEL = 0 // Pa through

EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; // Pa through

EPwm3Regs.TBCTL.bit.SYNCOSEL = 0; // Pa through

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;

// Count up

EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;

// Enable INT on Zero event

EPwm3Regs.ETSEL.bit.INTEN = PWM3_INT_ENABLE;

// Enable INT

EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;

// Generate INT on 3rd event

关于28016PWM配置的讨论

PWM1的A/B的独立配置;

除了counter-compare比较寄存器,CMPA,CMPB,主要还是配置控制寄存器CMPCTL,对于影子寄存器的配置,还有影子寄存器的装载模式。 这里主要讲关于PWM中action qualifier的配置; 模式1:

// Setup shadow register load on ZERO

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;

// Set Compare values

EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA;

// Set compare A value

EPwm1Regs.CMPB = 500;

// Set Compare B value

// Set actions

EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;

// Set PWM1A on Zero

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;

// Clear PWM1A on event A, up coun

EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;

// Set PWM1B on Zero

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

// Clear PWM1B on event B, up count

// Interrupt where we will change the Compare Values

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;

// Select INT on Zero event

EPwm1Regs.ETSEL.bit.INTEN = 1;

// Enable INT

EPwm1Regs.ETPS.bit.INTPRD = ET_3RD;

// Generate INT on 3rd event

其中红色的为PWM的输出方式配置,当PWM1.A在counter==0时,输出为0,在counter==CMPA时,且在向上计数,输出为1;而PWM1.B相反。

模式二:

// Set actions

EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;

// Clear PWM2A on Period

EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;

// Set PWM2A on event A, up count

EPwm2Regs.AQCTLB.bit.PRD = AQ_CLEAR;

// Clear PWM2B on Period

EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;

// Set PWM2B on event B, up count 其中红色的为PWM的输出方式配置,当PWM1.A在counter==period时,输出为0,在counter==CMPA时,且在向上计数,输出为1;而PWM1.B相同; 模式三:

// Set Actions

EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;

// Set PWM3A on event B, up count

EPwm3Regs.AQCTLA.bit.CBU = AQ_CLEAR;

// Clear PWM3A on event B, up count 其中红色的为PWM的输出方式配置,当PWM1.A在counter==CMPA时,输出为1,在counter==CMPB时,且在向上计数,输出为0,也就是计数在CMPA与CMPB之间时输出为1;

模式四:

EPwm3Regs.AQCTLB.bit.ZRO = AQ_TOGGLE;

// Toggle EPWM3B on Zero 此模式强制整个周期输出高或者输出地,与CMPA与CMPB无关,

关于28016PWM死区时间配置的讨论

主要与死区有关的是三个寄存器:

Dead-Band Generator Control Register (DBCTL);

Dead-Band Generator Rising Edge Delay Register (DBRED);

Dead-Band Generator Rising Edge Delay Register (DBRED) Field Descriptions; 首先清楚延时时间的计算 为:DBRED*TBCLK; 然后弄懂DBCTL就可以了。

注意理解下图:

弄懂3个控制位什么意思;

OUT_MODE,POLSEL,IN_MODE 注意第二位,这位通常用在输入为同一个通道时,也就是IN_MODE=0X00/0X03时。 简单看一些deadband的配置:

EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; 输出之前,输入上升沿下降沿都被延时;

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HI; 没有取反过程;

EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; 输入全部为A,此为习惯性的配置; EPwm1Regs.DBRED = 1000; EPwm1Regs.DBFED = 500;

一周解决的为题:

我的sin()函数能够正常执行,cos()函数也能正常执行,但是当sin()计算完再计算cos(),仿真环境就会进入逻辑错误中断,请问怎么解决,是不是该重装CCS。

原因:之前一直把程序烧到RAM里,总是只能执行一个sin()和cos()函数,然后RAM的空间就不够了,由于也不会改RAM空间的大小,所以就把程序直接下到flash里面,结果就好了。

遇到CCS和仿真器连不上的问题; Error connecting to the target: Error 0x80000240/134 Fatal Error during: Initialization, OCS Unknown Error Sequence ID: 0 Error Code: 134 Error Cla: 0x80000240 I/O Port = 240 解决办法:

我也试着解决这个问题,重装了一次,结果没有用。想着觉得是USB驱动的问题,然后就在设备管理器中,把USB的驱动删除了,有重新装了一遍,结果没问题了。原因应该是以前用的USB口安装的驱动,又被用于安装其他的驱动,结果以前的USB驱动不能用了。

DSP学习心得笔记

DSP学习心得笔记(更新0717)

dsp学习心得

DSP学习心得

Dsp学习笔记

DSP实验学习心得

DSP实验学习心得

STM32学习心得笔记

专题讲座学习心得笔记

专题讲座学习心得笔记

DSP学习心得笔记
《DSP学习心得笔记.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档