Dsp学习笔记

时间:2019-05-12 02:48:01下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《Dsp学习笔记》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《Dsp学习笔记》。

第一篇:Dsp学习笔记

GPIO作为通用I/O口使用

a)EALLOW;//防止私自写或覆盖寄存器的内容,加了这句,接下来可以操作寄存器了 b)GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;// GPIO0复用为普通I/O功能 c)GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;// 1,设置为输出;0设置为输入 d)EDIS;//加了这句,接下来不可以操作寄存器

注:EALLOW,EDIS总是成对出现中断过程(代码以配置SCIB模块的接收中断为例,LSPCLK是37.5MHz)

中断共分三级,1,外设级;2,PIE级;3,CPU级;外设级的中断标志必须手动清零;PIE级和CPU级的中断标志位由硬件自动清零。中断响应例程:

第一步,配置中断源,即允许产生什么类型点中断。例如,定时器中断,串口中断,外部中断等。ScibRegs.SCICTL2.bit.RXBKINTENA =1;允许接收中断

第二步,配置PIE(外部中断扩展)

a)InitPieCtrl();//初始化Pie控制

b)InitPieVectTable();//初始化Pie向量表控制

c)EALLOW;

d)PieVectTable.SCIRXINTB=&scibreceive;//指定中断服务程序地址e)EDIS;

f)PieCtrlRegs.PIECTRL.bit.ENPIE=1;//使能从PIECTRL中读取中断向量 g)PieCtrlRegs.PIEIER9.bit.INTx3=1;//使能SCIB的接收中断

h)IER |= M_INT9;//允许外部中断

i)EINT;

j)ERTM;

第三步,中断响应

在中断服务程序里,必须用PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;//清楚中断已响应标识,再写自己等程序代码串口配置

InitScibGpio();scib_echoback_init();AD转换

InitAdc();//允许ADC时钟,带隙和参考电路上电,核中模拟电路上电

AdcRegs.ADCTRL2.all = 0x2000;//ADC模块开始转换

程序在FLASH运行时,需要加如下两句代码:(不知道具体原因)

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);InitFlash();

第二篇:DSP学习心得笔记

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preprocessor中,要包含的头文件的地址没有加进去,你可以找到头文件的地址,然后加进去。

问题2:

undefined

first referenced symbol

in file---------

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

D:DSP studytest3DebugDSP280x_CodeStartBranch.obj FS$$MPY

D:DSP studytest3DebugDSP280x_CpuTimers.obj FS$$TOL

D:DSP studytest3DebugDSP280x_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 < 128;i++)*Dest++ = *Source++;EDIS;

// 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 // Pass through

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

EPwm3Regs.TBCTL.bit.SYNCOSEL = 0;// Pass 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 Class: 0x80000240 I/O Port = 240 解决办法:

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

第三篇:DSP学习心得笔记

DSP学习心得笔记

----------------白建成.baijc.icekoor 引言:学习DSP的时间有两个多月了,收获很多新知识,我们要每天都有进步才行,以下内容没有特别的顺序,跟具自己的学习情况写的,如果有不对的地方希望指出来,如果有不懂得也可以问我,大家相互交流很重要,我的一个邮箱:baijc@163.com欢迎联系!

建立新工程过程中: 问题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preprocessor中,要包含的头文件的地址没有加进去,你可以找到头文件的地址,然后加进去。

问题2:

undefined

first referenced symbol

in file---------

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

D:DSP studytest3DebugDSP280x_CodeStartBranch.obj FS$$MPY

D:DSP studytest3DebugDSP280x_CpuTimers.obj FS$$TOL

D:DSP studytest3DebugDSP280x_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 < 128;i++)*Dest++ = *Source++;EDIS;

// 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 // Pass through

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

EPwm3Regs.TBCTL.bit.SYNCOSEL = 0;// Pass 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 Class: 0x80000240 I/O Port = 240 解决办法:

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

2011.1.19 我在用dsp中的cos()与sin()函数时,对他们的结果做验证,发现他们有的计算出来的结果,和我用计算器计算出来的结果不一样,还差不少。解决办法:

首先坚信CCS的函数计算不会轻易的出错,然后我就去查程序的问题,查不好长时间觉得没问题,就继续看程序运行的结果,结果发现有些计算正确,有些不正确,就在想执行过程中难道有随机性,结果突然想到中断的问题,我是在中断中作了个旋转矢量,通过中断来使它旋转,而直接把中断中的值,拿来在每个sin,cos中用,所以才出问题的。结果改动了一点就行了,将中断中的值,在用的地方,重新付给另一个变量,这样就能解决了。因为sin,cos执行需要时间较长,而普通的赋值却不是。Flash API Error #65535: The device is in limp mode, operation failed。以前一直没有问题,不知道怎么突然就这样了。解决办法:

