找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9747|回复: 3
收起左侧

F2812DSP的最小系统设计报告

[复制链接]
久久常常 发表于 2018-4-23 15:26 | 显示全部楼层 |阅读模式
摘要:本文主要介绍了基于TI公司生产的TMS320F2812DSP最小系统设计。该最小系统主要包括电源、时钟、复位、外扩SRAM以及JTAG接口的设计,为实现基本的程序演示,还增加了外部中断,基本输入输出、以及异步串行通信模块。                                                                                                         


1引言
DSP由于运算速度快,具有可编程特性及接口灵活的特点,使得它在电子产品的研制中,发挥着越来越大的作用。采用DSP器件来实现数字信号处理系统更是成了当前的发展趋势。如何以最短的开发周期,开发出适于自己应用的高性能低成本的DSP板,己经成为广大DSP工程技术人员共同关心的问题。                                                
DSP最小系统板硬件设计是本文的主要任务。在介绍TMS320F2812基本特点的基础上,运用DSP技术和硬件电路设计知识进行了DSP最小系统设计,包括电源设计、复位电路设计、时钟电路设计、外扩存储器设计、JTAG接口设计等,为实现基本的程序演示,还增加了外部中断,基本输入输出、以及异步串行通信模块。                              
本文使用Altium Designer Summer 09设计电路板,绘制电路原理图,并对最小系统的高速PCB板进行了设计。                                       
最后,以自行设计的高速 DSP板为硬件平台,使用CCS3.3软件,编写测试程序。经过多次软硬件调试和测试,验证了DSP最小系统板卡能正常运行,能满足基本信号处理的要求。                       
2硬件设计                                   
2.1电源设计                                    
在F2812中对上电顺序有严格的要求,而普通的线性稳压芯片达不到要求,所以本文采用了专门的电源管理芯片TPS767D318。TPS767D318为双通道输出的可控电源转换芯片,可以通过控制使能端从而控制电压的输出顺序。TPS767D318的具体硬件设计如图1所示,F2812的供电电压为3.3V和1.8V,上电顺序先后为3.3V、1.8V。设计的基本思想是,先使能3.3V输出,然后利用场效应管BSS138驱动1.8V电的使能端,是芯片产生1.8V电压,从而实现上电顺序的控制。其中的+5V电压为外部电源提供。
图1 TPS767D318设计原理图                                                     
2.2时钟电路和复位电路设计
时钟电路是时序逻辑电路最基本的组成部分,须要为其提供时钟源,F2812才能正常工作,F2812内部有倍频的PLL电路,在此我们使能锁相环,并且为了提高系统的抗干扰能力,本文使用30M有源晶振为系统提供时钟信号,通过PLL倍频至150MHz,外部有源时钟电路如图2所示。
通常DSP正常工作时还需要一个复位电路,本文不采用按键复位,而是采用更高可靠性的复位芯片IMP809L,当外部供电电压下降至2.7V时,系统就会产生复位,复位电路如图3所示。                           
                              
图2  时钟电路                 图3  复位电路                                
2.3外扩SRAM设计
添加SRAM是为了增加系统的存储空间,在F2812中内部存储空间很小,许多程序要求有较大的存储空间,所以应在电气平台中添加SRAM。F2812中为用户提供了众多外部存储空间,最多可扩展1M*16b的存储空间。                              
SRAM为静态随机存储器,一般由存储矩阵、地址译码器和读写控制电路组成。本文采用IS61LV12816 SRAM, IS61LV12816有16根数据总线和17根地址总线,最大存储空间为128K*16b。
在F2812Z中,可用的外部存储空间为Zone0、Zone1、Zone2、Zone6,其中Zone0、Zone1共用一个片选信号线(44脚),Zone2的片选信号是(88脚),Zone6的片选信号是(133脚),本文将Zone2分配给SRAM,在硬件设计上,将(88脚)连接到IS61LV12816的片选信号()上,同时将DSP的读使能信号线和写使能信号线分别接到IS61LV12816的读、写使能信号线上,实现对IS61LV12816的读写控制。DSP可选配置为微计算机模式或者微处理器模式,IS61LV12816设计电路如图4所示。                        
                           
图4  IS61LV12816设计原理图                                   
2.4JTAG接口电路设计                                    
为方便程序的调试和下载,须要一个JTAG接口,如图5所示。在程序调试时,须要配合CCS编译环境以及XD510/XD560仿真器配合使用。         
                        
图5  JTAG接口电路                                 
2.5RS-232(串口)设计                                 
串行通信接口(SCI)是一个采用发送、接收双线制的异步串行通信接口,即通常所说的UART口,它支持16级的接收发送FIFO,从而降低了串口通信时CPU 的开销。SCI模块支持CPU和其它使用非归零制(NRZ)的外围设备之间的数字通信。在不使用FIFO的情况下,SCI接收器和发送器采用双级缓冲模式,此时SCI接收器和发送器都有独立的使能和中断位,它们可以被设置成独立操作或者同时进行全双工通信模式。                             
在F2812中有两路串行通信接口(SCI口),本文将SCIB口设计成RS-232口,主要测试与上位机进行通信的功能,电平转换芯片采用美信公司的MAX3232。与上位机通信的接口采用通用的串口DB9,串口通信电路如图6所示。                          
                                
