Quick but comprehensive memory test for the LPC4088's 32MB of SDRAM. The demonstration program executes a single test pass, though it can be easily modified for multiple passes. If a memory error is detected, the test stops immediately and displays failed results. A single pass is performed in less than one second and every memory location contains unique data.

Dependencies:   EALib mbed

Committer:
loopsva
Date:
Tue Dec 31 18:04:26 2013 +0000
Revision:
1:b2b9d3920781
Parent:
0:947ff5fa24c6
Moved the memory test out of SDRAM initialization and into main() for user clarification.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:947ff5fa24c6 1 #include "mbed.h"
loopsva 0:947ff5fa24c6 2 #include "sdram.h"
loopsva 0:947ff5fa24c6 3
loopsva 0:947ff5fa24c6 4 Serial pc(USBTX, USBRX); //Serial USB communications over mbed USB port
loopsva 0:947ff5fa24c6 5 DigitalOut led1(LED1);
loopsva 0:947ff5fa24c6 6
loopsva 0:947ff5fa24c6 7 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:947ff5fa24c6 8 //Test the SDRAM array with pseudo-random data
loopsva 0:947ff5fa24c6 9 //memory size = 0x00800000 (8388608 locations * 4 bytes wide = 33.554432 MB
loopsva 0:947ff5fa24c6 10
loopsva 0:947ff5fa24c6 11 #define DRAMBASEADDR 0xa0000000
loopsva 0:947ff5fa24c6 12 #define DRAMSIZE 0x00800000
loopsva 0:947ff5fa24c6 13
loopsva 0:947ff5fa24c6 14 int testSDRAM(uint32_t seed) {
loopsva 0:947ff5fa24c6 15 volatile uint32_t * const ramBaseAddr = (uint32_t *) DRAMBASEADDR;
loopsva 0:947ff5fa24c6 16 uint32_t lfsr = seed;
loopsva 0:947ff5fa24c6 17 uint32_t offsAddr = 0;
loopsva 0:947ff5fa24c6 18
loopsva 0:947ff5fa24c6 19 //Fill all memory with pseudo-random data
loopsva 0:947ff5fa24c6 20 pc.printf(" - Filling all memory, starting with PR seed 0x%08x... ", lfsr);
loopsva 0:947ff5fa24c6 21 for(offsAddr = 0; offsAddr < DRAMSIZE; offsAddr += 4) {
loopsva 0:947ff5fa24c6 22 lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xD0000001u);
loopsva 0:947ff5fa24c6 23 ramBaseAddr[offsAddr] = lfsr;
loopsva 0:947ff5fa24c6 24 }
loopsva 0:947ff5fa24c6 25
loopsva 0:947ff5fa24c6 26 //force error at highest memory location
loopsva 0:947ff5fa24c6 27 //ramBaseAddr[0x007ffffc] = 0x12345678;
loopsva 0:947ff5fa24c6 28
loopsva 0:947ff5fa24c6 29 //Now compare all that has been written
loopsva 0:947ff5fa24c6 30 pc.printf("done\r\n - Comparing all memory locations... ");
loopsva 0:947ff5fa24c6 31 lfsr = seed;
loopsva 0:947ff5fa24c6 32 for(offsAddr = 0; offsAddr < DRAMSIZE; offsAddr += 4) {
loopsva 0:947ff5fa24c6 33 lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xD0000001u);
loopsva 0:947ff5fa24c6 34 if(ramBaseAddr[offsAddr] != lfsr) {
loopsva 0:947ff5fa24c6 35 pc.printf("\r\n### Memory compare error!!! addr: %08x sent: %08x recvd: %08x\r\n", offsAddr + DRAMBASEADDR, lfsr, ramBaseAddr[offsAddr]);
loopsva 0:947ff5fa24c6 36 return -1;
loopsva 0:947ff5fa24c6 37 }
loopsva 0:947ff5fa24c6 38 }
loopsva 0:947ff5fa24c6 39
loopsva 0:947ff5fa24c6 40 //print first DRAM locations
loopsva 0:947ff5fa24c6 41 pc.printf("done\r\n");
loopsva 0:947ff5fa24c6 42
loopsva 0:947ff5fa24c6 43 //Option to print out first few locations of SDRAM
loopsva 0:947ff5fa24c6 44 //for(offsAddr = 0; offsAddr < 1024; offsAddr += 16) {
loopsva 0:947ff5fa24c6 45 // pc.printf("addr: %08x 0: %08x 4: %08x 8: %08x c: %08x\r\n", DRAMBASEADDR + offsAddr, ramBaseAddr[offsAddr],
loopsva 0:947ff5fa24c6 46 // ramBaseAddr[offsAddr + 4], ramBaseAddr[offsAddr + 8], ramBaseAddr[offsAddr + 12]);
loopsva 0:947ff5fa24c6 47 //}
loopsva 0:947ff5fa24c6 48 return 0;
loopsva 0:947ff5fa24c6 49 }
loopsva 0:947ff5fa24c6 50
loopsva 0:947ff5fa24c6 51 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:947ff5fa24c6 52 //Initialize the 32MB SDRAM and test it.
loopsva 0:947ff5fa24c6 53
loopsva 0:947ff5fa24c6 54 #define ONEMBDRAMSIZE (1024*1024)
loopsva 0:947ff5fa24c6 55
loopsva 0:947ff5fa24c6 56 int alloccount = 0;
loopsva 0:947ff5fa24c6 57 unsigned char *ptr[100] ;
loopsva 0:947ff5fa24c6 58
loopsva 0:947ff5fa24c6 59 int initSDRAM() {
loopsva 0:947ff5fa24c6 60 pc.printf("Initializing 32MB SDRAM\r\n");
loopsva 0:947ff5fa24c6 61 if (sdram_init() == 1) {
loopsva 0:947ff5fa24c6 62 pc.printf(" - Failed to initialize SDRAM\r\n");
loopsva 0:947ff5fa24c6 63 return 1;
loopsva 0:947ff5fa24c6 64 }
loopsva 0:947ff5fa24c6 65
loopsva 0:947ff5fa24c6 66 while(1) {
loopsva 0:947ff5fa24c6 67 ptr[alloccount] = (unsigned char *)malloc(ONEMBDRAMSIZE);
loopsva 0:947ff5fa24c6 68 //pc.printf (" - Allocated Address = %08x %2d\r\n", ptr[alloccount], alloccount);
loopsva 0:947ff5fa24c6 69 if(ptr[alloccount] == NULL) {
loopsva 0:947ff5fa24c6 70 pc.printf(" - Maximum allocatable DRAM memory %dMB\r\n", alloccount);
loopsva 0:947ff5fa24c6 71 for (int i = 0; i < alloccount; i++) {
loopsva 0:947ff5fa24c6 72 free(ptr[i]);
loopsva 0:947ff5fa24c6 73 }
loopsva 0:947ff5fa24c6 74 alloccount = 0;
loopsva 0:947ff5fa24c6 75 break;
loopsva 0:947ff5fa24c6 76 } else {
loopsva 0:947ff5fa24c6 77 alloccount++ ;
loopsva 0:947ff5fa24c6 78 }
loopsva 0:947ff5fa24c6 79 }
loopsva 0:947ff5fa24c6 80 return 0;
loopsva 0:947ff5fa24c6 81 }
loopsva 0:947ff5fa24c6 82
loopsva 0:947ff5fa24c6 83 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:947ff5fa24c6 84 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:947ff5fa24c6 85
loopsva 0:947ff5fa24c6 86 int main(void) {
loopsva 0:947ff5fa24c6 87
loopsva 0:947ff5fa24c6 88 pc.baud(460800);
loopsva 0:947ff5fa24c6 89 pc.printf("\r\n\r\nLPC4088 SDRAM memory test\r\n");
loopsva 0:947ff5fa24c6 90 initSDRAM();
loopsva 1:b2b9d3920781 91
loopsva 1:b2b9d3920781 92 uint32_t StartSeed = 0xbad1deaf;
loopsva 1:b2b9d3920781 93 int testresult = testSDRAM(StartSeed);
loopsva 0:947ff5fa24c6 94
loopsva 0:947ff5fa24c6 95 while(1) {
loopsva 0:947ff5fa24c6 96 wait_ms(500);
loopsva 0:947ff5fa24c6 97 led1 = !led1;
loopsva 0:947ff5fa24c6 98 }
loopsva 0:947ff5fa24c6 99 }
loopsva 0:947ff5fa24c6 100
loopsva 0:947ff5fa24c6 101