1、DSP最小系统设计报告 一、系统设计原理 本次设计采用TI公司生产的DSP芯片TMS320F2812和键盘扫描电路进行按键。TMS320F2812系列DSP(数字信号处理器)是TI公司最新推出的数字信号处理器,该系列处理器是基于TMS320C2xx内核的定点数字信号处理器。器件上集成了多种先进的外设,为电机及其他运动控制领域应用的实现提供了良好的平台。同时代码和指令与F24x系列数字信号处理器完全兼容,从而保证了项目或产品设计的可延续性。与F24x系列数字信号处理器相比,F2812系列数字信号处理器提高了运算的精度(32位)和系统的处理能力(达到150MIPS)。该系列数字信号
2、处理器还集成了128KB的Flash存储器,4KB的引导ROM,数字运算表以及2KB的OTP ROM,从而大大改善了应用的灵活性。两个事件管理器模块EVA、EVB为电机及功率变换控制提供了良好的控制功能。16通道高性能12位ADC单元提供了两个采样保持电路,可以实现双通道信号同步采样。 TMS320F2812系列DSP有以下特点:TMS320F2812有3个独立的片选信号,并且读/写时序可编程,兼容不同速率的外设扩展;通过配置外部接口寄存器,TMS320F2812在访问外部设备时不必额外增加延时等待,既提高了程序的实时性又减少了代码量。 TMS320F2812是TI公司2000系列
3、中功能最为强大的DSP芯片。它是一种32位DSP,片内有128K的FLASH,18K的SRAM, DART. 56 个I/0,12MAD+l6路输入,指令处理速度高达150MPIS。TMS320F2812的时钟频率是150MHz,即时钟周期是6.67ns。有众多的外设接口,GPIO, SPI, SCIA, SCIB, McBSP, eCAN, SRAM. FLASH, EVA,EVB, ADC。这些外设模块使TMS320F2812很适用于控制领域。 二、设计思路 最小系统加上外设电路,外设电路中包含16盏LED灯和2个按键。通过按键来控制LED亮灯的左移和右移。 三、
4、最小系统电路模块 2.1 电源电路 TMS320F2812芯片工作时需要的电压有两个部分:+3.3V的Flash电压和+1.8V的内核电压。TMS320F2812对电源很敏感,所以在此可以用电压精度比较搞得电源芯片TPS767D301或者TPS767D319。TPS767D301输入电压为+5V,芯片起震,正常工作之后,能够产生3.3V和1.8V两种电压工DSP使用。 2.2 晶振电路 DSP的时钟使用内部振荡器,在X1/XCLKIN和X2两个引脚之间连接一个石英晶体。 2.4 TMS320F2
5、812 四、外设电路 3.1 按键电路 S1按键接GPIOB0,S2按键接GPIOB1。S1亮灯右移,S2亮灯左移。 3.2 流水灯电路 流水灯电路接GPIOA。 五、部分程序 /******SRAM.cmd*****/ MEMORY { PAGE 0 : PRAMH0 : origin = 0x3f8000, length = 0x001000 PAGE 1 : /* SARAM */ RAMM0
6、 : origin = 0x000000, length = 0x000400 RAMM1 : origin = 0x000400, length = 0x000400 /* Peripheral Frame 0: */ DEV_EMU : origin = 0x000880, length = 0x000180 FLASH_REGS : origin = 0x000A80, length = 0x000060 CSM : origin = 0x000AE0, length = 0x000010 XINTF
7、 : origin = 0x000B20, length = 0x000020 CPU_TIMER0 : origin = 0x000C00, length = 0x000008 CPU_TIMER1 : origin = 0x000C08, length = 0x000008 CPU_TIMER2 : origin = 0x000C10, length = 0x000008 PIE_CTRL : origin = 0x000CE0, length = 0x000020 PIE_VECT : origin = 0x000D0
8、0, length = 0x000100 /* Peripheral Frame 1: */ ECAN_A : origin = 0x006000, length = 0x000100 ECAN_AMBOX : origin = 0x006100, length = 0x000100 /* Peripheral Frame 2: */ SYSTEM : origin = 0x007010, length = 0x000020 SPI_A : origin = 0x007040, length = 0x00
9、0010 SCI_A : origin = 0x007050, length = 0x000010 XINTRUPT : origin = 0x007070, length = 0x000010 GPIOMUX : origin = 0x0070C0, length = 0x000020 GPIODAT : origin = 0x0070E0, length = 0x000020 ADC : origin = 0x007100, length = 0x000020 EV_A : origin =
10、 0x007400, length = 0x000040 EV_B : origin = 0x007500, length = 0x000040 SPI_B : origin = 0x007740, length = 0x000010 SCI_B : origin = 0x007750, length = 0x000010 MCBSP_A : origin = 0x007800, length = 0x000040 /* CSM Password Locations */ CSM_PWL : or
11、igin = 0x3F7FF8, length = 0x000008 /* SARAM */ DRAMH0 : origin = 0x3f9000, length = 0x001000 } SECTIONS { /* Allocate program areas: */ .reset : > PRAMH0, PAGE = 0 .text : > PRAMH0, PAGE = 0 .cin
12、it : > PRAMH0, PAGE = 0 /* Allocate data areas: */ .stack : > RAMM1, PAGE = 1 .bss : > DRAMH0, PAGE = 1 .ebss : > DRAMH0, PAGE = 1 .const : > DRAMH0, PAGE = 1 .econst : > DRAMH0, PA
13、GE = 1 .sysmem : > DRAMH0, PAGE = 1 /* Allocate Peripheral Frame 0 Register Structures: */ DevEmuRegsFile : > DEV_EMU, PAGE = 1 FlashRegsFile : > FLASH_REGS, PAGE = 1 CsmRegsFile : > CSM, PAGE = 1 XintfRegsFile : > XINTF,
14、 PAGE = 1 CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1 CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 PieVectTable : > PIE_VECT, PAGE = 1 /* Allocate Periphera
15、l Frame 2 Register Structures: */ ECanaRegsFile : > ECAN_A, PAGE = 1 ECanaMboxesFile : > ECAN_AMBOX PAGE = 1 /* Allocate Peripheral Frame 1 Register Structures: */ SysCtrlRegsFile : > SYSTEM, PAGE = 1 SpiaRegsFile : > SPI_A, PAGE = 1 Scia
16、RegsFile : > SCI_A, PAGE = 1 XIntruptRegsFile : > XINTRUPT, PAGE = 1 GpioMuxRegsFile : > GPIOMUX, PAGE = 1 GpioDataRegsFile : > GPIODAT PAGE = 1 AdcRegsFile : > ADC, PAGE = 1 EvaRegsFile : > EV_A, PAGE = 1 EvbRegsFile : >
17、EV_B, PAGE = 1 ScibRegsFile : > SCI_B, PAGE = 1 McbspaRegsFile : > MCBSP_A, PAGE = 1 /* CSM Password Locations */ CsmPwlFile : > CSM_PWL, PAGE = 1 } /**************************************************************************** * *文件名:DSP28_Sys
18、Ctrl.c * *功 能:对2812的系统控制模块进行初始化 * ****************************************************************************/ #include "DSP28_Device.h" /**************************************************************************** * *名 称:InitSysCtrl() * *功 能:该函数对2812的系统控制寄存器进行初始化 * *********
19、/ void InitSysCtrl(void) { Uint16 i; EALLOW; SysCtrlRegs.WDCR= 0x0068; // 禁止看门狗模块 // 初始化PLL模块,如果外部晶振为30M,则SYSCLKOUT=30*10/2=150MHz SysCtrlRegs.PLLCR = 0xA; for(i= 0; i< 5000; i++){} // 延时,使得PL
20、L模块能够完成初始化操作 // 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz SysCtrlRegs.LOSPCP.all = 0x0002; // LSPCLK=150/4=37.5MHz EDIS; } /****************************************************************************
21、 *文件名:DSP28_Gpio.c * *功 能:2812通用输入输出口GPIO的初始化函数 * ****************************************************************************/ #include "DSP28_Device.h" /**************************************************************************** * *名 称:InitGpio() * *功 能:初始化引脚。 * *********
22、/ void InitGpio(void) { EALLOW; GpioMuxRegs.GPAMUX.all=0x0000; //将GPIOA引脚设置位I/O口 GpioMuxRegs.GPADIR.all=0xFFFF; //引脚方向为输出 GpioMuxRegs.GPBMUX.bit.GPIOB0=0; //将GPIOB0引脚设置位I/O口 GpioMu
23、xRegs.GPBMUX.bit.GPIOB1=0; //将GPIOB0引脚设置位I/O口 GpioMuxRegs.GPBDIR.bit.GPIOB0=0; //引脚方向为输入 GpioMuxRegs.GPBDIR.bit.GPIOB1=0; //引脚方向为输入 GpioDataRegs.GPADAT.all=0x0001; //引脚初始化为GPIOA0为高电平,D1亮 EDIS; } /*************************************************
24、 * *文件名:Gpio_LED_KEY.c * *功 能:通过按键对LED灯进行控制,按S1亮灯右移,按S2亮灯左移。 * ****************************************************************************/ #include "DSP28_Device.h" /**************************************************************************** * *名 称:mai
25、n() * *功 能:通过GPIOB1和B0来获取键值,通过GPIOA来控制LED亮灯移动。 * ****************************************************************************/ unsigned int led=0x0001; void main(void) { InitSysCtrl(); //初始化系统 DINT; //关中断 IER = 0x0000; IFR = 0x0000; InitPieCtrl();
26、 //初始化PIE InitPieVectTable(); //初始化PIE中断矢量表 InitPeripherals(); //初始化外设 InitGpio(); //初始化GPIO EALLOW; EDIS; EINT; // Enable INTM ERTM; // Enable DBGM while(1) { if(GpioDataRegs.GPBDAT.bit.GPIOB0==1) //检测按键S1按下,亮灯右移 { delay
27、50000); if(led=0xffff) then led=0x0000; else led<<1; } if(GpioDataRegs.GPBDAT.bit.GPIOB1==1) //检测按键S2按下,亮灯左移 { delayms(50000); if(led=0x0000) then led=0xffff; else led>>1; } GpioDataRegs.GPADAT.all=led; } } void delay(unsigned int t) { while(t>0) { t--; } }






