基于MSP430F149单片机的SDRAM控制程序设计

楼主
基于MSP430F149单片机的SDRAM控制程序设计
摘 要:本文介绍了德州仪器公司新一代16位Flash型MSP430F149系列单片机的结构、特性和功能,阐述了基于该单片机控制系统的硬件组成和软件设计,并给出了该控制器在SDRAM控制系统中的应用,具有功耗低、功能齐全、人机界面友好等优点。

1 引言
MSP430系列微控制器是美国德州仪器(Texas Instruments)公司推出的功能强大的超低功耗Flash型16位RISC指令集微处理器。在运算速度方面,MSP430系列单片机能在8MHz晶体的驱动下,实现125ns的指令周期。16位数据宽度、125ns的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的一些算法(如FFT等)。MSP430具有非常高的集成度,单片集成了多通道12bit的A/D转换、片内精密比较器、多个具有PWM功能的定时器、斜边A/D转换、片内USART、看门狗定时器、片内数控振荡器(DCO)、大量的I/O端口以及大容量的片内存储器,单片可以满足绝大多数的应用需要。

SDRAM控制系统采用MSP430F149单片机。该单片机具有强大的处理能力、丰富的片上外围模块和方便高效的开发方式, 是MSP430系列中功能最强大的一款。MSP430F149采用冯--纽曼结构,RAM、ROM和全部外围模块都位于同一个地址空间内, 具有一个硬件乘法器、6个I/O端口(每个有8个I/O口)、1个精确的模拟比较器、2个具有捕捉/比较寄存器的定时器、8路12位A/D转换器、片内看门狗定时器、2个串行通信接口和60KB的FlashROM,2KB RAM。MSP430F149还具有强大的扩展功能,其具有48个I/O引脚,每个I/O口分别对应输入、输出、功能选择、中断等多个寄存器,使得功能口和通用I/O口可以复用,大大增强了端口功能和灵活性,十分适合开发的要求,所以选用其作为SDRAM系统的控制主芯片。

2 硬件系统组成

国家重大科学工程HIRFL-CSR(兰州重离子加速器冷却存储环)的控制系统由两部分构成:总体控制和前端控制服务器。总体控制包括网络通信支持系统、集群服务系统、数据库系统。前端控制服务器用来提供对受控目标和装置的完全控制,它们可以接收命令和数据,运行算法,向设备送出控制信号,返回设备的状态和数据,提供人机界面等。按照现场要求执行开环或闭环控制,从而完成对CSR电源系统,注入引出系统,内靶系统,真空系统,温度测控系统, 电子冷却系统等各个分系统的监视测量,故障报警,操作和控制。

基于MSP430F149单片机的SDRAM控制系统包括:PC机、微控制器、CPLD、FPGA、SDRAM。数据通过PC传送给微控制器MSP430F149,单片机收集到数据以后,经过一定的算法发送适当的命令给双向数据转换器和SDRAM控制器,从而完成对SDRAM数据的读写和刷新等控制操作。

3软件设计

MSP430的内核结构采用具有高透明格式的精简指令集(RISC)设计。指令分为硬件实现的内核指令和利用这一硬件结构的具有更高效率的模拟指令,使用起来非常方便。在本控制系统中,单片机完成初始化任务(设置标志位、看门狗的工作方式)后,就进入低功耗睡眠状态。中断将其唤醒,转而进入相应的子程序。基于MSP430F149单片机的SDRAM控制程序如下。

#include <msp430x14x.h>

void Init(void);

void Send(char* Data, unsigned int Length);

void SendAddress(unsigned int Address);

void SendData(unsigned int Data);

unsigned int ReceiveData(void);

char ReadData[20], Buffer[20];

unsigned char i=0, j, k, flag=0;

unsigned int Data;

unsigned int DisplayData;

char DisplayString[20];

 

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD; // Stop WDT

 Init();                   // UART1 inition

 _EINT();                  // enable interrupt

 while(1)
 {
  DisplayData = ReceiveData();

  if (DisplayData == 0)
  {
    k = 0;
    if (DisplayData != 0)
     {
      DisplayString[k] = 0 + DisplayData % 10;

      DisplayData = DisplayData / 10;

      k++;
     }

    Send(DisplayString, k);

   }

  }

}

