This is a monitor program which can see some mbed running conditions such a memory contents, time (if RTC set up), CPU information and others.
mon.cpp
- Committer:
- kenjiArai
- Date:
- 2010-05-15
- Revision:
- 0:4aaeaab8334a
File content as of revision 0:4aaeaab8334a:
//------------------------------------------------------------------------------------------------------------------- // Monitor program Ver.1 // (c)2010 Kenji Arai / JH1PJL // http://www.page.sannet.ne.jp/kenjia/index.html // http://mbed.org/users/kenjiArai/ // May 9th,2010 Started // May 15th,2010 //-------------------------------------------------------------------------------------------------------------------- // Reference // http://www.nxp.com/#/pip/pip=[pip=LPC1769_68_67_66_65_64_4]|pp=[t=pip,i=LPC1769_68_67_66_65_64_4] //-------------------------------------------------------------------------------------------------------------------- // Function // Show Memory contents, Digital port, Analog input port, CPU clock, RTC/Time and others in the mbed board // Connection // Analog input PIN 15,16,17 // Digital input PIN 24,25,26 // LCD PIN 5,6,7,21,22,23 // RTC PIN 3 needs to connect 3V Battery // -> Please refer my program " RTC_w_COM" for time adjustment // at " http://mbed.org/users/kenjiArai/programs/RTC_w_COM/5yi9a/ " //--------------------------------------------------------------------------------------------------------------------- #include "mbed.h" // Define clocks #define XTAL (12000000UL) /* Oscillator frequency */ #define OSC_CLK ( XTAL) /* Main oscillator frequency */ #define RTC_CLK ( 32000UL) /* RTC oscillator frequency */ #define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */ // Range check status #define ERR_NOTHING 0 #define ERR_MODIFY_SIZ 1 #define ERR_OUT_OF_RANGE 2 typedef struct{ unsigned long mstr; unsigned long msiz; unsigned long mtmp; unsigned long mold; unsigned char mflg; } MEMO; Serial pc(USBTX, USBRX); AnalogIn ana0(p15); AnalogIn ana1(p16); AnalogIn ana2(p17); DigitalIn sw0(p24); DigitalIn sw1(p25); DigitalIn sw2(p26); char linebuf[256]; // Memory management static MEMO mem; unsigned long SystemFrequency; // Memory range data const uint32_t mem_range[][2] = { // Memory access range { 0x00000000, 0x0007ffff }, // On-chip non-volatile memory //512KB Flash memory { 0x10000000, 0x10007fff }, // On-chip SRAM //32KB local RAM { 0x1fff0000, 0x1fff1fff }, // Boot ROM //8KB Boot ROM { 0x2007c000, 0x2007ffff }, // On-chip SRAM //16KB AHB SRAM { 0x20080000, 0x20083fff } // On-chip SRAM //16KB AHB SRAM }; // Put \r\n void put_cr ( void ){ pc.putc('\r'); pc.putc('\n'); } // Put \r void put_r ( void ){ pc.putc('\r'); } // Help Massage void msg_hlp ( void ){ pc.printf("Monitor for mbed LPC1768 Ver. on "__DATE__" (" __TIME__ ")"); put_cr(); pc.printf("a - Show ADC data "); put_cr(); pc.printf("m - Entry Memory Mode"); put_cr(); pc.printf("m>? -> After entry the Memory Mode, adiitinal functions can see by ?"); put_cr(); pc.printf("p - Show Port status "); put_cr(); pc.printf("sf - System Clock"); put_cr(); pc.printf("sc - System / CPU information"); put_cr(); pc.printf("t [<year> <mon> <mday> <hour> <min> <sec>] "); put_cr(); pc.printf("/ [a],[p],[t] commands every 1 sec Exit =hit any key (not ENTER key) "); put_cr(); pc.printf("q - Quit (back to called routine)"); put_cr(); } // Check Switch port status void check_port ( void ){ put_r(); pc.printf("Input Port Status"); put_cr(); pc.printf("mbed P26 (LPC1768 p2.0) = "); if ( sw2.read() ){ pc.printf("ON "); } else { pc.printf("OFF "); } put_cr(); pc.printf("mbed P25 (LPC1768 p2.1) = "); if ( sw1.read() ){ pc.printf("ON "); } else { pc.printf("OFF "); } put_cr(); pc.printf("mbed P24 (LPC1768 p2.2) = "); if ( sw0.read() ){ pc.printf("ON "); } else { pc.printf("OFF "); } put_cr(); } void cpu_inf ( void ){ unsigned long m1, m2; m1 = SCB->CPUID; m2 = ( m1 >> 24 ); if ( m2 == 0x41 ){ put_r(); pc.printf("CPU = ARM "); } else { put_r(); pc.printf("CPU = NOT ARM "); } m2 = ( m1 >> 4 ) & 0xfff; if ( m2 == 0xc23 ){ pc.printf("Cortex-M3"); put_cr(); } else { pc.printf("NOT Cortex-M3"); put_cr(); } m2 = ( m1 >> 20 ) & 0x0f; pc.printf("Variant:%x", m2); put_cr(); m2 = m1 & 0x7; pc.printf("Revision:%x", m2); put_cr(); } // Calculate CPU System Clock Frequency void get_freq ( int pr ){ if(pr){ put_r(); pc.printf("System Clock = %dHz",SystemFrequency ); put_cr(); } if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) {/* If PLL0 enabled and connected */ if(pr){ pc.printf("PLL0 enabled"); put_cr(); } switch (LPC_SC->CLKSRCSEL & 0x03) { case 0: /* Internal RC oscillator => PLL0 */ case 3: /* Reserved, default to Internal RC */ if(pr){ pc.printf("Internal RC Oscillator"); put_cr(); } SystemFrequency = (IRC_OSC * (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / ((LPC_SC->CCLKCFG & 0xFF)+ 1)); break; case 1: /* Main oscillator => PLL0 */ if(pr){ pc.printf("Xtal Osc Clock = %dHz",XTAL ); put_cr(); } SystemFrequency = (OSC_CLK * (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / ((LPC_SC->CCLKCFG & 0xFF)+ 1)); break; case 2: /* RTC oscillator => PLL0 */ if(pr){ pc.printf("RTC Xtal Oscillator f = %dHz", RTC_CLK ); put_cr(); } SystemFrequency = (RTC_CLK * (((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) / (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1)) / ((LPC_SC->CCLKCFG & 0xFF)+ 1)); break; } } else { if(pr){ pc.printf("PLL0 disabled"); } switch (LPC_SC->CLKSRCSEL & 0x03) { case 0: /* Internal RC oscillator => PLL0 */ case 3: /* Reserved, default to Internal RC */ if(pr){ pc.printf("Internal RC Oscillator"); put_cr(); } SystemFrequency = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1); break; case 1: /* Main oscillator => PLL0 */ if(pr){ pc.printf("Xtal Osc Clock = %dHz",XTAL ); put_cr(); } SystemFrequency = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); break; case 2: /* RTC oscillator => PLL0 */ if(pr){ pc.printf("RTC Xtal Oscillator f = %dHz", RTC_CLK ); put_cr(); } SystemFrequency = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1); break; } } } // Range check for Memory dump static void check_range( MEMO * mem ){ uint8_t i; uint32_t m; mem->mflg = ERR_NOTHING; for ( i = 0 ; i < 5 ; i++ ){ if ( mem->mstr >= mem_range[i][0]){ if ( mem->mstr < mem_range[i][1] ){ m = mem->mstr + mem->msiz; if ( m < mem_range[i][1]){ return; // no modification } else { m = mem_range[i][1]; mem->msiz = m - mem->mstr + 1; mem->mflg = ERR_MODIFY_SIZ; return; // modified size } } } } mem->mflg = ERR_OUT_OF_RANGE; mem->mstr = 0; mem->msiz = 0; return ; } // Memory dump error massage void error_print ( unsigned char flg ){ switch (flg) { case ERR_MODIFY_SIZ : put_r(); pc.printf("Reach to out of range "); put_cr(); break; case ERR_OUT_OF_RANGE : put_r(); pc.printf("Not in a memory area "); put_cr(); break; case ERR_NOTHING : default : ; } } // Change string -> integer int xatoi (char **str, unsigned long *res){ unsigned long val; unsigned char c, radix, s = 0; while ((c = **str) == ' ') (*str)++; if (c == '-') { s = 1; c = *(++(*str)); } if (c == '0') { c = *(++(*str)); if (c <= ' ') { *res = 0; return 1; } if (c == 'x') { radix = 16; c = *(++(*str)); } else { if (c == 'b') { radix = 2; c = *(++(*str)); } else { if ((c >= '0')&&(c <= '9')) radix = 8; else return 0; } } } else { if ((c < '1')||(c > '9')) return 0; radix = 10; } val = 0; while (c > ' ') { if (c >= 'a') c -= 0x20; c -= '0'; if (c >= 17) { c -= 7; if (c <= 9) return 0; } if (c >= radix) return 0; val = val * radix + c; c = *(++(*str)); } if (s) val = -val; *res = val; return 1; } // Print memory contents void put_dump (const unsigned char *buff, unsigned long ofs, int cnt){ int n; #if 1 pc.printf("%08lX ", ofs); for(n = 0; n < cnt; n++){ pc.printf(" %02X", buff[n]); } pc.putc(' '); for(n = 0; n < cnt; n++) { if ((buff[n] < 0x20)||(buff[n] >= 0x7F)){ pc.putc('.'); } else { pc.putc(buff[n]); } } put_cr(); #endif #if 0 printf("%08lX ", ofs); for(n = 0; n < cnt; n++){ printf(" %02X", buff[n]); } pc.putc(' '); for(n = 0; n < cnt; n++) { if ((buff[n] < 0x20)||(buff[n] >= 0x7F)){ pc.putc('.'); } else { pc.putc(buff[n]); } } pc.puts("\r\n"); #endif } // Get key input data void get_line (char *buff, int len){ char c; int idx = 0; for (;;) { c = pc.getc(); // Added by Kenji Arai / JH1PJL May 9th, 2010 if (c == '\r'){ buff[idx++] = c; break; } if ((c == '\b') && idx) { idx--; pc.putc(c); pc.putc(' '); pc.putc(c); } if (((uint8_t)c >= ' ') && (idx < len - 1)) { buff[idx++] = c; pc.putc(c); } } buff[idx] = 0; pc.putc('\n'); } // Monitor Program int mon() { char *ptr; unsigned long p1; char c; time_t seconds; struct tm rtc; pc.baud(115200); put_cr(); put_cr(); pc.printf("Monitor for mbed LPC1768 Ver. on "__DATE__" (" __TIME__ ") [Help:'?' key]"); put_cr(); get_freq(0); for (;;) { put_r(); pc.putc('>'); ptr = linebuf; get_line(ptr, sizeof(linebuf)); switch (*ptr++) { //-------------------------------------------------------------------------------------- // Memory //-------------------------------------------------------------------------------------- case 'm' : put_r(); pc.printf("Entry Memory Mode 1) d <address> [<count>], 2) s, 3) <ret>, 4) <esc>"); put_cr(); mem.mstr = 0; mem.msiz =256; mem.mold = 0; mem.mtmp = 0; mem.mflg = 0; for (;mem.mflg != 0xff;){ pc.printf("m>"); c = pc.getc(); pc.putc(c); switch (c) { case 'd' : /* d <address> [<count>] - Dump memory */ ptr = linebuf; get_line(ptr, sizeof(linebuf)); mem.mtmp = mem.mstr; if (!xatoi(&ptr, &mem.mstr)){ mem.mstr = mem.mtmp; } if (!xatoi(&ptr, &mem.msiz)){ mem.msiz = 256; } mem.mtmp = mem.msiz; check_range (&mem); for (ptr=(char*)mem.mstr; mem.msiz >= 16; ptr += 16, mem.msiz -= 16){ put_r(); put_dump((unsigned char*)ptr, (unsigned int)ptr, 16); } if (mem.msiz){ put_dump((unsigned char*)ptr, (unsigned int)ptr, mem.msiz); } error_print(mem.mflg); mem.mold = mem.mstr; mem.mstr += mem.mtmp; break; case 0x0d : // CR put_cr(); mem.msiz = 256; mem.mtmp = mem.msiz; check_range (&mem); for (ptr=(char*)mem.mstr; mem.msiz >= 16; ptr += 16, mem.msiz -= 16){ put_r(); put_dump((unsigned char*)ptr, (unsigned int)ptr, 16); } error_print(mem.mflg); mem.mold = mem.mstr; mem.mstr += 256; break; case 0x1b : // ESC mem.mflg = 0xff; break; case 0x08 : // Back Space put_cr(); mem.mstr = mem.mold; mem.msiz = 256; mem.mtmp = mem.msiz; check_range (&mem); for (ptr=(char*)mem.mstr; mem.msiz >= 16; ptr += 16, mem.msiz -= 16){ put_r(); put_dump((unsigned char*)ptr, (unsigned int)ptr, 16); } error_print(mem.mflg); mem.mstr += 256; break; case 's' : put_cr(); pc.printf("Memory Configuration"); put_cr(); pc.printf("FLASH 0x%08lx to 0x%08lx ", mem_range[0][0], mem_range[0][1]); put_cr(); pc.printf("S-RAM 0x%08lx to 0x%08lx ", mem_range[1][0], mem_range[1][1]); put_cr(); pc.printf("Boot-ROM 0x%08lx to 0x%08lx ", mem_range[2][0], mem_range[2][1]); put_cr(); pc.printf("AHB-RAM0 0x%08lx to 0x%08lx ", mem_range[3][0], mem_range[3][1]); put_cr(); pc.printf("AHB-RAM1 0x%08lx to 0x%08lx \r\n", mem_range[4][0], mem_range[4][1]); break; case '?' : put_cr(); pc.printf("d <address> [<count>] - Dump memory"); put_cr(); pc.printf("s - Show memory structure "); put_cr(); pc.printf("<RET> - Dump memory / next 128 bytes"); put_cr(); pc.printf("<BS> - Dump memory / same as before 128 bytes"); put_cr(); pc.printf("<ESC> - Exit memory mode"); put_cr(); break; default: put_cr(); } } pc.putc('>'); put_cr(); break; //-------------------------------------------------------------------------------------- // Port //-------------------------------------------------------------------------------------- case 'p' : /* p - Show Port status */ check_port(); break; //-------------------------------------------------------------------------------------- // ADC //-------------------------------------------------------------------------------------- case 'a' : /* a - Show ADC data */ put_r(); pc.printf("anao = %f, ana1 = %f, ana2 = %f", ana0.read(), ana1.read(), ana2.read()); put_cr(); break; //-------------------------------------------------------------------------------------- // Time //-------------------------------------------------------------------------------------- case 't' : /* t [<year> <mon> <mday> <hour> <min> <sec>] */ if (xatoi(&ptr, &p1)) { rtc.tm_year = (unsigned short)p1; xatoi(&ptr, &p1); rtc.tm_mon = (unsigned char)p1; xatoi(&ptr, &p1); rtc.tm_mday = (unsigned char)p1; xatoi(&ptr, &p1); rtc.tm_hour = (unsigned char)p1; xatoi(&ptr, &p1); rtc.tm_min = (unsigned char)p1; if (!xatoi(&ptr, &p1)) break; rtc.tm_sec = (unsigned char)p1; seconds = mktime(&rtc); set_time(seconds); } while ( seconds == time(NULL)) ; seconds = time(NULL); // 13:24:00 PM (2010/03/27) strftime(linebuf,40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds)); put_r(); pc.printf("Time = %s", linebuf); put_cr(); break; //-------------------------------------------------------------------------------------- // System //-------------------------------------------------------------------------------------- case 's' : /* System related information */ switch (*ptr++) { case 'f' : /* sc - show system clock frequency */ get_freq(1); break; case 'c' : /* sc - show system CPU information*/ cpu_inf(); break; case '?' : pc.printf("sc - System CPU information"); put_cr(); pc.printf("sf - System Clock"); put_cr(); break; } break; //-------------------------------------------------------------------------------------- // Repeat Command every second //-------------------------------------------------------------------------------------- case '/' : switch (*ptr++) { case 'a' : while(1){ put_r(); pc.printf("anao = %f, ana1 = %f, ana2 = %f", ana0.read(), ana1.read(), ana2.read()); put_cr(); if ( pc.readable() ){ break; } wait(1.0); // Wait 1sec } break; case 'p' : while(1){ check_port(); if ( pc.readable() ){ break; } wait(1.0); // Wait 1sec } break; case 't' : while(1){ while ( seconds == time(NULL)) ; seconds = time(NULL); // 13:24:00 PM (2010/03/27) strftime(linebuf,40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds)); put_r(); pc.printf("Time = %s", linebuf); put_cr(); if ( pc.readable() ){ break; } wait(1.0); // Wait 1sec } break; } break; //-------------------------------------------------------------------------------------- // Help //-------------------------------------------------------------------------------------- case '?' : msg_hlp(); break; //-------------------------------------------------------------------------------------- // Return to main routine //-------------------------------------------------------------------------------------- case 'q' : // Quit pc.printf("\rReturn to main but back to mon()\r\n"); return 0; } } }