烧写的插件(网上这么叫)没有装好的原因,我觉得就是仿真器第一次没连接好,拔掉再连接几次就行了。

2011.1.20 fatal error: file “D:DSP studyADC_StudyDebugADC_Study.obj” has a

Tag_Memory_Model attribute value of “2” that is different than one

previously seen(“1”);combining incompatible files 解决办法:

问题的出现可能是你lib下的库有所改变引起的,project->built options->linker->libraries->rts2800_ml.lib,因为之前一直用它,后来改成rts2800.lib就出现这个问题了,改回去就可以了。

data verification failed at address 0x8000 Please verify target memory and memory map 解决方法:

可能是gel的问题,重新载入几次,如果不行的话,就把仿真器重新接几次,问题就应该没有了,多数是硬件的问题。

针对CCS的图像显示,一个方式为对程序中的某些变量画图,另一种方式是对DSP采集的数据画图,两者在方法上有所不同。

首先声明画图很简单,只要把重要的记住就可以了,其他的尝试怎么用就OK了,不用刻意去学,浪费时间;

至于这张图中各个栏代表什么,你随便找个资料就给你 说得很清楚,但是没有一份资料教你怎么用的,这就是 网上资料的弊端。

你只要把右图画绿线的看懂就总够了,其他的试着改变参 数,看看结果你就明白了。

接下来给你看看我的配置:

Dual time 和single time的区别在于显示几个波形 Svpwm_Time1和 Svpwm_Time0 是我程序内部的 两个变量,也就是SVPWM的t1,t0,记得前面加 &,不然结果不对,Acquisition Buffer Size设为1,因为我想通过终端来调试,每次终端,然后刷新 一次数据,这样很方便,找点资料看,这里不详 细说明了,还有采样时间,根据你的要求来定。波形如下:

是不是很matlab中一样哈!

另一种方式,不能采用中断了,因为中断时间太长,影响采样速度。

建议:在程序中建一个大的数组,然后运行一段时间,再将数组显示在CCS中,Acquisition Buffer Size 此时不能为1了,要和你的数组一样长,Display Data Size等于Acquisition Buffer Size就可以,显示出来就可以了。

如下图:这是我AD采样的波形,采集一个正弦波形,采用两个通道。

2011.01.24 error: symbol “_main” redefined: first defined in “D:DSP

studyDSP_PerfectDsp_Perfect_110121WPerfectDebugPerfect.obj”;

redefined in “D:DSP

studyDSP_PerfectDsp_Perfect_110121WPerfectDebugSCI_485.obj” 解决办法:

这个问题是系统编译以后,在perfect.c和SCI_485.c中分别有main();结果编译会报错。

2011.01.22 “D:DSP studyDSP_PerfectDsp_Perfect_110121WcmdF28016.cmd”, line 125: error:

run placement fails for object “.ebss”, size 0x3ba(page 1).Available

ranges:

RAMM1

size: 0x380

unused: 0x380

max hole: 0x380

error: errors encountered during linking;“./Debug/Perfect.out” not built 解决办法:

双击错误提示,进入错误的地方,原因是我们申明的变量数,超过了RAMM1的声明的大小,所以找过RAMM1,然后把size扩大就可以了,RAMM1

: origin = 0x000480, length = 0x000400

/* on-chip RAM block M1 */,注意但是不能超过1024,也就是说最大是0x000400。同时也把project build optionsLinkerbasic,在Stack Size(-stack):填入800或者其他小于1024的数值。以免以后有出些不明的问题。

第四篇:DSP学习心得笔记(更新20140717)

DSP学习心得笔记

----------------白建成.baijc.icekoor 引言:学习DSP的时间有两个多月了,收获很多新知识,我们要每天都有进步才行,以下内容没有特别的顺序,跟具自己的学习情况写的,如果有不对的地方希望指出来,如果有不懂得也可以问我,大家相互交流很重要,我的一个邮箱:baijc@163.com欢迎联系!

建立新工程过程中: 问题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preprocessor中,要包含的头文件的地址没有加进去,你可以找到头文件的地址,然后加进去。

问题2:

undefined

first referenced symbol

in file---------

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

D:DSP studytest3DebugDSP280x_CodeStartBranch.obj FS$$MPY

D:DSP studytest3DebugDSP280x_CpuTimers.obj FS$$TOL

D:DSP studytest3DebugDSP280x_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 inputCobing LiuCSDN.pdf》

第五篇:DSP学习总结

DSP学习总结

根据一学期以来对DSP这门课程的学习,学到了很多DSP相关的知识。了解了如何根据实际需求选择DSP芯片,也知道了C54x的汇编和链接过程,还掌握了C54x的寻址方式。对于老师的授课方法也有一定的见解。

