注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
四蹄踏雪II号的个人空间 https://home.eeworld.com.cn/space-uid-224269.html [收藏] [复制] [分享] [RSS]
日志

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

已有 2697 次阅读2010-11-5 15:33 |个人分类:AVR学习日志|

EXTERN_SRAM_WR

作者:懒猫爱飞

2010-11-5

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

     今天测试电路中采用的SRAMHM62256B芯片,它是一个832KB容量的静态存储器芯片。具体的芯片资料你可以参看62256datasheet,如果你没有应用外部扩展总线,写程序时注意它的读写时序。电路中74LS373做为地址锁存器连接在PA口,它的锁存全能脚LELatch Enable)连接在单片机的ALE(Address Latch Enable 地址锁存使能)。单片机的读写控制引脚RDWR62256OEOutput 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"

 

//定义外部地址,因为6225615位地址线

#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;

}

 

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

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

 

 

 

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

 

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

 

 

发表评论 评论 (1 个评论)
回复 鑫海宝贝 2010-11-9 08:24

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章