void Init(void)
{

  UCTL1 &= ~SWRST; // reset swrst and usart1 enable
  UCTL1 = 0x10; // 8-bit character
  UBR01 = 0x03; // 8MHz 38400
  UBR11 = 0x00; // 8MHz 38400

  UMCTL1 = 0x4A; // U1CLK = SMCLK=TX2
  UTCTL1 = 0x10;

  ME2 |= 0x30; // Enable USART1 TXD/RXD

  P3SEL= 0xC0; // enable P3.6,7 USART1 TXD/RXD

  P3DIR= 0x40; // P3.6 output direction

  IE2 |= URXIE1; // Enable USART1 RX interrupt

 }

interrupt [UART1RX_VECTOR] void UART1RX(void) // read data
{
    if (flag == 0)    // wait for strat char of 0xAA or 0xDD
  {

  if (RXBUF1 == 0xAA) // alter flag
  {
   flag = 1;
   }

else if (RXBUF1 == 0xDD) // alter flag
 {
  flag = 2;
  }

   i = 0;

}

else
{
 ReadData = RXBUF1;
if (ReadData[i++] == 0xFF) // end char of 0xFF
{
  Data = 0;
 for (j=i-1; j!=0; j--)
 {

  Data = Data * 10 + (ReadData[j] - 0);

 }

if (flag == 1) // send address
 {
 SendAddress(Data);
 }

  else if (flag == 2) // send data
   {
    SendData(Data);
   }

   flag = 0;
  }

 }

}

void Send(char* Data, unsigned int Length) // send data
{
 unsigned int i;
 UCTL1 |= TXWAKE;
 TXBUF1 = 0x01;
 while ((UTCTL1&0x01) == 0);

 UCTL1 &= ~TXWAKE;

 for(i=0; i<=Length; i++)
 {
   TXBUF1 = Data;
   while ((UTCTL1&0x01) == 0);
  }

}

void SendAddress(unsigned int Address) // send address
{
 // address buses
 P1DIR |= 0xE0; // P1.5-1.7 address buses

 P2DIR = 0xFF; // P2.0-2.7 address buses

 P3DIR |= 0x1F; // P3.0-3.5 address buses

 P4DIR |= 0x1F; // P4.0-4.5 address buses

 P1OUT |= (Address & 0x07);

 P2OUT |= (Address & 0x7F8) >> 3;

 P3OUT |= (Address & 0x1F800) >> 11;

 P4OUT |= (Address & 0x7E0000) >> 17;
}

void SendData(unsigned int Data) // send data
{
// data buses
 P4DIR |= 0xC0; // P4.6-4.7 data buses
 P5DIR |= 0x1F; // P5.0-5.5 data buses
 P4OUT |= (Data & 0x03);
 P5OUT |= (Data & 0xFC) >> 2;
}

 

unsigned int ReceiveData(void) // send data
{
  unsigned int Data;
// data buses

 P4DIR &= 0x3F; // P4.6-4.7 data buses

 P5DIR &= 0xE0; // P5.0-5.5 data buses

 Data = ((P5IN & 0x1F) << 2) | ((P4IN & 0xC0) >> 6);
 return Data;
}

4 结语

MSP430F149是一种新型的混合信号处理器,采用了美国德州仪器(Texas Instruments)公司最新低功耗技术(工作电流为0.1~400uA)。该系列将大量的外围模块整合到片内,特别适合于开发和设计单片系统。基于MSP430F149单片机的SDRAM控制系统,具有较强的通用性和扩展性,满足了高速数据采集和处理的实时要求。

基金项目:HIRFL-CSR国家实验室国家“九五”重大科学工程项目

 

参考文献
[1]    敬岚,朱海君,梁义海,等.基于AT89C51的云台镜头监控系统设计及其应用[J].电气自动化,2003,25(Z06): 29~30.
[2]    敬岚,朱海君,张硕成,等.加速器控制系统中的32路数字I/O模块设计[J].电气自动化,2003,25(Z06):59~60.
[3]    敬岚,朱海君,张硕成,等.基于MSP430F149单片机的步进电机控制系统设计[J].电气自动化,2003,25(Z06):125~126.
[4]    朱海君,敬岚. 微控制器及其在控制系统中的应用[J].电子元器件应用,2004(1):39~42.
[5]      朱海君,刘彩虹,敬岚.智能控制芯片HD7279A及其应用设计[J].中国仪器仪表,2004,(3):36~37.
[6]      朱海君,敬岚,陆军. 基于MSC1210单片机的串口通讯设计[J].微计算机信息,2004,(4): 48~36.
[7]    朱海君,敬 岚,乔卫民.SDRAM控制器的设计及其在CSR控制系统中的应用[J].电气自动化,2004,26(Z04):43~44.

电脑版 Page created in 0.1719 seconds width 3 queries.