开始学DSP的时候比较着急,因为也感觉什么都不会,不知道从哪里下手。手上的资料只有书,后来去图书馆看了两本,一本是《DSP原理与开发》,除了有详细的理论说明之外,还会在每个章节之后配上一个例程,缺点就是错误也不少,估计时间太仓促,校对没做好。另一本书是清华大学出版社的《TMS320C28X系列DSP的CPU与外设》,是从TI的英文的技术手册翻译过来的,分上、下两册,可以作为工具书,很实用,缺点是没有例子。书看了一两遍,觉得还是一头雾水。后来有相应的实验开课,慢慢对DSP有点了解了,刚开始都不知道怎么建PROJECT,后来问了同学,然后再看TI的例程,仿照它的程序框架,边看例程,边对着实验指导书,看得主要是如何初始化,需要对每个外设进行哪些寄存器的初始化,寄存器为什么这样设置,程序如何进中断,如何出中断等等。边看书边做实验,效率会高很多,也就能慢慢理解了。

对于刚学DSP的新手我觉得掌握一些初级知识就差不多了。

第一步:硬件入门。1.先学习DSP的硬件基础:了解CPU结构、中断、EMIF、HPI、GPIO、SPI、Timer、供电方式、时钟;2.了解DSP互连的存储器:SDRAM、FLASH、FIFO、双口RAM、SDSRAM等不需深入研究;3.了解CPLD/FPGA的硬件结构、连接原理、VerilogHDL编程语言需深入研究;4.了解DSP Bootloader不需深入研究;5.了解DSP和外部通信的接口:PCI、USB、LAN、UART等,有时间可以看看DM642的VideoPort

第二步:工具入门。1.学习数字电路、模拟电路、电路分析的知识;2.学好一种PCB绘制软件如Protel DXP2006;3.学习信号完整性、学习传输线理论,特性阻抗知识;

关于老师上课的方式我认为:1.太多的理论知识枯燥乏味,因为有实验课,我觉得老师可以根据实验要做的内容在课堂上深入讲解,这样在讲述的同时能让同学们认真听,认真记以便于实验课程的顺利完成,比纯理论效果会好点。2.课上应该多讲解一些例子,由浅而深,我觉得上课关键是调动同学的积极性,能吸引学生的很多是夹杂着现实生活中的事,中国的DSP才刚刚起步,发展正方兴未艾,严格意义上符合DSP两大核心特征的公司,更是非常之少,整个国内网络展示广告领域对于DSP的理解都远远没有达到普及的程度,有很大的发展潜力,让同学们意识到学习DSP是有用的。

下载Dsp学习笔记word格式文档
下载Dsp学习笔记.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    DSP学习小结(共5篇)

    根据一学期以来对DSP这门课程的学习,学到了很多DSP相关的知识。了解了如何根据实际需求选择DSP芯片,也知道了C54x的会变和链接过程,还掌握了C54x的寻址方式,尤其是直接和简介寻......

    学习笔记

    我们的福音——“厉行节约,反对浪费”有感好客中国人,设宴必有剩。”这是流传在中国大部分地区的陈规陋习。客人走后,主家只有满桌的剩菜、剩饭、剩酒,才能充分表达主人那颗虚荣......

    学习笔记(模版)

    学习笔记 学习时间:2014年5月27日16:30—17:30 学习地点:CT远程室 参加人员:医技支部全体党员 学习内容:关于开展机关党员“践行三严三实、做合格人民公仆“村社区党员”在党爱党......

    2014学习笔记

    时间:2014年1月8日 地点:三楼会议室 人员:全体党员、职工 形式:集中学习 主讲人:张晓波 学习内容:十八届三中全会精神 一、全面深化改革的重大意义和指导思想 二、坚持和完善基本......

    学习笔记之一

    【学习笔记之一】近平在党的群众路线教育实践活动工作会议上的 重要讲话精神 党的群众路线教育实践活动工作会议于2013年6月18日在北京召开,习近平出席会议并发表重要讲话。 ■......

    学习笔记

    论谋生与敬业——教师心得体会 对于敬业的老师来讲,教育不是牺牲而是享受;教育不是重复而是创造;教育不是谋生的手段而是生活的本质;这是一名特级教师讲过的一句话。他的话让......

    学习笔记

    习近平总书记“1·5”重要讲话学习笔记 在学习贯彻党的十九大精神研讨班开班式上,习近平总书记指出,“在新时代,我们党必须以党的自我革命来推动党领导人民进行的伟大社会革命......

    学习笔记

    时间4月10日 地点:四楼会议室 内容:在集团公司保持党的纯洁性学习教育基层组织建设年活动动员大会暨党风廉政建设工作会议上的讲话——党委书记、董事长 武华太 党委书记、董......