图6  RS-232硬件设计电路图                                                                  
2.6GPIO流水灯设计                                            
为测试通用输入输出,本文设计了流水灯电路,首先是一个灯亮、灭,然后两个灯亮、灭,如此,灯的数目依次增加,直到8个灯全部点亮,最终灭灯。如图7所示。                                            
图7  流水灯设计电路图                                          
2.7外部中断设计                                            
为测试外部中断,本文设计了按键形式的外部中断源,使用F2812 XINT1中断引脚,如图6所示。                                                            
                                      
图8  外部中断                                                   
3软件(测试程序)设计  
在程序测试部分本文实现这样的功能,将上位机与F2812通过串口相连,上位机可以利用串口调试助手发送数据给F2812,当F2812接收到的数据为‘a’时,开启流水灯;每按一次按键,F2812向上位机发送一个数据‘s’,利用串口调试助手可以看到接收的数据,并且关闭流水灯。
3.1系统设置总程序                                          
  1. /*------------------------------------------------------------**                  
  2. ** 文 件 名:MinSys.c                      **                  
  3. ** 处 理 器:DSP281x                      **              
  4. ** 版本: DSP281x C/C++ Header Files V1.20   **              
  5. ** Boot 配置:boot to Zone2                  **               
  6. ** 功能描述:F2812最小系统测试            **               
  7. ** 修订日期:2011-06-12                    **                  
  8. ** 备  注:外部中断、定时、GPIO、SCI       **               
  9. **------------------------------------------------------------*/      
  10. #include "DSP281x_Device.h"     // DSP281x头文件                       
  11. #include "DSP281x_Examples.h"   //DSP281x头文件                           
  12. void InitGpio(void);                                            //初始化GPIO,复用,方向                     
  13. void IsrAddr(void);                                             //定义中断服务程序的入口地址            
  14. void PieIntEnable(void);                                  //使能PIE级中断               
  15. void scib_init(void);                        //初始化SCIB                     
  16. void scib_send(int a);                        //发送数据                 
  17. interrupt void cpu_timer0_isr(void); // TIMER0中断                     
  18. interrupt void xint1_isr(void);                 //XINT1中断                     
  19. interrupt void scibRxFifoIsr(void);  //接收中断            
  20. Uint16 Count=0;
  21. Uint16 Light=0x00ff;
  22. Uint16 recveddata=0;
  23. void main(void)                                                  
  24. {                                                   
  25. /*初始化系统控制:*/                                      
  26.               InitSysCtrl();                                    //PLL,看门狗,使能外设时钟                       
  27. /* 初始化GPIO: */                                    
  28.               InitGpio();                                     //引脚复用,方向                        
  29. /* 禁止全局中断,并初始化PIE向量表: */                    
  30.               DINT;                  //禁止全局中断                     
  31.               InitPieCtrl();                                             //初始化PIE控制寄存器,默认状态为禁止PIE中断,清除中断标志位         
  32.     IER=0x0000;                                   //禁止CPU中断                     
  33. IFR=0x0000;            //清除中断标志位                  
  34.               InitPieVectTable();                               //初始化PIE向量表指针,并使能PIE                                
  35.     IsrAddr();                                     //定义中断服务程序的入口地址                        
  36. /*设置定时器*/                                                         
  37. InitCpuTimers();                               //初始化CPU定时器                        
  38. ConfigCpuTimer(&CpuTimer0, 150, 1000000); //定时1s
  39. /* 初始化外设SCIB*/                                             
  40. scib_init();                                                
  41. /*使能中断*/                                                      
  42.               IER|=M_INT1|M_INT9;    //使能CPU级中断                           
  43.     PieIntEnable();                                //使能PIE级中断                    
  44.               EINT;                                       // 使能全局中断                                       
  45.     ERTM;                                                           // 使能全局实时中断,用于DBGM                             
  46. /* IDLE 循环: */                                                   
  47.    for(;;);                                             
  48. }                                                               

  49. void InitGpio(void)                                                      
  50. {                                                            
  51.    EALLOW;                                                        
  52. GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4=1;                            //使能SCIBTX复用功能                  
  53. GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5=1;                            //使能SCIBRX复用功能               
  54. GpioMuxRegs.GPEMUX.bit.XINT1_XBIO_GPIOE0=1;               //使能XINT1复用功能                                
  55. GpioMuxRegs.GPBDIR.all=0xFFFF;                              //GPIOB设置为输出模式                  
  56.    EDIS;                                                                              
  57. }                                                               
  58. void  IsrAddr(void)                                             
  59. {                                                                       
  60. EALLOW;                                                  
  61. PieVectTable.XINT1=&xint1_isr;                                                                      //外部中断1                             
  62. PieVectTable.RXBINT=&scibRxFifoIsr;                                                        //SCIB接收中断                     
  63. PieVectTable.TINT0=&cpu_timer0_isr;                                                        //CPU定时器0中断                 
  64. EDIS;                                                           
  65. }                                                         
  66. void PieIntEnable(void)                                          
  67. {                                                         
  68.    PieCtrlRegs.PIEIER1.bit.INTx7=1;                                                         //CPU定时器0         
  69.    PieCtrlRegs.PIEIER1.bit.INTx4=1;                                                                      //外部中断1         
  70.    PieCtrlRegs.PIEIER9.bit.INTx3=1;                                                                      // SCIBRX            
  71. }                                                      
  72. 3.2              外部中断、定时、流水灯测试程序                                 
  73. interrupt void xint1_isr(void)                                
  74. {                                                                       
  75.    scib_send('s');                                                                                                          //发送数据‘s’                                          
  76.    StopCpuTimer0();                                                                                                      //停止定时器                                      
  77.    GpioDataRegs.GPBDAT.all=0;                                                                        //灯灭                             
  78.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;                  
  79. }

  80. //灯的数目从1到8交替亮灭                                                                     
  81. interrupt void cpu_timer0_isr(void)                                                            
  82. {                                                                    
  83.    Count++;                                                    //计数器加1                             
  84.    GpioDataRegs.GPBDAT.all=Light; //灯亮                  
  85.    Light<<=1;                                                  //亮灯循环左移依次点亮
  86.    Delay_s(100);                                                //延时
  87.    GpioDataRegs.GPBDAT.all=Light&0xffff;                             
  88.    Count%=8;                                                  //循环周期到,计数器清零                                          
  89.    if(Count==0)                                                
  90.    {                                                                 
  91.               Light=0xFFFF;                                             //下一周期循环开始                                 
  92.    }                                                                        
  93.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;                                          
  94. }  
  95. //延时程序
  96. void Delay_s(int n)
  97. {
  98.               for(int j=0;j<n;j++)
  99.               {
  100.                             for(int k=0;k<10000;k++)
  101.                             ;
  102.               }
  103. }                                                                             
  104. 3.3              异步串行通信测试程序                                    
  105. void scib_init(void)                                                
  106. {                                                                                
  107.                 ScibRegs.SCIFFTX.all=0xE040;//允许接收,使能FIFO,没有FIFO中断,清除TXFIFINT                 
  108.               ScibRegs.SCIFFRX.all=0x2021;//使能FIFO接收,清除RXFFIN                              
  109.               ScibRegs.SCIFFCT.all=0x0000;//禁止波特率校验                       
  110.               ScibRegs.SCICCR.all=0x0007;//1个停止位,无校验,禁止自测试,空闲地址模式,字长8位              
  111.               ScibRegs.SCICTL1.all=0x0003; //复位                       
  112.               ScibRegs.SCICTL2.all=0x0003;                           
  113.               ScibRegs.SCIHBAUD=0x0001; //设定波特率                        
  114. ScibRegs.SCILBAUD=0x00E7; //为 9600bps               
  115.     ScibRegs.SCICTL1.all=0x0023; //退出RESET                       
  116. }                                                            
  117. interrupt void scibRxFifoIsr(void)                                 
  118. {                                                         
  119.               recveddata=ScibRegs.SCIRXBUF.all;//从缓冲区接收数据           
  120.               recveddata&=0xFF;  //接收数据高8位清零               
  121.     if(recveddata=='a')   //如果接收到的数据为‘a’                     
  122.     {                                                
  123.                             Light=0xFFFF;                                            
  124.         StartCpuTimer0();                                                                      //开定时器,流水灯工作           
  125.     }                                                      
  126.               ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;              ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;                    
  127.               PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;                                       
  128. }                                                                 
  129. void scib_send(int a)                                                        
  130. {                                                            
  131.               ScibRegs.SCITXBUF=(a&0xFF);                                          //向发送缓冲区写数据              
  132.               while(ScibRegs.SCICTL2.bit.TXRDY!=1);//等待发送成功                             
  133. }                                                                     
复制代码

4   结束语                                             
本文是在学习了DSP及其在控制中的应用课程之后,对F2812最小系统的设计,根据以往的经验对系统进行了定时、中断、GPIO以及串行通信的测试,今后会在DSP的学习和设计中不断努力,不断总结。

完整的Word格式文档51黑下载地址:
F2812DSP的最小系统设计.doc (88.11 KB, 下载次数: 77)
回复

使用道具 举报

wqw1135943350 发表于 2020-3-8 12:54 | 显示全部楼层
谢谢卤煮
回复

使用道具 举报

szy1357587658 发表于 2020-3-30 17:51 | 显示全部楼层
谢谢卤煮
回复

使用道具 举报

大土豆 发表于 2020-11-1 21:03 | 显示全部楼层
谢谢楼主对我帮助太大了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表