原创 AVR学习日志(五十)—学习使用外部SRAM

2010-11-5 14:54 5511 9 12 分类: MCU/ 嵌入式

        


       静态存储器 SRAM即Static random access memory,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。ATmega8515单片机内部含有512字节的SRAM,应该说可以满足一般的应用了,但是如果要存储大量的数据,就有点麻烦了,比如存储图像,或处理从网络传过的的数据或多路传感器采集过的数据等,都要有个临时的地方来存储,而内部的又不够用,所以只有加外部的了。今天懒猫就学习一下外部的SRAM,而ATmega8515提供了三总线(CA-控制总线,AB-地址总线,DB数据总线)用以扩展外部内存或接口,所以操作起来非常方便。


        今天测试电路中采用的SRAM是HM62256B芯片,它是一个8位32KB容量的静态存储器芯片。具体的芯片资料你可以参看62256的datasheet,如果你没有应用外部扩展总线,写程序时注意它的读写时序。电路中74LS373做为地址锁存器连接在PA口,它的锁存全能脚LE(Latch Enable)连接在单片机的ALE(Address Latch Enable 地址锁存使能)。单片机的读写控制引脚RD、WR与62256的OE(Output Enable,输出使能)、WE(Write Enable,写使能)连接,负责地址的锁存及读写操作。这次测试的电路功能主要有向62256中写入250个数据,然后从62256中读出这250个数据,并发送的模拟终端显示出来,具体的电路原理图参看附件。


        关于软件方面,涉及到单片机内部的寄存器主要有MCU控制寄存器MCUCR、外部MCU控制寄存器EMCUCR及特殊功能IO寄存器SFIOR。关于这些寄存器的功能,可以参考ATmega8515的数据手册,上面有详细的介绍。


     好了,下面贴出程序


一、main.h 里面主要是一些头文件的包含、一些宏定义及串口的一些程序


/**************************************************************************


//文件名称:main.h


//功    能:初始化单片机


//作    者:懒猫爱飞


//建立日期:2010.11.05


//备    注:MCU-ATmega8515 开发环境-winavr100110  Crystal-8MHz


**************************************************************************/


#ifndef _MAIN_H_


#define _MAIN_H_


 


#include <avr/io.h>


#include <inttypes.h> //关于数据类型的一些定义


#include <stdint.h>    //同样是一些数据类型的定义


#include <avr/interrupt.h>


#include <util/delay.h>


#include <avr/eeprom.h>


#include <stdlib.h>


 


#define F_CPU       8000000UL         //8M晶振


 


#define Beep_Ring() PORTB ^= _BV(PB0) //Buzzer 连接在B端口的第1脚


 


#define LED_ON()    PORTB &= ~_BV(PB7) //点亮LED灯


#define LED_OFF()   PORTB |= _BV(PB7) //熄灭LED灯


 


/*************************************************************************


//函数名称:void port_init(void)


//功    能:端口初始化


//入口参数:NULL


//出口参数:NULL


//备    注:NULL


**************************************************************************/


void port_init(void)


{


    DDRB  = 0x81; //PB0--Buzzer,PB7--Led


    PORTB = 0x80; //关闭蜂鸣器与LED灯


}


 


/*************************************************************************


//函数名称:void Beep_Play(void)


//功    能:蜂鸣器蜂鸣程序


//入口参数:NULL


//出口参数:NULL


//备    注:NULL


**************************************************************************/


void Beep_Play(void)


{


    int8_t cunt = 0;


    for(cunt=0; cunt<50; cunt++)


    {


        Beep_Ring();      //连续响50次


        _delay_ms(1);


    }


}


 


/**************************************************************************


//函数名称:void usart_init(void)


//功    能:串口初始化


//入口参数:NULL


//出口参数:NULL


//备    注:NULL


**************************************************************************/


void usart_init(void)


{


    UCSRB |= _BV(TXEN); //发送使能


    UCSRC |= _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); //82位数据位,1位停止位


     //波特率设置为9600 用8M的晶振会有0.2%的误差


     //想精确一点可以改变波特或晶振,9600时用11.0592精度最高 


    UBRRL  = (F_CPU/9600/16-1)%256;


    UBRRH  = (F_CPU/9600/16-1)/256;


}


 


/*************************************************************************


//函数名称:void send_char(uint8_t c)


//功    能:发送一个字符


//入口参数:c


//出口参数:NULL


//备    注:NULL


**************************************************************************/


