基于MSP430F149单片机的SDRAM控制程序设计 点击:353 | 回复:0



sinap_zhj

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 1回
  • 年度积分:0
  • 历史总积分:184
  • 注册:2014年7月31日
发表于:2014-11-13 09:51:05
楼主

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系统的控制主芯片。

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

软件设计

   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[i] = 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[i];

              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;

}

结语

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

 



热门招聘
相关主题

官方公众号

智造工程师