ex_mem_sample.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 220 行
C
220 行
/**********************************************************************************/
/* */
/* Copyright (C) 2005 Oki Electric Industry Co., LTD. */
/* */
/* System Name : ML674051/ML674061 series */
/* Module Name : Connection with external SRAM/ROM */
/* File Name : ext_mem_sample.c */
/* Revision : 01.00 */
/* Date : 2005/02/17 */
/* */
/**********************************************************************************/
#include "ML674061.h"
#include "common.h"
/* definition of constants */
#define SRAM_BASE (0xD0000000) /* base address of external SRAM */
#define SRAM_SIZE (0x80000) /* size of external SRAM : 512kbyte */
#define SRAM_TOP ((void*)(SRAM_BASE+SRAM_SIZE)) /* top address of
external SRAM */
/* functions */
void setup_ext_sram_rom(void);
UHWORD read_write_check(void);
UHWORD read_write_check_byte(void);
UHWORD read_write_check_hword(void);
UHWORD read_write_check_word(void);
void IRQ_Handler(void){} /* this handler isn't used in this sample. */
const UHWORD LED_PATTERN[16] = {0x003F, 0x0006, 0x005B, 0x004F, /* 0, 1, 2, 3, */
0x0066, 0x006D, 0x007D, 0x0027, /* 4, 5, 6, 7, */
0x007F, 0x006F, 0x0077, 0x007C, /* 8, 9, A, b, */
0x0039, 0x005E, 0x0079, 0x0071};/* C, d, E, F */
/****************************************************************************/
/* Entry point */
/* Function : main */
/* Parameters */
/* Input : Nothing */
/* Output : 0 */
/****************************************************************************/
int main(void)
{
UHWORD led_pattern;
/* setup external SRAM/ROM */
setup_ext_sram_rom();
/* LED on */
init_led(); /* output mode */
led_on(LED_START_PATTERN);
led_pattern = read_write_check(); /* read/write check */
led_on((UBYTE)led_pattern);
return 0;
}
/****************************************************************************/
/* Setup of external SRAM/ROM */
/* Function : setup_ext_sram_rom */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/****************************************************************************/
void setup_ext_sram_rom(void)
{
/* setup of bus width control register (BWC@0x7810_0000) */
put_wvalue(BWC, (get_wvalue(BWC) | 0x30)); /* setup of bus width
ROM : default (depend on switch setting)
SRAM : 32bits.
IO0/IO1 : nothing */
/* setup of ROM access control register (ROMAC@0x7810_0004) */
put_wvalue(ROMAC, 0x7); /* OE/WE pulse width:8, read off time:4 (slowest) */
/* setup of SRAM access control register (RAMAC@0x7810_0008) */
put_wvalue(RAMAC, 0x7); /* OE/WE pulse width:8, read off time:4 (slowest) */
return;
}
/****************************************************************************/
/* Write data to all the ranges of external SRAM and */
/* values of all the ranges of external SRAM is read and compared. */
/* Write patterns are '00', '55', 'AA' and 'FF'. */
/* Read/Write sizes are 8bits, 16bits and 32bits. */
/* Function : read_write_check */
/* Parameters */
/* Input : Nothing */
/* Output : LED pattern */
/* LED_NORMAL_END_PATTERN -> Narmal end. */
/* others -> Error occurred */
/****************************************************************************/
UHWORD read_write_check(void)
{
UHWORD led_pattern;
/* BYTE access check */
if((led_pattern = read_write_check_byte()) != LED_NORMAL_END_PATTERN){
return led_pattern;
}
/* HWORD access check */
else if((led_pattern = read_write_check_hword()) != LED_NORMAL_END_PATTERN){
return led_pattern;
}
/* WORD access check */
else if((led_pattern = read_write_check_word()) != LED_NORMAL_END_PATTERN){
return led_pattern;
}
return led_pattern; /* led_pattern == LED_NORMAL_END_PATTERN */
}
/****************************************************************************/
/* Write data to all the ranges of external SRAM and */
/* values of all the ranges of external SRAM is read and compared. */
/* Write patterns are '00', '55', 'AA' and 'FF'. */
/* Read/Write size is 8bits. */
/* Function : read_write_check_byte */
/* Parameters */
/* Input : Nothing */
/* Output : LED pattern */
/* LED_NORMAL_END_PATTERN -> Narmal end. */
/* others -> Error occurred */
/****************************************************************************/
UHWORD read_write_check_byte(void)
{
int i;
UBYTE write_pattern[] = {0x00, 0x55, 0xAA, 0xFF}; /* writing patterns */
UBYTE *address; /* address of read/write area */
for(i=0; i<4; i++){
/* write data to all region of external SRAM */
for(address=(UBYTE*)SRAM_BASE; address<(UBYTE*)SRAM_TOP; address++){
put_value(address, write_pattern[i]);
}
/* check data of all region of external SRAM */
for(address=(UBYTE*)SRAM_BASE; address<(UBYTE*)SRAM_TOP; address++){
if(get_value(address) != write_pattern[i]){ /* check data */
/* error occurred */
return LED_PATTERN[i]; /* return LED pattern */
}
}
}
return LED_NORMAL_END_PATTERN;
}
/****************************************************************************/
/* Write data to all the ranges of external SRAM and */
/* values of all the ranges of external SRAM is read and compared. */
/* Write patterns are '0000', '5555', 'AAAA' and 'FFFF'. */
/* Read/Write size is 16bits. */
/* Function : read_write_check_hword */
/* Parameters */
/* Input : Nothing */
/* Output : LED pattern */
/* LED_NORMAL_END_PATTERN -> Narmal end. */
/* others -> Error occurred */
/****************************************************************************/
UHWORD read_write_check_hword(void)
{
int i;
UHWORD write_pattern[] = {0x0000, 0x5555, 0xAAAA, 0xFFFF}; /* writing patterns */
UHWORD *address; /* address of read/write area */
for(i=0; i<4; i++){
/* write data to all region of external SRAM */
for(address=(UHWORD*)SRAM_BASE; address<(UHWORD*)SRAM_TOP; address++){
put_hvalue(address, write_pattern[i]);
}
/* check data of all region of external SRAM */
for(address=(UHWORD*)SRAM_BASE; address<(UHWORD*)SRAM_TOP; address++){
if(get_hvalue(address) != write_pattern[i]){ /* check data */
/* error occurred */
return LED_PATTERN[i+4]; /* return LED pattern */
}
}
}
return LED_NORMAL_END_PATTERN;
}
/****************************************************************************/
/* Write data to all the ranges of external SRAM and */
/* values of all the ranges of external SRAM is read and compared. */
/* Write patterns are '00000000', '55555555', 'AAAAAAAA' and 'FFFFFFFF'. */
/* Read/Write size is 32bits. */
/* Function : read_write_check_word */
/* Parameters */
/* Input : Nothing */
/* Output : LED pattern */
/* LED_NORMAL_END_PATTERN -> Narmal end. */
/* others -> Error occurred */
/****************************************************************************/
UHWORD read_write_check_word(void)
{
int i;
UWORD write_pattern[] = {0x00000000, 0x55555555,
0xAAAAAAAA, 0xFFFFFFFF}; /* writing patterns */
UWORD *address; /* address of read/write area */
for(i=0; i<4; i++){
/* write data to all region of external SRAM */
for(address=(UWORD*)SRAM_BASE; address<(UWORD*)SRAM_TOP; address++){
put_wvalue(address, write_pattern[i]);
}
/* check data of all region of external SRAM */
for(address=(UWORD*)SRAM_BASE; address<(UWORD*)SRAM_TOP; address++){
if(get_wvalue(address) != write_pattern[i]){ /* check data */
/* error occurred */
return LED_PATTERN[i+8]; /* return LED pattern */
}
}
}
return LED_NORMAL_END_PATTERN;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?