当前位置:文档之家› 哈工大DSP大作业

哈工大DSP大作业

DSP-F2812的最小系统设计姓名学号班级时间一、设计目的:TMS320F2812DSP是TI公司一款用于控制的高性能、多功能、高性价比的32位定点DSP。

它整合了DSP和微控制器的最佳特性,集成了事件管理器,A/D转换模块、SCI通信接口、SPI外设接口、eCAN 总线通信模块、看门狗电路、通用数字I/O口、多通道缓冲串口、外部中断接口等多个功能模块,为功能复杂的控制系统设计提供了方便,同时由于其性价比高,越来越多地被应用于数字马达控制、工业自动化、电力转换系统、医疗器械及通信设备中。

通过本课程的学习,我对DSP的各个模块有了较为深入的了解,希望可以通过对最小系统的设计,进一步加深对DSP的学习,能在实践中运用DSP,提高自己的动手实践能力。

二、设计思路所谓最小系统就是由主控芯片加上一些电容、电阻等外围器件构成,其能够独立运行,实现最基本的功能。

为了验证DSP的最基本的功能,我设计了如下单元:有源电路的设计、复位电路及JATG下载口电路的设计、外扩RAM的设计、串口电路的设计、外扩A/D模块电路的设计。

三、详细设计步骤和原理1、电源电路的设计TMS320F2812工作时所要求的电压分为两部分:3.3V的Flash电压和1.8V的内核电压。

TMS320F2812对电源很敏感,所以在此推荐选择电压精度较高的电源芯片TPS767D318。

TPS767D318芯片输入电压为+5V,芯片起振,正常工作之后,能够产生3.3V和1.8V两种电压电压供DSP使用。

如下图所示:2、复位电路及JATG下载口电路的设计考虑到TPS767D301芯片自身能够产生复位信号,此复位信号可以直接供DSP芯片使用,所以不用为DSP设置专门的复位芯片。

在实际设计过程中,考虑到JATG下载口的抗干扰性,在与DSP 相连接的接口均需要采用上拉设计。

3、外扩RAM的设计TMS320F2812芯片内部具有18K*16位RAM空间。

当程序代码长度小于18K*16位时,该芯片内部的RAM空间就能够满足用户的需求。

但是当程序代码大于这个时,DSP片内的RAM空间就不够用了。

TMS320F2812的外部接口XINTF是一种非多路选通的异步总线。

设计时,可以通过XINTF接口来外扩存储器。

TMS320F2812有19根地址线和16根数据线,所以可以外扩容量为64K*16位的SRAM芯片,如IS61LV6416。

4、串口电路的设计串口通信口(SCI)是一种采用两根信号线的异步串行通信接口,又称UART。

在TMS320F2812中游两组SCI通信,SCIA和SCIB。

SCI 模块的接收器和发送器都带有16级深度的FIFO,并且接收器和发送器都有独立的使能和中断位,可以在半双工模式下独立操作,也可以在全双工模式下同时操作。

根据TMS320F2812已有的资源设计SCI 串口通信的话,可以选用MAX3232芯片,具体电路设计如下:5、A/D模块的设计TMS320F2812内部具有16路12位的A/D转换器,采样精度为12位,它有2个采样保持器,具有单一或者级联;两种转换模式,最高转换速率为12.5MSPS。

从理论上讲,ADC模块的采样精度还是可以的。

但是根据工程经验,一般ADC模块的采样精度都会比理论值少3位,也就是说12位ADC模块,采样精度在比较好的情况下能达到9位,这个精度很多情况下并不尽如人意,给实际应用带来极大的困扰。

因此实际应用中,可以外扩AD芯片AD7864AS_2,连接原理图如上图所示。

四、演示程序源代码:本文我选取了自己编写的两个程序进行验证,测试GPIO 口以及定时器的功能。

1、控制GPIOA0口输出高低电平#include"DSP28_Device.h"//头文件,包含各种寄存器的定义和配置#include"DSP28_Globalprototypes.h"void delay_loop(void); //延时函数的声明void main(void){int kk=0;//变量,用作延时InitSysCtrl();//初始化系统函数DINT;IER=0x0000;//禁止CPU中断IFR=0x0000;//清除CPU中断标志InitPieCtrl();//InitPieVectTable();InitGpio();while(1){GpioDataRegs.GPACLEAR.bit.GPIOA0=1;//GPIOA0口输出低电平for(kk=0;kk<100;kk++)delay_loop();//实现延时功能GpioDataRegs.GPASET.bit.GPIOA0=1;//GPIOA0口输出高电平for(kk=0;kk<100;kk++)delay_loop();//再延时一段时间}}void delay_loop()//延时函数的定义{short i;for(i=0;i<30000;i++){}}实验结果:利用示波器观察GPIOA0口发现会有高低电平不断跳变。

2、利用定时器0实现控制GPIOA0口隔1S进行高低电平的转换#include "DSP28_Device.h"void main(void){InitSysCtrl();InitCpuTimers();//初始化CPU定时器0DINT;//禁止和清除所有CPU中断InitPieCtrl();//初始化中断向量IER-0x0000;IFR=0x0000;//InitPieCtrl();InitPieVectTable();//初始化中断向量表InitPeripherals();//初始化CPU定时器模块InitGpio();//初始化GPIOPieCtrl.PIEIER1.bit.INTx7=1;IER|=M_INT1;//开CPU中断1EINT;//使能全局中断ERTM;//使能实时中断ConfigCpuTimer(&CpuTimer0,150,1000000);//调用时钟配置函数,将定时器设置为1S。

StartCpuTimer0();//启动定时器for(;;){}}interrupt void TINT0_ISR(void) // CPU-Timer0中断函数,在文件DSP28_DefaultIsr.c中{ // 中断函数代码CpuTimer0.InterruptCount++;if(CpuTimer0.InterruptCount==1){GpioDataRegs.GPACLEAR.bit.GPIOA0=1;}if(CpuTimer0.InterruptCount==2){GpioDataRegs.GPASET.bit.GPIOA0=1;CpuTimer0.InterruptCount=0;}CpuTimer0Regs.TCR.bit.TIF=1;PieCtrl.PIEACK.bit.ACK1=1;PieCtrl.PIEACK.all = PIEACK_GROUP1;EINT;}/**************************************************************************** **名称:ConfigCpuTimer()**功能:此函数将使用Freq和Period两个参数来对CPU定时器进行配置。

Freq以MHz * 为单位,Period以us作为单位。

**入口参数:*Timer(指定的定时器),Freq,Period**出口参数:无*在文件DSP28_CpuTimers.c中****************************************************************************/void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period){Uint32 temp;Timer->CPUFreqInMHz = Freq;Timer->PeriodInUSec = Period;temp = (long) (Freq * Period);Timer->RegsAddr->PRD.all = temp; //给定时器周期寄存器赋值Timer->RegsAddr->TPR.all = 0; //给定时器预定标寄存器赋值Timer->RegsAddr->TPRH.all = 0;// 初始化定时器控制寄存器:Timer->RegsAddr->TCR.bit.TIF=1; //清除中断标志位Timer->RegsAddr->TCR.bit.TSS = 1; //停止定时器Timer->RegsAddr->TCR.bit.TRB = 1; //定时器重装,将定时器周期寄存器的值装入定时器计数器寄存器Timer->RegsAddr->TCR.bit.SOFT = 1;Timer->RegsAddr->TCR.bit.FREE = 1;Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断Timer->InterruptCount = 0; //初始化定时器中断计数器}实验结果:利用示波器观察GPIOA0口发现每隔一秒会出现高低电平跳变一次。

相关主题