21ic电子技术开发论坛

标题: 我的dsp的成长之路------此贴只赠给我自己 [打印本页]

作者: meng219902    时间: 2012-5-1 19:34
标题: 我的dsp的成长之路------此贴只赠给我自己
接触dsp已经三周多了,在这三周里,虽然我的成长不够迅速,但是对于我来说已经很好了。。。
  三周前我买了一个最小系统的板子,卖给我板子的老板给我介绍了一本书,还有我们老师也给我介绍了一本,都是28xx的,我感觉这两部书比较好一个是将28335的构造,很全面(比如寄存器。。。你懂得,我语文不好),一个讲的是例程的,首先介绍一下这个模块的构造,还有寄存器在工程上的语法等,(我感觉其实就是板子的例程文件,用中文给翻译了一遍再加上详细的讲解罢了)。
  这三周我一边看老板给我的视频,然后再看手把手那个视频,(我感觉还是手把手教的好,详细清楚 只是到后面没有例程的讲解了,前面是有的,拿几个案例给我们将这句话是什么作用,怎么写。。。),一边看我们老师的书,(老板介绍的书,我现在才看,因为我发现老板的书是用来编程的,你不会了 哪个寄存器 哪个引脚都告诉你)
  这三周来,我在这里发了一个帖子《dsp工资本科生VS研究生》,这个帖子坚定了我学习dsp的信心,因为我看到了那些前辈们的工资,虽然那些钱不能让你成为富翁,最起码以后你可以让你老婆孩不会为了钱发愁吧,而且我想你还可以过一些小资生活,你们说对吧?(注意!学习dsp我不是单单为了钱~!就是因为喜欢,因为我可以做,虽然他有点难,如果那样我是为了钱,那我为什么不学软件呢?C# 安卓。。。我们学院的这些老师都是做软件的。)
   这三周我感觉。。。哦 不!是这几天,我进度太快了,因为我太想学成了,太想。。。学C6000了,导致我的进度(我说的这个进度是实质的进度,而不是刚才说的)停滞不前,其实我这个人最大的优点是知道我的缺点是什么,我应该怎么改正。经过我昨天晚上的思想斗争,我决定放下那些所谓的我学了,我已经学过了的思想。从头开始,像学单片机一样,学一个模块,用一个模块。一步一步往前走。。。
作者: meng219902    时间: 2012-5-1 19:35
2012.5.1
  今天我开始了重新学习的第一步!GPIO模块,因为我买的是最小系统,所以外设是我自己焊的(一个流水灯,一个蜂鸣器,两个数码管,四个独立按键,8个滑动变阻器电路(用来ADC的),对了还有一个串口通信的串口。
  我可以知道GPIO的控制寄存器和数据寄存器,控制寄存器是要用EALLOW,EDIS的 而数据寄存器就不需要了,我还会了怎么把程序烧写到flash里面。
  现在我想用中断控制流水灯、蜂鸣器,在没有产生中断的时候流水灯亮,中断产生蜂鸣器响,虽然我知道28335有三级中断(外设、PIE、CPU),但是我不知道怎么用,所以我也继续学习他们在编程方面的运用了,剩下的就没有了吧?
作者: meng219902    时间: 2012-5-1 19:35
哦 对了 还有我那个仿真器,XDX100V2 我买回来的时候,我们老师就说 这个能仿真吗?我当时不知道怎么回事,现在知道了,能!但是经常跑飞,哦,不应该说经常,应该小于经常,要不我也受不了啊,你说对吧,话说回来,实质性问题就说我没钱啊,要有钱就买七八百的了
作者: meng219902    时间: 2012-5-1 19:38
哦 打错了是XDS仿真器 而不是XDX
作者: meng219902    时间: 2012-5-1 22:58
今天就到这里,CPU中断我大致上可以了,你要问我细节,我只能告诉你,我看书可以告诉你,比如寄存器CpuTimer0的TCR各个位是什么意思,我告诉你我就记得一个TSS,还有一个定时器中断标志位和中断使能位,定时器中断标志位我没有管他,我的意思是我没有置1,也没出现什么反应啊,还有中断使能,所以说这两个我还没有弄懂,
   还有我那个烧写flash,你一定要认真读教程,可不要像我似的,文件都在Debug里面!记住他在Release中
作者: lyn0103    时间: 2012-5-2 09:38
lz很好。。。。加油
作者: meng219902    时间: 2012-5-2 09:42
今天开始我自己建个工程,因为我从前建过,但是都没有建成功,总是出现。。。。没有资源。。。(都是英文)我上网查了,也有人和我一样,但是众说风云,还是没有找到答案,今天我还想尝试一下,因为我感觉,总是在别人的工程上改写东西,有些基本框架你不会记住的,没有像单片机写程序那样扎实,多的也不说了,现在开始。。。
作者: meng219902    时间: 2012-5-2 09:42
6# lyn0103

嗯我会的 谢谢
作者: batsong    时间: 2012-5-2 14:44
呵呵,楼主加油

不过提醒一下,做DSP的精髓一般不在DSP芯片上,而是运行在这颗芯片上的理论和算法。如果在学校,还是珍惜资源打好理论基础
作者: kangwuwei    时间: 2012-5-2 14:52
呵呵,楼主加油

不过提醒一下,做DSP的精髓一般不在DSP芯片上,而是运行在这颗芯片上的理论和算法。如果在学校,还是珍惜资源打好理论基础
batsong 发表于 2012-5-2 14:44

正解
作者: hexiaoxiao    时间: 2012-5-2 15:26
DSP很难吗?
DSP本身只是个高速的,在信号处理上有专长的高级单片机而已。
我不太赞同,会DSP就要给高工资。
一个优秀的技术工程师,应该不会挑什么硬件平台。对于硬件,应该是拿之即可编程。这样的工程师才应该要给高工资。2万都是少的。
作者: cooran    时间: 2012-5-2 17:30
楼主加油啊,顶一个
作者: kucher    时间: 2012-5-2 17:44
有实际行动才会进步
作者: nongfuxu    时间: 2012-5-2 19:07
赞同9楼的说法.
DSP的精髓是运行在这颗芯片上的理论和算法.
作者: jingsiyuan12321    时间: 2012-5-2 19:27
好贴  谢谢楼主
作者: duyinqian1986    时间: 2012-5-2 19:59
DSP只是一个工具。重要的是你会用这个工具去干什么事情。
作者: meng219902    时间: 2012-5-2 20:09
9# batsong
理论还可以,我们学了数字信号处理那个课了,有所了解,算法我还没有遇到,不知道什么是算法,只是听老师说了一嘴而已,真正的算法我没见过,我现在只能先了解DSP的结构,我懂您的意思 我会记住的,谢谢
作者: meng219902    时间: 2012-5-2 20:15
11# hexiaoxiao
但是。。。据我了解,DSP还是很好的,您说的确实有理,但是事实是他的工资。。。,你懂得,我们没有时间与能力去把所有的硬件学习,只能去学习一种,只能比较懂点,要不就找不到工作了不是吗
作者: meng219902    时间: 2012-5-2 20:18
12# cooran

谢谢 我会的
作者: meng219902    时间: 2012-5-2 20:19
10# kangwuwei
前辈们的话我会记住的,谢谢前辈们对我的支持
作者: meng219902    时间: 2012-5-2 20:20
14# nongfuxu
前辈们的话我会记住的,谢谢前辈们对我的支持
作者: kekeke    时间: 2012-5-2 21:57
加油吧大家
作者: kekeke    时间: 2012-5-2 21:57
另外谢谢楼主分享
作者: meng219902    时间: 2012-5-2 22:09
24# kekeke

谢什么啊 你们来看这个贴 就是对我的支持了  我应该谢谢你们呢
作者: meng219902    时间: 2012-5-2 22:24
我的错误是这样的, 我刚开始还以为是没有生成.out,我一直找,在build proj..(在工程名单击右键就看见了)就在那里瞎找,到后来我放弃了 找第二个错误,我也是瞎猫碰死耗子,看到ADC_cal有问题就找这个文件,到最后找到了,在系统文件.c那里,头文件那个声明文件我改没有改动(好像是不让改),然后我把系统文件.c中的ADC_cal给删了,编译错误就全没了,我发现是ADC_cal的问题,我就感觉到可能是我没有加ADC.h和.c的问题,我把那个文件都加上了,把删的文件还原了,在编译就好了, 希望你也是这样类似的问题[img][/img]
作者: meng219902    时间: 2012-5-2 22:31
今天我还用我自己建立的工程 写了一个CPU中断, 说实话这是我照着书写的,我还是记不下来,感觉有点乱, 但是那些函数我是懂的,我也理解, 我就是想说CPU中断那个函数  我们需要“清位”比如ACK  还有以后的那些中断,要置位的,都要清位
作者: meng219902    时间: 2012-5-2 22:31
interrupt void cpu_timer0_ist(void)
{
        aa++;
        GpioDataRegs.GPADAT.bit.GPIO0=1;
        delay_loop();
        GpioDataRegs.GPADAT.bit.GPIO0=0;
        delay_loop();
        PieCtrlRegs.PIEACK.bit.ACK1=1;
        SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
}
后俩个是我今天上课看书看到的,其实我真正写的人程序没有他两个
作者: meng219902    时间: 2012-5-2 22:55
对不起 我本想给大家把CCS4.2传到网上来 分享一下 以为有个朋友管我要了,我想不止是他想,还有很多朋友想 但是。。。我给他传,太慢了,真的不行啊,希望他能理解我,有谁有好主意,把这个软件传上去的,请留言!
作者: Horse_JD    时间: 2012-5-3 08:55
我现在就有点毛躁,连基本的入门都没入,就想着完成倒是的任务~~~~忙碌一圈发现自己什么都没学
作者: jing4687007    时间: 2012-5-3 09:56
谢谢啊
作者: 爱之翼V    时间: 2012-5-3 11:04
楼主很不错的,加油,看好你哦
作者: meng219902    时间: 2012-5-3 14:06
30# Horse_JD

一定要忍住!!一定要扎实!!!我说什么都没有 只有靠自己来控制~!!!
作者: meng219902    时间: 2012-5-3 14:06
32# 爱之翼V

嗯 谢谢
作者: meng219902    时间: 2012-5-3 14:35
今天,我书看的是SCI 但是程序是看的关于中断的,外部中断(外部中断的视频和书我早就看完了),第一个感觉就是隔了几天看,全忘了,这次看程序又复习了一遍。
   EALLOW;
   GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 15;
   GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 1;  
   EDIS;
这个程序是外部中断选择Gpio口的,外部中断1、2可以选择GPA的32个io口, 那么外部中断有多少个中断呢?我看得是8个,还有外部中断3~7和XINMI,外部中断3~7可选择GPB的32个IO口,而XINMI就跟外部中断1、2似的,但是默认的是GPIO0;
  学到这里我就有一个疑问,那外部中断可以同时选择一个IO口吗? 我的意思是外部中断1、2可以都选GPIO2吗?外部中断3~7可以选GPIO33吗
作者: meng219902    时间: 2012-5-3 14:49
我才知道还有个外部中断寄存器 是在XIntruptRegs里面的,他的作用就这两个
XIntruptRegs.XINT1CR.bit.POLARITY = 0;      
   XIntruptRegs.XINT2CR.bit.POLARITY = 1;   //我用术语说不出来 我就用大白话说吧,就是POLARITY=0时那个IO口电平从1变到0,就会产生中断;   
=1时相反
=2时跟零一样
=3时 只要有跳变就产生中断   (注意:产生中断的前提是使能!!!我说的是=0;=1;=2;=3而不是单单的=3的时候,别看错了!)
   
   XIntruptRegs.XINT1CR.bit.ENABLE = 1;       //使能
   XIntruptRegs.XINT2CR.bit.ENABLE = 1;
作者: meng219902    时间: 2012-5-3 14:51
这是我在外部中断和GPIO的头文件,找到的
作者: meng219902    时间: 2012-5-3 21:47
今天晚上由于身体不适,所以没有继续学习,没有外部中断弄懂
#include"DSP28x_project.h"

interrupt void xint1_isr(void);
interrupt void xint2_isr(void);
Uint16 count1,count2;
void delay_loop(void)
{
        short i,n;
        for(i=0;i<100;i++)
                for(n=0;n<100;n++){}
}

void main(void)
{
        Uint16 temp1,temp2;
        InitSysCtrl();
        DINT;
        InitPieCtrl();
        IER=0x0000;
        IFR=0x0000;
        InitPieVectTable();
        EALLOW;
                PieVectTable.XINT1=&xint1_isr;
                PieVectTable.XINT2=&xint2_isr;
        EDIS;
        PieCtrlRegs.PIECTRL.bit.ENPIE=1;
        PieCtrlRegs.PIEIER1.bit.INTx4=1;
        PieCtrlRegs.PIEIER1.bit.INTx5=1;
        IER|=M_INT1;
        EINT;
       
        EALLOW;
                GpioCtrlRegs.GPAMUX1.all=0x0000;
                GpioCtrlRegs.GPADIR.all=0x000c;
        //        GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
        //        GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
                GpioDataRegs.GPADAT.all=0x0004;
               
                GpioCtrlRegs.GPAQSEL1.bit.GPIO0=0;
                GpioCtrlRegs.GPAQSEL1.bit.GPIO1=2;
                GpioCtrlRegs.GPACTRL.bit.QUALPRD0=0xff;
        EDIS;
       
        EALLOW;
                GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=0;
                GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL=1;
        EDIS;
       
        XIntruptRegs.XINT1CR.bit.POLARITY=0;
        XIntruptRegs.XINT2CR.bit.POLARITY=1;
        XIntruptRegs.XINT1CR.bit.ENABLE=1;
        XIntruptRegs.XINT2CR.bit.ENABLE=1;
       
        EALLOW;
                GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
                GpioCtrlRegs.GPADIR.bit.GPIO4=1;
                GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
                GpioCtrlRegs.GPADIR.bit.GPIO5=1;
        EDIS;
        for(;;)
        {
                temp1=count1;
                temp2=count2;
                GpioDataRegs.GPADAT.bit.GPIO2=1;
                GpioDataRegs.GPADAT.bit.GPIO2=0;
                while(temp1==count1){}
                delay_loop();
                GpioDataRegs.GPADAT.bit.GPIO3=1;
                GpioDataRegs.GPADAT.bit.GPIO3=0;
                while(temp2==count2){}
                delay_loop();
                GpioDataRegs.GPADAT.bit.GPIO4=0;
                GpioDataRegs.GPADAT.bit.GPIO5=1;
        }
}

interrupt void xint1_isr(void)
{
        count1++;
        GpioDataRegs.GPADAT.bit.GPIO4=1;
        PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
}

interrupt void xint2_isr(void)
{
        count2++;
        GpioDataRegs.GPADAT.bit.GPIO5=0;
        PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
}
作者: meng219902    时间: 2012-5-3 21:56
这个程序是我照着写的 我感觉很多,但是一到while() 就停下来了 我知道一定是没有产生中断,为什么我让GPIO赋1然后再赋0  为什么就不产生中断呢?
   晚上我问了一下,老板,也看了一下他给的视频(在我还没有问他之前,这个视频我已经看过了,但是今天看,感觉上一次相当于没看 忘了我的板子还有一个产生外部跳变的按键)  老板说 最后不要用GPIO直接来1~0、0~1,如果我不心把GPIO都设为输出,那样会烧坏DSP的,在他说完这句话之后,我立刻打开我的CCS看了一下我写的程序,小惊~~
   我感觉不只是老板说的那样,对板子有伤害的问题 我写的程序应该没有错误,为什么没有产生中断呢,我猜很有可能是GPIO根本没有产生跳变!!!(只是个人意见还请前辈们指点)
作者: ji7411    时间: 2012-5-4 14:54
楼主加油啊。,顶个!~一起努力
作者: meng219902    时间: 2012-5-4 19:50
40# ji7411

嗯 一起努力
作者: meng219902    时间: 2012-5-4 21:23
此时此刻我是非常发晕的,因为我刚才在网上一顿神找“算法”有很多前辈都说DSP核心的就是“算法”了,对于C2000来说,它应用的领域无非就是那几块,电机控制、逆变器、、、(完了说大了,初学者的水平,说错了前辈们勿喷)算法应该完善了把???我就有一个疑问。比如SVPWM 这方面 编出来的算法不是都一样吗? 我想知道是不是我们可以拿别人的算法用?比如TI的(等着以后工作了好像要付钱了)很晕啊
作者: meng219902    时间: 2012-5-4 22:16
今天一直做外围的中断的学习(我以为ZONE0、6、7是外部中断呢,原来他是外部接口,我的板子用来接外设RAM,FLASH)我看了两个程序,第一个我没有看到他到底想干什么,ZONE7的配置,剩下的都是就没有什么了吧?其实我错了,重点不是在ZONE7 上而是在
#pragma CODE_SECTION(cpu_timer0_isr,"xintffuncs");
#pragma CODE_SECTION(cpu_timer1_isr,"xintffuncs");   
   xintffuncs       : LOAD = RAML1,
                      RUN = ZONE7A,
                      LOAD_START(_XintffuncsLoadStart),
                      LOAD_END(_XintffuncsLoadEnd),
                      RUN_START(_XintffuncsRunStart),
                      PAGE = 0
xintffuncs这个存储空间刚开始我没找到,到了中午我才无意中发现,原来这个存储空间与zone7有关(还有RAM),我一下子意识到很多东西!第一我的CMD模块我没有学好(主要是在我没看手把手之前我看书上的CMD了,感觉好乱,都不知道写的什么,后来看了手把手之后,感觉好简单,原来就是MEMORY和SECTIONS啊,知道今天下午上课我把书上的CMD过了一遍才知道关于CMD的一些知识【说这句话的是我都不知道我要说什么了,因为我现在实在是太晕了】)  刚开始我还以为ZONE7的存储空间是在外设RAM里呢
(ZONE7叫外部存储器,而外设RAM呢?他俩有什么关系吗?我猜想是。。。。。请前辈们指点!)
MemCopy(&XintffuncsLoadStart, &XintffuncsLoadEnd, &XintffuncsRunStart);   
关于这个DMA,刚开始学的时候我还以为是CMD呢,就当CMD学的,老板讲得视频还有函数,就是跟这个差不多的,后来看手把手 也没有啊,是不是老板讲错了或者讲得太难了?答案是我看错了,要不是这个程序,到现在我都不知道CMD与DMA不是一回事!
作者: meng219902    时间: 2012-5-4 22:40
找了半天ZONE与外设RAM、FLASH的没有找到答案 我脸也洗了 还是不行啊
作者: czdo    时间: 2012-5-5 11:30
路过支持一下。上进好学的楼主
作者: liwsx    时间: 2012-5-5 11:41
楼主加油,、
会成功的
作者: meng219902    时间: 2012-5-5 21:46
在这里 我对那些支持我的人说一声对不起 这几天不知道怎么的 学不进去了(很大程度上是我快抗不住了,成天想疯了一样学习,没有假期,没有上不上课,上什么课都是在学DSP,上课看书,下课了看视频)  这两天我就看了几个程序,第一个感觉就是我必须把DMA模块学会!我的那些程序都是关于他的!其次就是跟着进度走ADC模块,但是我意识到外设接口的程序(关于DMA的)我还没有看懂,得继续看。。。现在我就好好休息,养足精神啊,身体是革命的本钱嘛,我得好好照顾好他
作者: gaga1    时间: 2012-5-6 14:30
楼主写的不错 楼主加油
作者: gaga1    时间: 2012-5-6 14:30
会一直关注楼主的
作者: meng219902    时间: 2012-5-6 23:14
48# gaga1
谢谢
作者: meng219902    时间: 2012-5-6 23:22
今天恢复了体力 我回到了无限的学习之中,把DMA模块给学得差不多了,那几个函数,但是有一个问题我就那不明白了
作者: meng219902    时间: 2012-5-6 23:32
DMACH1WrapConfig(1,0,0,1);这个函数是指最大偏移量的 那么他等于1(源地址),还有目地地址设为0,这让我怎么理解啊?莫非只进行一个脉冲?回到源地址的起始地址吗?这个还说得过去 那么目标地址偏移的太大了吧?但是设置的最大目地地址设置为0,这个怎么解释呢?求前辈明示
作者: meng219902    时间: 2012-5-6 23:32
//###########################################################################
//
// FILE:   Example_2833xAdcToDMA.c
//
// TITLE:  DSP2833x ADC To DMA
// ASSUMPTIONS:
//
//    This program requires the DSP2833x header files.
//
//    Make sure the CPU clock speed is properly defined in
//    DSP2833x_Examples.h before compiling this example.
//
//    Connect the signals to be converted to channel A0, A1, A2, and A3.
//
//    As supplied, this project is configured for "boot to SARAM"
//    operation.  The 2833x Boot Mode table is shown below.
//    For information on configuring the boot mode of an eZdsp,
//    please refer to the documentation included with the eZdsp,
//
//       $Boot_Table:
//
//         GPIO87   GPIO86     GPIO85   GPIO84
//          XA15     XA14       XA13     XA12
//           PU       PU         PU       PU
//        ==========================================
//            1        1          1        1    Jump to Flash
//            1        1          1        0    SCI-A boot
//            1        1          0        1    SPI-A boot
//            1        1          0        0    I2C-A boot
//            1        0          1        1    eCAN-A boot
//            1        0          1        0    McBSP-A boot
//            1        0          0        1    Jump to XINTF x16
//            1        0          0        0    Jump to XINTF x32
//            0        1          1        1    Jump to OTP
//            0        1          1        0    Parallel GPIO I/O boot
//            0        1          0        1    Parallel XINTF boot
//            0        1          0        0    Jump to SARAM            <- "boot to SARAM"
//            0        0          1        1    Branch to check boot mode
//            0        0          1        0    Boot to flash, bypass ADC cal
//            0        0          0        1    Boot to SARAM, bypass ADC cal
//            0        0          0        0    Boot to SCI-A, bypass ADC cal
//                                              Boot_Table_End$
//
//
// DESCRIPTION:
//
// ADC is setup to convert 4 channels for each SOC received, with  total of 10 SOCs.
// Each SOC initiates 4 conversions.
// DMA is set up to capture the data on each SEQ1_INT.  DMA will re-sort   
// the data by channel sequentially, i.e. all channel0 data will be together
// all channel1 data will be together.
//
// Code should stop in local_DINTCH1_ISR when complete
//
// Watch Variables:
//      DMABuf1
//
//###########################################################################
//
// Original source by: M.P.
//
// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $
// $Release Date: August 1, 2008 $
//###########################################################################

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

// ADC start parameters
#if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
  #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
  #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz
#endif
#define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS   = 25.0MHz/(1*2) = 12.5MHz
#define ADC_SHCLK  0xf   // S/H width in ADC module periods                        = 16 ADC clocks
#define AVG        1000  // Average sample limit
#define ZOFFSET    0x00  // Average Zero offset
#define BUF_SIZE   40    // Sample buffer size

// Global variable for this example
Uint16 j=0;

#pragma DATA_SECTION(DMABuf1,"DMARAML4");
volatile Uint16 DMABuf1[40];

volatile Uint16 *DMADest;
volatile Uint16 *DMASource;
interrupt void local_DINTCH1_ISR(void);

void main(void)
{
   Uint16 i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

// Specific clock setting for this example:
   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK;        // HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;

// Step 2. Initialize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;        // Allow access to EALLOW protected registers
   PieVectTable.DINTCH1= &local_DINTCH1_ISR;
   EDIS;   // Disable access to EALLOW protected registers
      
   IER = M_INT7 ;                                     //Enable INT7 (7.1 DMA Ch1)
   EnableInterrupts();
   
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
   InitAdc();  // For this example, init the ADC

// Specific ADC setup for this example:
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;        // 0 Non-Cascaded Mode
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
   AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
   AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
   AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
   AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
   AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;
   AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x2;
   AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x3;
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;   // Set up ADC to perform 4 conversions for every SOC
   
//Step 5. User specific code, enable interrupts:
  // Initialize DMA
        DMAInitialize();

        // Clear Table
   for (i=0; i<BUF_SIZE; i++)
   {
     DMABuf1[i] = 0;
   }

       
// Configure DMA Channel
    DMADest   = &DMABuf1[0];              //Point DMA destination to the beginning of the array
        DMASource = &AdcMirror.ADCRESULT0;    //Point DMA source to ADC result register base
        DMACH1AddrConfig(DMADest,DMASource);
        DMACH1BurstConfig(3,1,10);
        DMACH1TransferConfig(9,1,0);
        DMACH1WrapConfig(1,0,0,1);
        DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
                         OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);





        StartDMACH1();

   

   // Start SEQ1
   AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;
   for(i=0;i<10;i++){
            for(j=0;j<1000;j++){}
        AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;    //Normally ADC will be tied to ePWM, or timed routine
   }                                             //For this example will re-start manually                  

}

// INT7.1
interrupt void local_DINTCH1_ISR(void)     // DMA Channel 1
{
  
  // To receive more interrupts from this PIE group, acknowledge this interrupt
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;

  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
   asm ("      ESTOP0");
   for(;;);
}
作者: meng219902    时间: 2012-5-6 23:33
这是原文件
作者: cooran    时间: 2012-5-7 14:18
现在看到这个帖子一周过去了,楼主一周的收获是不是又可以总结下了?
作者: meng219902    时间: 2012-5-8 00:22
55# cooran
嗯。。。其实我每天都作总结,要是总结这一周的话,回顾一下,
  这一周来,是我对dsp实质性的前进,从第一个工程的建立,到GPIO的学习,CPU中断,和外部中断(我感觉PIE模块是这两个中断的中介,我所看到的程序都需要PIE),然后就是DMA模块了(CMD这个肯定是在他之前学了),上周应该就学到这里。
  具体点,GPIO呢 就没得说了 那几个控制器控制是什么IO口,方向,还有怎么设置高低电平。CPU定时器就不用说了,注意入口怎么配置 PieVectTable.TINT0 = &cpu_timer0_isr; (timer1/2不是我们不可以使用吗?只有timer0可用),还有就是记住那个函数ConfigCpuTimer 剩下的就是使能了!什么CPU的IER 还有PIE的 还有总使能EINT 还有实时。。。我感觉这个模型就是中断的结构框架了。外部中断呢,有八个(7+1你懂的)外设中断选择IO口 还有IO口怎么配置!!(老板说了,如果配置错了很可能烧坏板子的),出发方式,对了我在PIE那里忘说了,就是清ACK! (并不是只清他,他只是代表一类置位的寄存器),什么使能了,配置进入口(哦,我想起来了,这个学名叫中断服务子函数)
作者: meng219902    时间: 2012-5-8 00:31
那些我都不用说了把?最后就是DMA了,DMA呢?一个是源地址,一个是目的地址。把地址配置好
#pragma DATA_SECTION(DMABuf1,"DMARAML4");
#pragma DATA_SECTION(DMABuf2,"DMARAML5");‘
然后就是一下函数了,你学一遍基本就了解了
DMADest   = &DMABuf1[0];
        DMASource = &DMABuf2[0];
           DMACH1AddrConfig(DMADest,DMASource);
        DMACH1BurstConfig(31,2,2);      
        DMACH1TransferConfig(31,2,2);     
        DMACH1WrapConfig(0xFFFF,0,0xFFFF,0);
DMACH1ModeConfig(DMA_TINT0,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,THIRTYTWO_BIT,CHINT_END,CHINT_ENABLE);
这是配置DMA的结构,但是我上面说了一个问题,我不明白,希望您能帮我解答一下 谢谢了
作者: meng219902    时间: 2012-5-8 00:42
对了外部接口ZONE0、6、7我忘说了!怎么说呢,ZONE的一些配置需要了解,什么写时序 读时序 时钟的配置,深度。。。。
MemCopy(&XintffuncsLoadStart, &XintffuncsLoadEnd, &XintffuncsRunStart);’
这个函数我一直以为是DMA的那几个函数中的一个呢,现在才发现不是啊,
还有PIE向量表,GPIOMUX表你都要有所了解
作者: meng219902    时间: 2012-5-8 00:51
今天我学了ADC模块 变了一个小程序 感觉就是我对CCS中的浮点型 整形 无符号整形、、、不太了解,导致我的电路真正的数值没有显示出来,而是。。。(怎么说呢,ADC不是分4095(右移四位)不移的话就是65520,对于那个数有了,就是转换没有弄清楚,我感觉就是数的类型有问题)
#include"DSP28x_project.h"

#define BUF_SIZE 256
Uint16 SampleTable[BUF_SIZE];
Uint16 *Xaddr=(Uint16 *)0x6100;
float32 Vinput;
void main(void)
{
        Uint16 i;
        Uint16 array_index;
        InitSysCtrl();
        EALLOW;
                SysCtrlRegs.HISPCP.all=0x3;
        EDIS;
        DINT;
        InitPieCtrl();
        IER=0x0000;
        IFR=0x0000;
        InitPieVectTable();
        InitAdc();
        AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;
        AdcRegs.ADCTRL3.bit.ADCCLKPS=0x1;
        AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
        AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
        AdcRegs.ADCTRL1.bit.CONT_RUN=1;
        AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
        AdcRegs.ADCMAXCONV.bit.MAX_CONV1=0;
        for(i=0;i<BUF_SIZE;i++)
        {
                SampleTable[i]=0;
        }       
        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
        while(1)
        {       
                array_index=0;
//                for(i=0;i<(BUF_SIZE/16);i++)
//                {
//                        while(AdcRegs.ADCST.bit.INT_SEQ1==0){}
//                        AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
                        SampleTable[array_index++]=((AdcRegs.ADCRESULT0)>>4);
                    Vinput=3*(SampleTable[0])/4095;
//                }       
         }
}
这个程序还是要改的,我都感觉有问题了,只是今天太仓促了 没时间了,初步性成果吧
作者: meng219902    时间: 2012-5-8 00:53
由于本人学校的实验室这几天断网,我只能学习完了,回寝室才能上网,导致我回复大家的时间有点晚,希望你们能够理解我
作者: 大秦正声    时间: 2012-5-8 11:49
本帖最后由 大秦正声 于 2012-5-8 11:51 编辑

28335 是加强的2812版本!
兼容2812的代码!
多了浮点运算硬件单元,I/O口功能更丰富灵活,可以设定各种中断方式!
我用外部总线成功操作读写擦除64G bit 的NAND flash !
1M byte SRAM,
16位的AD7656 模数转换芯片!
CAN 通信 波特率500Kb/s ,
而且工作温度在125度测试的!!!
我用的2812芯片。
作者: 大秦正声    时间: 2012-5-8 11:53
另外也采用了定时期中断,PWM等!
作者: meng219902    时间: 2012-5-8 18:49
62# 大秦正声
好全面 好列害  不过您说的某些方面我还没有用到 没有听懂 还请详解一下 对了 我这个帖子有几个疑问 您能不能帮我解答一下
作者: meng219902    时间: 2012-5-8 22:54
今天我用大部分时间花在看EV上了,这个模块的视频我早就看了 只是没有时间看书罢了,我是用了一下午加上一晚上把他给拿下了,只是了解了而已,我感觉我看得已经够快了,要不是我前面看了他的视频,有所了解了,我相信我绝对没有现在快,但是例子我还没有看,注意是看烦了,留着明天再看吧,你可以想象看了这么长时间能是什么感觉啊。
  上午的时候,我把ADC那个程序改了改,出了数字了,头前,我感觉数不对,因为我接的是DSP的1.8V的端口
作者: meng219902    时间: 2012-5-8 23:04
就这个AdcRegs.ADCRESULT0的值怎么也不对了,ADC本应该分4095分 但是我把滑动变阻器调到最小 那个值也就在2266上 导致输出的电压值不对(当时Vinput=1.8*(countA0)/4095;而不是Vinput=3*(countA0)/4095;)  后来,突然想到可能是他的对比电压的应该是3V 所以我接到DSP的3.3V接口(在之前我算过了,如果给3.3V的话,经过我滑动变阻器还有其他电阻的分压,顶多能达到3V,!注意DSP的ADC引脚只不能接超过3V的电压!!!!),改变后,我看到AdcRegs.ADCRESULT0值达到了4000左右了,我怕烧坏DSP说有就没继续,其实那已经是最大了,很接近了。
  如果接1.8V你就得*3,而不是*1.8 ,这个事情说明了一个ADC电压值采集的问题!我们实验室要关门了,我就不说明了,你们慢慢想想吧,我回寝室睡觉去了 有点小累
作者: 大秦正声    时间: 2012-5-9 10:30
我用的ccs3.3 版本,并口仿真器,ti 2812 dsp v120 版本库函数,可以从官网下载,包含很多例程,头文件,cmd文件。根据自己的板上硬件资源进行软件模块整合!仔细阅读英文手册!
另外成功做出jtag 信号驱动加强小板,可以参考英文手册。
作者: meng219902    时间: 2012-5-9 11:11
唉。。。。又一次读到郭天祥致读者的那封信,有点小伤感,其实很多人的故事与郭天祥一样,郭天祥只是这个故事的代表,我的故事将像他所说的那样。。。
作者: meng219902    时间: 2012-5-9 11:13
67# meng219902

你说的太深奥了(现在对于我来说),等我把DSP模块都了解了,回来再看你的这句话,我想我会深有感受的
作者: leonchen1990    时间: 2012-5-9 12:55
楼主,我正在学习DSP,所用板子是TMS320F28335,在“新建工程”和调试、下载方面遇到了不少问题!还有,没有可用的程序,能给我发一些你运行过的程序给我么!!邮箱:282101028@qq.com
:handshake
作者: meng219902    时间: 2012-5-9 14:21
69# leonchen1990

这个没问题  只要。。。唉 不对,我那个程序300M呢 这样吧 我先发一些你现在能用到的吧
作者: artic2005    时间: 2012-5-9 18:39
很中肯的帖子,继续记录下来,一定会让自己看到实现目标的时候,那时候再看这个帖子,绝对是一笔财富
作者: meng219902    时间: 2012-5-9 19:37
71# artic2005

你学到什么程度了???学arm了吗?
作者: 501821782    时间: 2012-5-9 22:24
我们两个的经历很相似啊,我dsp处理器还没有学好,就想学习精深的算法,太不自量力了,
作者: meng219902    时间: 2012-5-9 23:20
73# 501821782
我们最大的优点是知道自己缺点在什么地方,还是好好把握这个优点的好
作者: meng219902    时间: 2012-5-9 23:24
今天太气人了,第一个是后宫之事,另一个是我买的那本书的事!太不仔细了!太能欺骗我了,害的我在占空比上停留了好几个小时!我怀疑这本书是不是盗版的呢?还是这本书的作者没有审阅好呢??不能啊?对此表示无语。。。。我就发一下那本书告诉我的占空比是怎么回事吧
作者: meng219902    时间: 2012-5-9 23:31
你门看到没有 一会说低电平有效,T1CMPR=0的时候占空比为1的 又说占空比为0的,我能不晕吗?这可是我的指导书啊?他说什么就是什么啊?对于我啊?这么弄我还敢看他吗?无语... 下面把关于占空比最全面的,也是手把手上的占空比计算公式给出来吧!还是要相信定义!高电平占这个周期的比值
作者: meng219902    时间: 2012-5-9 23:43
视频我看了SCI的视频,书我早就看完了,看了视频之后,我感觉是对我的查疏补漏,
作者: firstblood    时间: 2012-5-10 15:31
楼主加油的啊,开始学的时候总会有这有那问题的,贵在**和理解的啊
作者: meng219902    时间: 2012-5-10 17:08
完了,我会在PWM这部分待一段时间了,28335与2812之类的dsp确实有点不同,我看那本书所有寄存器的名都改了,而且我感觉这里的寄存器也多了!我对此表示无语。。。还是继续吧
作者: 21小跑堂    时间: 2012-5-10 17:41
给楼主加条裤子!
不断探索、不断创新!楼主加油哦!
作者: meng219902    时间: 2012-5-10 20:37
80# 21小跑堂

谢谢
作者: meng219902    时间: 2012-5-10 21:13
我都无语了,实验室再一次停电,我要在寝室学习了。。。
作者: vivilzb1985    时间: 2012-5-11 18:23
楼主啊,这都在跟你一块的学习呢
作者: meng219902    时间: 2012-5-11 18:59
82# vivilzb1985
都是同道之人,都是初学者,一起奋斗吧,你是学生?还是工作了啊
作者: meng219902    时间: 2012-5-11 20:01
今天看到一个视频《老外**中国女孩。。。》,我看了评论了,感觉气愤!根本学不下去了!中国人有血性的怎么那么少呢!废物!废物!。。。。。
作者: meng219902    时间: 2012-5-11 21:23
F28335的epwm好难啊?各种寄存器各种限制!求前辈指点!
作者: meng219902    时间: 2012-5-11 22:09
今天呢就变了一个小程序,也没什么,无非是改变CMPR(2812的表示法)来改变占空比,也了解了一下怎么配置epwm的初步过程,因为那些寄存器太有说道了,我。。。语文不好啊!有的都看不懂,只能瞎猜。
作者: meng219902    时间: 2012-5-11 22:11
其实我感觉我的前进步伐慢了许多,有很多原因,可能学习DSP要放下一段时间了,因为我们再过两周就考试了,我可不想挂科!
作者: meng219902    时间: 2012-5-11 22:23
其实在Epwm方面,现在我有很大疑问,比如Epwm与2812的有什么相同之处 有什么不同之处,我的感受是,28335的Epwm已经独立了!通用定时器1、2已经不存在了!而且配置方法也有所改变,变得更细了(说的好听点,说不好听的就是变得复杂多了),好了,睡觉去,好蒙啊。。。
作者: meng219902    时间: 2012-5-12 16:54
由于今天我们要开老乡会,我就学到这里吧,其实今天就看了几个感觉Epwm的程序,有一个没有弄明白,为什么那个BUF数组不是ADCRESULT的值呢??
作者: huxinxin    时间: 2012-5-12 21:54
再次谢谢楼主 坛子需要这样**
作者: meng219902    时间: 2012-5-13 10:06
90# huxinxin

谢谢  谢谢
作者: meng219902    时间: 2012-5-13 10:57
今天我把Epwm给的例程看完,我就停止DSP的学习,进入考试复习阶段,为期可能是三周,也可能是一个月。。。
作者: meng219902    时间: 2012-5-14 21:43
暑假任务已经决定了@!!!!

经过我一下午的搜寻!我决定在暑假的小项目就是红外摄像头!  其实摄像头是假,他可以水平转动。。。反正不能360度,上下调节(俯视仰视那种)等多180度,他的转动信息 是通过红外线传感器来控制的,当红外线传感器测试到有红外发光体的话(我现在还不知道红外线传感器怎么工作的呢,只是凭感觉来的)他传出的数据来告诉DSP让他控制电机转动,把摄像头对准红外线发光物(可以是人,也可以是大型动物,不可能是苍蝇蚊子吧,我在想他们能发出红外线吗?)
   这个想法还可以延伸,不应该说是延伸,应该第一步用有线的按钮来代替红外线传感器,行了,再用红外线,然后我们还要配置是无线手动的控制装置(通过ZIGBEE等无线模块,也可以通过手机看的你想要的,这方面我就做不到了,得让我们学安卓的同学做了,那个无线的可以),还要我上面说的自动挡,
   我不知道我的想法怎么样,你们感觉呢?可以说说你们的想法,这个小题目,是我想练练手,掌握一些28335的。。。
作者: 一览    时间: 2012-5-15 11:38
任何事情的核心都在厚实基础上的创造。基础是最重要的,会DSP硬件知识敲门砖,你要实现DSP算法,总是要用DSP 芯片的。
作者: 一览    时间: 2012-5-15 11:39
好好学算法
作者: hklove    时间: 2012-5-15 12:17
算法好挺有趣的啊
作者: meng219902    时间: 2012-5-15 13:28
94# 一览

哦 是不是我将要设计的这个小题目里面的红外线通过传出的数据来计算物体移动的速度,距离,角度。。。就是你们所说的算法啊??
作者: meng219902    时间: 2012-5-15 13:28
95# 一览
嗯 我会的
作者: meishizhaoshi    时间: 2012-5-15 21:16
是转载吗?
作者: wangjinlili    时间: 2012-5-15 21:29
直播啊!!




欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5
meng219902    时间: 2012-5-11 18:59
82# vivilzb1985
都是同道之人,都是初学者,一起奋斗吧,你是学生?还是工作了啊
作者: meng219902    时间: 2012-5-11 20:01
今天看到一个视频《老外**中国女孩。。。》,我看了评论了,感觉气愤!根本学不下去了!中国人有血性的怎么那么少呢!废物!废物!。。。。。
作者: meng219902    时间: 2012-5-11 21:23
F28335的epwm好难啊?各种寄存器各种限制!求前辈指点!
作者: meng219902    时间: 2012-5-11 22:09
今天呢就变了一个小程序,也没什么,无非是改变CMPR(2812的表示法)来改变占空比,也了解了一下怎么配置epwm的初步过程,因为那些寄存器太有说道了,我。。。语文不好啊!有的都看不懂,只能瞎猜。
作者: meng219902    时间: 2012-5-11 22:11
其实我感觉我的前进步伐慢了许多,有很多原因,可能学习DSP要放下一段时间了,因为我们再过两周就考试了,我可不想挂科!
作者: meng219902    时间: 2012-5-11 22:23
其实在Epwm方面,现在我有很大疑问,比如Epwm与2812的有什么相同之处 有什么不同之处,我的感受是,28335的Epwm已经独立了!通用定时器1、2已经不存在了!而且配置方法也有所改变,变得更细了(说的好听点,说不好听的就是变得复杂多了),好了,睡觉去,好蒙啊。。。
作者: meng219902    时间: 2012-5-12 16:54
由于今天我们要开老乡会,我就学到这里吧,其实今天就看了几个感觉Epwm的程序,有一个没有弄明白,为什么那个BUF数组不是ADCRESULT的值呢??
作者: huxinxin    时间: 2012-5-12 21:54
再次谢谢楼主 坛子需要这样**
作者: meng219902    时间: 2012-5-13 10:06
90# huxinxin

谢谢  谢谢
作者: meng219902    时间: 2012-5-13 10:57
今天我把Epwm给的例程看完,我就停止DSP的学习,进入考试复习阶段,为期可能是三周,也可能是一个月。。。
作者: meng219902    时间: 2012-5-14 21:43
暑假任务已经决定了@!!!!

经过我一下午的搜寻!我决定在暑假的小项目就是红外摄像头!  其实摄像头是假,他可以水平转动。。。反正不能360度,上下调节(俯视仰视那种)等多180度,他的转动信息 是通过红外线传感器来控制的,当红外线传感器测试到有红外发光体的话(我现在还不知道红外线传感器怎么工作的呢,只是凭感觉来的)他传出的数据来告诉DSP让他控制电机转动,把摄像头对准红外线发光物(可以是人,也可以是大型动物,不可能是苍蝇蚊子吧,我在想他们能发出红外线吗?)
   这个想法还可以延伸,不应该说是延伸,应该第一步用有线的按钮来代替红外线传感器,行了,再用红外线,然后我们还要配置是无线手动的控制装置(通过ZIGBEE等无线模块,也可以通过手机看的你想要的,这方面我就做不到了,得让我们学安卓的同学做了,那个无线的可以),还要我上面说的自动挡,
   我不知道我的想法怎么样,你们感觉呢?可以说说你们的想法,这个小题目,是我想练练手,掌握一些28335的。。。
作者: 一览    时间: 2012-5-15 11:38
任何事情的核心都在厚实基础上的创造。基础是最重要的,会DSP硬件知识敲门砖,你要实现DSP算法,总是要用DSP 芯片的。
作者: 一览    时间: 2012-5-15 11:39
好好学算法
作者: hklove    时间: 2012-5-15 12:17
算法好挺有趣的啊
作者: meng219902    时间: 2012-5-15 13:28
94# 一览

哦 是不是我将要设计的这个小题目里面的红外线通过传出的数据来计算物体移动的速度,距离,角度。。。就是你们所说的算法啊??
作者: meng219902    时间: 2012-5-15 13:28
95# 一览
嗯 我会的
作者: meishizhaoshi    时间: 2012-5-15 21:16
是转载吗?
作者: wangjinlili    时间: 2012-5-15 21:29
直播啊!!




欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5