靜態(tài)存儲(chǔ)器 SRAM即Static random access memory,它是一種具有靜止存取功能的內(nèi)存,不需要刷新電路即能保存它內(nèi)部存儲(chǔ)的數(shù)據(jù)。ATmega8515單片機(jī)內(nèi)部含有512字節(jié)的SRAM,應(yīng)該說(shuō)可以滿足一般的應(yīng)用了,但是如果要存儲(chǔ)大量的數(shù)據(jù),就有點(diǎn)麻煩了,比如存儲(chǔ)圖像,或處理從網(wǎng)絡(luò)傳過(guò)的的數(shù)據(jù)或多路傳感器采集過(guò)的數(shù)據(jù)等,都要有個(gè)臨時(shí)的地方來(lái)存儲(chǔ),而內(nèi)部的又不夠用,所以只有加外部的了。今天懶貓就學(xué)習(xí)一下外部的SRAM,而ATmega8515提供了三總線(CA-控制總線,AB-地址總線,DB數(shù)據(jù)總線)用以擴(kuò)展外部?jī)?nèi)存或接口,所以操作起來(lái)非常方便。
今天測(cè)試電路中采用的SRAM是HM62256B芯片,它是一個(gè)8位32KB容量的靜態(tài)存儲(chǔ)器芯片。具體的芯片資料你可以參看62256的datasheet,如果你沒(méi)有應(yīng)用外部擴(kuò)展總線,寫程序時(shí)注意它的讀寫時(shí)序。電路中74LS373做為地址鎖存器連接在PA口,它的鎖存全能腳LE(Latch Enable)連接在單片機(jī)的ALE(Address Latch Enable 地址鎖存使能)。單片機(jī)的讀寫控制引腳RD、WR與62256的OE(Output Enable,輸出使能)、WE(Write Enable,寫使能)連接,負(fù)責(zé)地址的鎖存及讀寫操作。這次測(cè)試的電路功能主要有向62256中寫入250個(gè)數(shù)據(jù),然后從62256中讀出這250個(gè)數(shù)據(jù),并發(fā)送的模擬終端顯示出來(lái),具體的電路原理圖參看文檔的最后面。
關(guān)于軟件方面,涉及到單片機(jī)內(nèi)部的寄存器主要有MCU控制寄存器MCUCR、外部MCU控制寄存器EMCUCR及特殊功能IO寄存器SFIOR。關(guān)于這些寄存器的功能,可以參考ATmega8515的數(shù)據(jù)手冊(cè),上面有詳細(xì)的介紹。
好了,下面貼出程序
一、main.h 里面主要是一些頭文件的包含、一些宏定義及串口的一些程序
[code="CPP"]
/**************************************************************************
//文件名稱:main.h
//功 能:初始化單片機(jī)
//作 者:懶貓愛飛
//建立日期:2010.11.05
//備 注:MCU-ATmega8515 開發(fā)環(huán)境-winavr100110 Crystal-8MHz
**************************************************************************/
#ifndef _MAIN_H_
#define _MAIN_H_
#include <avr/io.h>
#include <inttypes.h> //關(guān)于數(shù)據(jù)類型的一些定義
#include <stdint.h> //同樣是一些數(shù)據(jù)類型的定義
#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) //點(diǎn)亮LED燈
#define LED_OFF() PORTB |= _BV(PB7) //熄滅LED燈
/*************************************************************************
//函數(shù)名稱:void port_init(void)
//功 能:端口初始化
//入口參數(shù):NULL
//出口參數(shù):NULL
//備 注:NULL
**************************************************************************/
void port_init(void)
{
DDRB = 0x81; //PB0--Buzzer,PB7--Led
PORTB = 0x80; //關(guān)閉蜂鳴器與LED燈
}
/*************************************************************************
//函數(shù)名稱:void Beep_Play(void)
//功 能:蜂鳴器蜂鳴程序
//入口參數(shù):NULL
//出口參數(shù):NULL
//備 注:NULL
**************************************************************************/
void Beep_Play(void)
{
int8_t cunt = 0;
for(cunt=0; cunt<50; cunt++)
{
Beep_Ring(); //連續(xù)響50次
_delay_ms(1);
}
}
/**************************************************************************
//函數(shù)名稱:void usart_init(void)
//功 能:串口初始化
//入口參數(shù):NULL
//出口參數(shù):NULL
//備 注:NULL
**************************************************************************/
void usart_init(void)
{
UCSRB |= _BV(TXEN); //發(fā)送使能
UCSRC |= _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); //82位數(shù)據(jù)位,1位停止位
//波特率設(shè)置為9600 用8M的晶振會(huì)有0.2%的誤差
//想精確一點(diǎn)可以改變波特或晶振,9600時(shí)用11.0592精度最高
UBRRL = (F_CPU/9600/16-1)%256;
UBRRH = (F_CPU/9600/16-1)/256;
}
/*************************************************************************
//函數(shù)名稱:void send_char(uint8_t c)
//功 能:發(fā)送一個(gè)字符
//入口參數(shù):c
//出口參數(shù):NULL
//備 注:NULL
**************************************************************************/
void send_char(uint8_t c)
{
if(c == '\n')
{
send_char('\r');
}
UDR = c;
while(!(UCSRA & _BV(UDRE))); //等待發(fā)送完畢
}
/*************************************************************************
//函數(shù)名稱:void send_str(uint8_t *s)
//功 能:發(fā)送字符串
//入口參數(shù):*s
//出口參數(shù):NULL
//備 注:NULL
**************************************************************************/
void send_str(uint8_t *s)
{
while(*s)
{
send_char(*s++);
}
}
#endif
[/code]
二、main.c 主要的處理程序
[code="CPP"]
/******************************************************************************
//文件名稱:main.c
//功 能:學(xué)習(xí)使用單片機(jī)外部擴(kuò)展的內(nèi)存
//作 者:懶貓愛飛
//建立日期:2010.11.05
//備 注:MCU-ATmega8515 開發(fā)環(huán)境-winavr100110 Crystal-8MHz
******************************************************************************/
#include "main.h"
//定義外部地址,因?yàn)?2256有15位地址線
#define EXTERN_ADDR (volatile uint8_t*)0x8000
/******************************************************************************
//函數(shù)名稱:int main(void)
//功 能:主函數(shù)
//入口參數(shù):NULL
//出口參數(shù):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();
//雙顯示字符雙顯示數(shù)字,貌似模擬終端上顯示效果不太好-,-
//send_str("Send the data to the visual terminal:\n");
//send_str ("Please watch the visual terminal II \n");
//把寫入的數(shù)據(jù)發(fā)送到模擬終端顯示出來(lái)
for(i=0; i<250; i++)
{
extern_data = *(EXTERN_ADDR+i);
send_char(extern_data);
}
LED_OFF(); //發(fā)送完畢,燈關(guān)閉
Beep_Play(); //讀寫操作結(jié)束
while(1);
return 0;
}
[/code]
因?yàn)槭褂昧藬U(kuò)展總線的功能 ,所以程序不是太難,如果你想復(fù)雜一點(diǎn),可以不用外部擴(kuò)展總線功能,自己重新連線。