哈工大DSP大作业

  • 格式:doc
  • 大小:199.50 KB
  • 文档页数:8

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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定时器0

DINT;//禁止和清除所有CPU中断

InitPieCtrl();//初始化中断向量

IER-0x0000;

IFR=0x0000;

//InitPieCtrl();

InitPieVectTable();//初始化中断向量表

InitPeripherals();//初始化CPU定时器模块

InitGpio();//初始化GPIO

PieCtrl.PIEIER1.bit.INTx7=1;

IER|=M_INT1;//开CPU中断1

EINT;//使能全局中断

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;