void send_char(uint8_t c)


{


    if(c == '\n')


    {


        send_char('\r');


    }


    UDR = c;


    while(!(UCSRA & _BV(UDRE))); //等待发送完毕


}


 


/*************************************************************************


//函数名称:void send_str(uint8_t *s)


//功    能:发送字符串


//入口参数:*s


//出口参数:NULL


//备    注:NULL


**************************************************************************/    


void send_str(uint8_t *s)


{


    while(*s)


    {


        send_char(*s++);


    }


}


 


#endif


二、main.c 主要的处理程序


    /******************************************************************************


//文件名称:main.c


//功    能:学习使用单片机外部扩展的内存


//作    者:懒猫爱飞


//建立日期:2010.11.05


//备    注:MCU-ATmega8515 开发环境-winavr100110  Crystal-8MHz


******************************************************************************/


#include "main.h"


 


//定义外部地址,因为62256有15位地址线


#define EXTERN_ADDR (volatile uint8_t*)0x8000 


 


/******************************************************************************


//函数名称:int main(void)


//功    能:主函数


//入口参数:NULL


//出口参数:NULL


//备    注:NULL


******************************************************************************/


int main(void)


{


    uint8_t i;


    uint8_t extern_data = 0;


 


    port_init();


    usart_init();


   


    MCUCR |= 0x80;


 


    LED_ON();


    Beep_Play(); //写操作开始


 


    for(i=0;i<250; i++)


    {


        *(EXTERN_ADDR+i) = i;


    }


 


    //MCUCR = 0;


    //LED_OFF();


   


    //双显示字符双显示数字,貌似模拟终端上显示效果不太好-,-


    //send_str("Send the data to the visual terminal:\n");


    //send_str ("Please watch the visual terminal II \n"); 


 


    //把写入的数据发送到模拟终端显示出来


    for(i=0; i<250; i++)


    {


        extern_data = *(EXTERN_ADDR+i);


        send_char(extern_data);


    }


 


    LED_OFF(); //发送完毕,灯关闭


    Beep_Play(); //读写操作结束


 


    while(1);


 


    return 0;


}


 


因为使用了扩展总线的功能 ,所以程序不是太难,如果你想复杂一点,可以不用外部扩展总线功能,自己重新连线。


呵呵,好了,今天先到这吧,明天继续……


再喊一下口号,鼓励一下自己:


每天进步一点点,开心多一点^_^

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1588142 2011-4-27 18:50

mark!

用户307737 2011-3-8 11:30

文章写的挺好的 我刚遇到这样的问题 谢谢分享

huotingtu_505472073 2010-11-6 00:27

跟着楼主来啊
相关推荐阅读
xucun915_925777961 2013-04-28 11:31
毕业后的五年拉开大家差距的原因在哪里?【转】
  有人工作,有人继续上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我有很大启迪,这篇文章将会改变我的一生,真的太好了,希望与有缘人分享,也希望对有缘人有所帮助!...
xucun915_925777961 2013-03-31 20:28
职场大牛精彩总结:职场上,如何做人做事做管理【转】(文/张子阳)
      大道至简,越是根源和基本的问题,道理实际上越简单。关于如何做人、做事、做管理的书很多,我看得不多,但是我觉得这些书更多是侧重技术和实现细节上的,而很少从人的思想和观念去讲。实际...
xucun915_925777961 2013-03-28 14:03
介绍几种优秀的UML工具
统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言...
xucun915_925777961 2013-03-27 18:05
IAR EW FOR 8051 修改工程名称的方法
        近段时间一直在搞蓝牙4.0的开发任务,所以用到了IAR编译器,话说IAR编译器用途蛮广,可以编译MSP430,ARM,还有TI的51核芯片,当然,这要不同的版本,我现在用的是for...
xucun915_925777961 2013-03-26 16:40
Cortex-M3学习日志(八)-- TFT实验Part(a)
    自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。 我的开发板上的液晶屏的用的是SPI接口,当...
xucun915_925777961 2013-03-25 20:48
说说那几款查看源代码的工具
说说那几款查看代码的工具 今天给大家介绍几款单片机工程师所喜欢的几款查看源代码的工具,这几款工具在懒猫的日常工作中可是帮了不少忙。 一、 Source Insight     Source Insig...
EE直播间
更多
我要评论
3
9
关闭 站长推荐上一条 /1 下一条