📄 main.c
字号:
/*
* $Revision: 1.0 $
*/
#include <stdio.h>
#include <string.h>
#include <inarm.h>
#include <iolpc2114.h>
#include "lpc221x.h"
#include "timer.h"
#include "flash_lpc.h"
#include "config.h"
#define FLASH_ERROR 0x01
#define RAM_ERROR 0x02
#define UART_ERROR 0x04
#define LED_ON IO0CLR |= 0x40000000
#define LED_OFF IO0SET |= 0x40000000
#define PULL_DOWN_P1 IO1CLR |= 0x02000000
#define PULL_UP_P1 IO1SET |= 0x02000000
#define PULL_UP_P0 IO0SET |= 0x20000000 //P0.29 is PULL_PIN for port0
#define PULL_DOWN_P0 IO0CLR |= 0x20000000
#define SET_TIME 1000
#define LED_TIME 3000000
#define TEST_NUMB 68
unsigned long CONST, compare;
unsigned char i,j;
void Delay (unsigned long a);
void LED_blink (unsigned char b);
const unsigned long RamTest [TEST_NUMB] = {
0xFFFFFFFF,
0xFFFFFFFE,
0xFFFFFFFC,
0xFFFFFFF8,
0xFFFFFFF0,
0xFFFFFFEF,
0xFFFFFFCF,
0xFFFFFF8F,
0xFFFFFF0F,
0xFFFFFEFF,
0xFFFFFCFF,
0xFFFFF8FF,
0xFFFFF0FF,
0xFFFFEFFF,
0xFFFFCFFF,
0xFFFF8FFF,
0xFFFF0FFF,
0xFFFEFFFF,
0xFFFCFFFF,
0xFFF8FFFF,
0xFFF0FFFF,
0xFFEFFFFF,
0xFFCFFFFF,
0xFF8FFFFF,
0xFF0FFFFF,
0xFEFFFFFF,
0xFCFFFFFF,
0xF8FFFFFF,
0xF0FFFFFF,
0xEFFFFFFF,
0xCFFFFFFF,
0x8FFFFFFF,
0x0FFFFFFF,
~0xFFFFFFFF,
~0xFFFFFFFE,
~0xFFFFFFFC,
~0xFFFFFFF8,
~0xFFFFFFF0,
~0xFFFFFFEF,
~0xFFFFFFCF,
~0xFFFFFF8F,
~0xFFFFFF0F,
~0xFFFFFEFF,
~0xFFFFFCFF,
~0xFFFFF8FF,
~0xFFFFF0FF,
~0xFFFFEFFF,
~0xFFFFCFFF,
~0xFFFF8FFF,
~0xFFFF0FFF,
~0xFFFEFFFF,
~0xFFFCFFFF,
~0xFFF8FFFF,
~0xFFF0FFFF,
~0xFFEFFFFF,
~0xFFCFFFFF,
~0xFF8FFFFF,
~0xFF0FFFFF,
~0xFEFFFFFF,
~0xFCFFFFFF,
~0xF8FFFFFF,
~0xF0FFFFFF,
~0xEFFFFFFF,
~0xCFFFFFFF,
~0x8FFFFFFF,
~0x0FFFFFFF,
0xAAAAAAAA,
0x55555555,
};
unsigned char sendByte(char byte)
{
while(!U0LSR_bit.THRE);
LPC210xUART0TxByte(byte);
return 1;
}
void sendMessage(char * byte)
{
for(;*byte;++byte)
{
sendByte(*byte);
}
}
unsigned char getByte(char *byte)
{
if(U0LSR_bit.DR)
{
*byte = U0RBR;
return 1;
}
return 0;
}
void Delay (unsigned long a)
{
while (--a!=0);
}
void LED_blink (unsigned char b)
{
unsigned char c;
IO0DIR=0x40000000;
IO1DIR=0;
for (c=0;c!=b;c++){
LED_OFF; //LED off
Delay(LED_TIME);
LED_ON; //LED off
Delay(LED_TIME);
}
while(1);
}
unsigned int led = 0, id;
unsigned long* pAdd;
void main(void)
{
unsigned long i,j = 0;
unsigned long hold;
unsigned int error_status;
char byte;
char Message[256];
FLASH_DEV_MANUFACTURER_ID_DEF FlashDevManID = UNKNOW_MAN_ID;
T0TC = 0;
// System initialization, this will map the exception vectors.
LPC210xSystemInit();
// Set up peripheral registers.
LPC210xInitPIO();
// First disable interrupts.
__disable_interrupt();
// Setup interrupt controller.
LPC210xInitVIC();
// Periodic timer initialization.
LPC210xInitTimer();
// LPC210xInitTimerInterrupt(TimerBeat);
//Set up UART
LPC210xInitUART0();
// Enable interrupts.
__enable_interrupt();
// Start periodic timer.
LPC210xStartTimer();
// Init error status
error_status = 0;
// Ram memory test
sendMessage(" *** SRAM Tests ***\n\r");
sendMessage("SRAM Write\n\r");
#if TRACE_ENA
printf(" *** SRAM Tests ***\n");
printf("SRAM Write\n");
#endif
for(i=0, pAdd=(unsigned long *)SRAM_BASE; pAdd < (unsigned long *)SRAM_BASE+SRAM_SIZE/4; ++pAdd,++i)
{
*pAdd = i;
}
sendMessage("SRAM Write Pass\n\r");
sendMessage("SRAM Address Bus Verify\n\r");
#if TRACE_ENA
printf("%s","SRAM Write Pass\n");
printf("%s","SRAM Address Bus Verify\n");
#endif
for(i=0, pAdd=(unsigned long *)SRAM_BASE; pAdd < (unsigned long *)SRAM_BASE+SRAM_SIZE/4; ++pAdd,++i)
{
if (*pAdd != i)
break;
}
if (pAdd >= (unsigned long *)SRAM_BASE+SRAM_SIZE/4)
{
sendMessage("SRAM Adderss Bus Verify Pass\n\r");
#if TRACE_ENA
printf("%s","SRAM Adderss Bus Verify Pass\n");
#endif
}
else
{
sprintf(Message,"%s %#x %s","SRAM Address Bus Write Fault at address - ",pAdd,"\n\r");
sendMessage(Message);
#if TRACE_ENA
printf("SRAM Address Bus Write Fault at address - ",pAdd,'\n');
#endif
error_status |= RAM_ERROR;
}
if((error_status & RAM_ERROR) == 0)
{
sendMessage("SRAM Data Bus Verify\n\r");
#if TRACE_ENA
printf("%s","SRAM Data Bus Verify\n");
#endif
for(i=TEST_NUMB, pAdd=(unsigned long *)SRAM_BASE; i; --i)
{
*pAdd = RamTest[i];
if (*pAdd != RamTest[i])
break;
}
if (i == 0)
{
sendMessage("SRAM Data Bus Verify Pass\n\r");
#if TRACE_ENA
printf("%s","SRAM Data Bus Verify Pass\n");
#endif
}
else
{
sendMessage("SRAM Data Bus Verify Fault\n\r");
}
}
// Flash memory test
sendMessage(" *** Flash Tests ***\n\r");
sendMessage("Read manufacturer\n\r");
#if TRACE_ENA
printf(" *** Flash Tests ***\n");
printf("Read manufacturer\n");
#endif
id = FlashID((unsigned short*)(FLASH_BASE)+MANUFACTURER_ID);
if (id == 0x0089)
{
sendMessage("Intel flash device is find\n\r");
#if TRACE_ENA
printf("Intel flash device is find\n");
#endif
// Set flash man. type
FlashDevManID = INTEL_MAN_ID;
}
else if (id == 0x00C2)
{
sendMessage("MXIC flash device is find\n\r");
#if TRACE_ENA
printf("MXIC flash device is find\n");
#endif
// Set flash man. type
FlashDevManID = MXID_MAN;
}
else
{
sprintf(Message,"%s %#x %s","Unknow manufacturer flash device is find",id,"\n\r");
sendMessage(Message);
#if TRACE_ENA
printf("%s %#x %c","Unknow manufacturer flash device is find",id,'\n');
#endif
}
// Read type of flash memory
sendMessage("Read type of chip\n\r");
#if TRACE_ENA
printf("Read type of chip\n");
#endif
id = FlashID((unsigned short*)(FLASH_BASE)+DEVICE_ID);
if (id == 0x88C5)
{
sendMessage("TE28F320C3Bxxx\n\r");
#if TRACE_ENA
printf("TE28F320C3Bxxx\n");
#endif
}
else if (id == 0x225B)
{
sendMessage("MX26LV800Bxxx\n\r");
#if TRACE_ENA
printf("TE28F320C3Bxxx\n");
#endif
}
else
{
sprintf(Message,"%s %#x %s","Unknow type flash device is find",id,"\n\r");
sendMessage(Message);
#if TRACE_ENA
printf("%s %#x %c","Unknow type flash device is find",id,'\n');
#endif
FlashDevManID = UNKNOW_MAN_ID;
}
if (FlashDevManID != UNKNOW_MAN_ID)
{
sendMessage("Flash Erase\n\r");
#if TRACE_ENA
printf("Flash Erase\n");
#endif
for(i=8, pAdd=(unsigned long *)FLASH_BASE; pAdd < (unsigned long *)FLASH_BASE+FLASH_SIZE/4; pAdd += FLASH_BLOCK/4,++i)
{
LPC210xLedSet(++j&1);
if (Flash_Erase_Block(pAdd,FlashDevManID) != PASS)
break;
}
if (pAdd >= (unsigned long *)FLASH_BASE+FLASH_SIZE/4)
{
sendMessage("Flash Erase Pass\n\r");
#if TRACE_ENA
printf("%s","Flash Erase Pass\n");
#endif
}
else
{
sprintf(Message,"%s %d %s","Erase Block - ",i,"\n\r");
sendMessage(Message);
sendMessage("Flash Erase fault\n\r");
#if TRACE_ENA
printf("%s %d %c","Erase Block - ",i,'\n');
printf("%s","Flash Erase fault\n");
#endif
error_status |= FLASH_ERROR;
}
if ((error_status & FLASH_ERROR) == 0)
{
sendMessage("Flash Write\n\r");
#if TRACE_ENA
printf("%s","Flash Write\n");
#endif
for(i=0, pAdd=(unsigned long *)FLASH_BASE; i < FLASH_SIZE/4; ++pAdd,++i)
{
if ((i & 0x1FFF) == 0)
LPC210xLedSet(++j&1);
if (Flash_Write_Word(pAdd,i,FlashDevManID) != PASS)
break;
}
if (pAdd >= (unsigned long *)FLASH_BASE+FLASH_SIZE/4)
{
sendMessage("Flash Write Pass\n\r");
#if TRACE_ENA
printf("%s","Flash Write Pass\n");
#endif
}
else
{
sprintf(Message,"%s %#x %s","Flash Write Fault at address - ",pAdd,"\n\r");
sendMessage(Message);
#if TRACE_ENA
printf("%s %#x %c","Flash Write Fault at address - ",pAdd,'\n');
#endif
error_status |= FLASH_ERROR;
}
if ((error_status & FLASH_ERROR) == 0)
{
sendMessage("Flash Verify Data\n\r");
#if TRACE_ENA
printf("%s","Flash Verify Data\n");
#endif
for(i=0, pAdd=(unsigned long *)FLASH_BASE; i < FLASH_SIZE/4; ++pAdd,++i)
{
hold = *pAdd;
if (hold != i)
break;
if ((i & 0x1FFF) == 0)
LPC210xLedSet(++j&1);
}
if (pAdd >= (unsigned long *)FLASH_BASE+FLASH_SIZE/4)
{
sendMessage("Flash Verify Pass\n\r");
#if TRACE_ENA
printf("%s","Flash Verify Pass\n");
#endif
}
else
{
sprintf(Message,"%s %#x %s","Flash Verify Fault at address - ",pAdd,"\n\r");
sendMessage(Message);
#if TRACE_ENA
printf("%s %#x %c","Flash Verify Fault at address - ",pAdd,'\n');
#endif
error_status |= FLASH_ERROR;
}
}
}
}
else
{
sendMessage("Unknow type flash device is find. Test fault");
error_status |= FLASH_ERROR;
}
sendMessage(" *** UART Tests ***\n\r");
sendMessage("Press key '1' \n\r");
#if TRACE_ENA
printf(" *** UART Tests ***\n");
printf("Press key '1' \n");
#endif
error_status |= UART_ERROR;
LPC210xLedSet(0);
// Loop forever.
for (;;)
{
if(getByte(&byte))
{
while(!sendByte(byte)); //Echo byte
if (byte == '1')
error_status &= ~UART_ERROR;
while(!sendByte('*')); //Send *
}
if (error_status)
LPC210xLedSet(0);
else
{
LPC210xLedSet(led&1);
}
Sleep(65); // Display for 65 ms.
++led;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -