Debug tools / show registers, memory and system clock data

Dependencies:   mbed CheckRTC

Target mbed board

LPC1768
LPC1114FN28
ST Nucleo L152RE
ST NUcleo F401RE
ST Nucleo F411RE

Command structure

Top

1 - goto step1 -> no connection all pins
2 - goto step2 -> connects pin_x and pin_y (not impliment yet)
t - Check and set RTC
x - Goto HW monitor
q - Return to main

>1

l - Check LED
b - Check button
s - CPU system info & clock
o - CPU clock output (Bug fix, port_mco1_mco2_set() function. Thanks Topi Makinen on April 25th, 2015)

>x(Hardware level monitor)

m - Entry Memory Mode
m>? -> Aditinal functions can see by ?
r - Entry Register Mode
r>? -> Aditinal functions can see by ?
s - System Clock -> sf, System / CPU information -> sc
q - Quit (back to called routine)
p - Entry Port Mode
p>? -> Aditinal functions can see by ?

Usage

Please modify "mon_hw_config.h" file for your purpose.
Especially LPC114FN28 has small memory, you cannot run your own program together with this program.
You don't need any additional HW. Just connect with PC via terminal software.

CAUTION

Due to several CPU's and short development time, I cannot grantee the quality level and several functions are not available yet.
If you found the bug, please let me know. Thanks in advance.

Committer:
kenjiArai
Date:
Sun Apr 26 09:31:58 2015 +0000
Revision:
4:02980a730cfb
Parent:
2:b96103f9270e
Set output port PA8 & PC9 high speed mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d327c184e8bb 1 /*
kenjiArai 0:d327c184e8bb 2 * Monitor program / Memory control part
kenjiArai 0:d327c184e8bb 3 *
kenjiArai 0:d327c184e8bb 4 * Copyright (c) 2010-2014 Kenji Arai / JH1PJL
kenjiArai 0:d327c184e8bb 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:d327c184e8bb 6 * http://mbed.org/users/kenjiArai/
kenjiArai 0:d327c184e8bb 7 * Separated: October 13th, 2014 from mon_hw.cpp
kenjiArai 2:b96103f9270e 8 * Revised: Nobember 2nd, 2014
kenjiArai 0:d327c184e8bb 9 *
kenjiArai 0:d327c184e8bb 10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:d327c184e8bb 11 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:d327c184e8bb 12 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:d327c184e8bb 13 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:d327c184e8bb 14 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:d327c184e8bb 15 */
kenjiArai 0:d327c184e8bb 16
kenjiArai 0:d327c184e8bb 17 //-------------------------------------------------------------------------------------------------
kenjiArai 0:d327c184e8bb 18 // Control Program
kenjiArai 0:d327c184e8bb 19 //-------------------------------------------------------------------------------------------------
kenjiArai 0:d327c184e8bb 20 // Range check for Memory dump
kenjiArai 0:d327c184e8bb 21 static void check_range( MEMO * mem )
kenjiArai 0:d327c184e8bb 22 {
kenjiArai 0:d327c184e8bb 23 uint8_t i;
kenjiArai 0:d327c184e8bb 24 uint32_t m;
kenjiArai 0:d327c184e8bb 25
kenjiArai 0:d327c184e8bb 26 mem->mflg = ERR_NOTHING;
kenjiArai 0:d327c184e8bb 27 for ( i = 0 ; i < 5 ; i++ ) {
kenjiArai 0:d327c184e8bb 28 if ( mem->mstr >= mem_range[i][0]) {
kenjiArai 0:d327c184e8bb 29 if ( mem->mstr < mem_range[i][1] ) {
kenjiArai 0:d327c184e8bb 30 m = mem->mstr + mem->msiz;
kenjiArai 0:d327c184e8bb 31 if ( m < mem_range[i][1]) {
kenjiArai 0:d327c184e8bb 32 return; // no modification
kenjiArai 0:d327c184e8bb 33 } else {
kenjiArai 0:d327c184e8bb 34 m = mem_range[i][1];
kenjiArai 0:d327c184e8bb 35 mem->msiz = m - mem->mstr + 1;
kenjiArai 0:d327c184e8bb 36 mem->mflg = ERR_MODIFY_SIZ;
kenjiArai 0:d327c184e8bb 37 return; // modified size
kenjiArai 0:d327c184e8bb 38 }
kenjiArai 0:d327c184e8bb 39 }
kenjiArai 0:d327c184e8bb 40 }
kenjiArai 0:d327c184e8bb 41 }
kenjiArai 0:d327c184e8bb 42 mem->mflg = ERR_OUT_OF_RANGE;
kenjiArai 0:d327c184e8bb 43 mem->mstr = 0;
kenjiArai 0:d327c184e8bb 44 mem->msiz = 0;
kenjiArai 0:d327c184e8bb 45 return ;
kenjiArai 0:d327c184e8bb 46 }
kenjiArai 0:d327c184e8bb 47
kenjiArai 0:d327c184e8bb 48 // Memory dump error massage
kenjiArai 0:d327c184e8bb 49 void error_print ( unsigned char flg )
kenjiArai 0:d327c184e8bb 50 {
kenjiArai 0:d327c184e8bb 51 switch (flg) {
kenjiArai 0:d327c184e8bb 52 case ERR_MODIFY_SIZ :
kenjiArai 0:d327c184e8bb 53 put_r();
kenjiArai 0:d327c184e8bb 54 PRINTF("Reach to out of range");
kenjiArai 0:d327c184e8bb 55 put_rn();
kenjiArai 0:d327c184e8bb 56 break;
kenjiArai 0:d327c184e8bb 57 case ERR_OUT_OF_RANGE :
kenjiArai 0:d327c184e8bb 58 put_r();
kenjiArai 0:d327c184e8bb 59 PRINTF("Not in a memory area");
kenjiArai 0:d327c184e8bb 60 put_rn();
kenjiArai 0:d327c184e8bb 61 break;
kenjiArai 0:d327c184e8bb 62 case ERR_NOTHING :
kenjiArai 0:d327c184e8bb 63 default :
kenjiArai 0:d327c184e8bb 64 ;
kenjiArai 0:d327c184e8bb 65 }
kenjiArai 0:d327c184e8bb 66 }
kenjiArai 0:d327c184e8bb 67
kenjiArai 0:d327c184e8bb 68 // Print memory contents
kenjiArai 0:d327c184e8bb 69 void put_dump (const unsigned char *buff, unsigned long ofs, int cnt)
kenjiArai 0:d327c184e8bb 70 {
kenjiArai 0:d327c184e8bb 71 int n;
kenjiArai 0:d327c184e8bb 72
kenjiArai 0:d327c184e8bb 73 PRINTF("%08lX ", ofs);
kenjiArai 0:d327c184e8bb 74 for(n = 0; n < cnt; n++) { // show hex
kenjiArai 0:d327c184e8bb 75 PRINTF(" %02X", buff[n]);
kenjiArai 0:d327c184e8bb 76 }
kenjiArai 0:d327c184e8bb 77 for(; n < 16; n++) { // fullfil remained space
kenjiArai 0:d327c184e8bb 78 PRINTF(" ");
kenjiArai 0:d327c184e8bb 79 }
kenjiArai 0:d327c184e8bb 80 PUTC(' ');
kenjiArai 0:d327c184e8bb 81 for(n = 0; n < cnt; n++) { // show char
kenjiArai 0:d327c184e8bb 82 if ((buff[n] < 0x20)||(buff[n] >= 0x7F)) {
kenjiArai 0:d327c184e8bb 83 PUTC('.');
kenjiArai 0:d327c184e8bb 84 } else {
kenjiArai 0:d327c184e8bb 85 PUTC(buff[n]);
kenjiArai 0:d327c184e8bb 86 }
kenjiArai 0:d327c184e8bb 87 }
kenjiArai 0:d327c184e8bb 88 put_rn();
kenjiArai 0:d327c184e8bb 89 }
kenjiArai 0:d327c184e8bb 90
kenjiArai 0:d327c184e8bb 91 // dump memory with error check
kenjiArai 0:d327c184e8bb 92 void dump_w_err_ckeck ( char **ptr, MEMO * mem )
kenjiArai 0:d327c184e8bb 93 {
kenjiArai 0:d327c184e8bb 94 check_range (mem);
kenjiArai 0:d327c184e8bb 95 for (*ptr=(char*)mem->mstr; mem->msiz >= 16; *ptr += 16, mem->msiz -= 16) {
kenjiArai 0:d327c184e8bb 96 put_r();
kenjiArai 0:d327c184e8bb 97 put_dump((unsigned char*)*ptr, (unsigned int)*ptr, 16);
kenjiArai 0:d327c184e8bb 98 }
kenjiArai 0:d327c184e8bb 99 if (mem->msiz) {
kenjiArai 0:d327c184e8bb 100 put_dump((unsigned char*)*ptr, (unsigned int)*ptr, mem->msiz);
kenjiArai 0:d327c184e8bb 101 }
kenjiArai 0:d327c184e8bb 102 error_print(mem->mflg);
kenjiArai 0:d327c184e8bb 103 }
kenjiArai 0:d327c184e8bb 104
kenjiArai 0:d327c184e8bb 105 static void mem_inf (char *ptr)
kenjiArai 0:d327c184e8bb 106 {
kenjiArai 0:d327c184e8bb 107 put_r();
kenjiArai 0:d327c184e8bb 108 PRINTF("Mem. Mode d <address> [<count>], s, <ret> or f, q, ?");
kenjiArai 0:d327c184e8bb 109 put_rn();
kenjiArai 0:d327c184e8bb 110 mem.mstr = mem_range[0][0]; // default start address = Flash
kenjiArai 0:d327c184e8bb 111 mem.msiz =256;
kenjiArai 0:d327c184e8bb 112 mem.mold = 0;
kenjiArai 0:d327c184e8bb 113 mem.mtmp = 0;
kenjiArai 0:d327c184e8bb 114 mem.mflg = 0;
kenjiArai 0:d327c184e8bb 115 for (; mem.mflg != 0xff;) {
kenjiArai 0:d327c184e8bb 116 PRINTF("m>");
kenjiArai 0:d327c184e8bb 117 ptr = linebuf;
kenjiArai 0:d327c184e8bb 118 get_line(ptr, buf_size);
kenjiArai 0:d327c184e8bb 119 put_r();
kenjiArai 0:d327c184e8bb 120 switch(*ptr++) {
kenjiArai 0:d327c184e8bb 121 case 'd' : // d <address> [<count>] - Dump memory
kenjiArai 0:d327c184e8bb 122 mem.mtmp = mem.mstr;
kenjiArai 0:d327c184e8bb 123 if (!xatoi(&ptr, &mem.mstr)) {
kenjiArai 0:d327c184e8bb 124 mem.mstr = mem.mtmp;
kenjiArai 0:d327c184e8bb 125 }
kenjiArai 0:d327c184e8bb 126 if (!xatoi(&ptr, &mem.msiz)) {
kenjiArai 0:d327c184e8bb 127 mem.msiz = 256;
kenjiArai 0:d327c184e8bb 128 }
kenjiArai 0:d327c184e8bb 129 mem.mtmp = mem.msiz;
kenjiArai 0:d327c184e8bb 130 dump_w_err_ckeck(&ptr, &mem);
kenjiArai 0:d327c184e8bb 131 mem.mold = mem.mstr;
kenjiArai 0:d327c184e8bb 132 mem.mstr += mem.mtmp;
kenjiArai 0:d327c184e8bb 133 break;
kenjiArai 0:d327c184e8bb 134 case 'f' : // next
kenjiArai 0:d327c184e8bb 135 case 'n' :
kenjiArai 0:d327c184e8bb 136 case 0x0d :
kenjiArai 0:d327c184e8bb 137 mem.msiz = 256;
kenjiArai 0:d327c184e8bb 138 mem.mtmp = mem.msiz;
kenjiArai 0:d327c184e8bb 139 dump_w_err_ckeck(&ptr, &mem);
kenjiArai 0:d327c184e8bb 140 mem.mold = mem.mstr;
kenjiArai 0:d327c184e8bb 141 mem.mstr += 256;
kenjiArai 0:d327c184e8bb 142 break;
kenjiArai 0:d327c184e8bb 143 case 'q' : // quit
kenjiArai 0:d327c184e8bb 144 mem.mflg = 0xff;
kenjiArai 0:d327c184e8bb 145 break;
kenjiArai 0:d327c184e8bb 146 case 'b' : // Back to more
kenjiArai 0:d327c184e8bb 147 if (mem.mold == 0) {
kenjiArai 0:d327c184e8bb 148 ;
kenjiArai 0:d327c184e8bb 149 } else {
kenjiArai 0:d327c184e8bb 150 mem.mold -= 256;
kenjiArai 0:d327c184e8bb 151 }
kenjiArai 0:d327c184e8bb 152 case 'k' : // keep previous address
kenjiArai 0:d327c184e8bb 153 mem.mstr = mem.mold;
kenjiArai 0:d327c184e8bb 154 mem.msiz = 256;
kenjiArai 0:d327c184e8bb 155 mem.mtmp = mem.msiz;
kenjiArai 0:d327c184e8bb 156 dump_w_err_ckeck(&ptr, &mem);
kenjiArai 0:d327c184e8bb 157 mem.mstr += 256;
kenjiArai 0:d327c184e8bb 158 break;
kenjiArai 0:d327c184e8bb 159 case 'a' : // start RAM top
kenjiArai 0:d327c184e8bb 160 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:d327c184e8bb 161 mem.mstr = mem_range[4][0];
kenjiArai 2:b96103f9270e 162 #elif defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE)
kenjiArai 0:d327c184e8bb 163 mem.mstr = mem_range[3][0];
kenjiArai 0:d327c184e8bb 164 #elif defined(TARGET_LPC1768)
kenjiArai 0:d327c184e8bb 165 mem.mstr = mem_range[1][0];
kenjiArai 1:84813f6b798e 166 #elif defined(TARGET_LPC1114)
kenjiArai 1:84813f6b798e 167 mem.mstr = mem_range[1][0];
kenjiArai 0:d327c184e8bb 168 #else
kenjiArai 0:d327c184e8bb 169 #error "target cpu does NOT support"
kenjiArai 0:d327c184e8bb 170 #endif
kenjiArai 0:d327c184e8bb 171 mem.msiz =256;
kenjiArai 0:d327c184e8bb 172 mem.mold = 0;
kenjiArai 0:d327c184e8bb 173 mem.mtmp = 0;
kenjiArai 0:d327c184e8bb 174 mem.mflg = 0;
kenjiArai 0:d327c184e8bb 175 dump_w_err_ckeck(&ptr, &mem);
kenjiArai 0:d327c184e8bb 176 mem.mstr += 256;
kenjiArai 0:d327c184e8bb 177 break;
kenjiArai 0:d327c184e8bb 178 case 'o' : // start ROM top
kenjiArai 0:d327c184e8bb 179 mem.mstr = mem_range[0][0];
kenjiArai 0:d327c184e8bb 180 mem.msiz =256;
kenjiArai 0:d327c184e8bb 181 mem.mold = 0;
kenjiArai 0:d327c184e8bb 182 mem.mtmp = 0;
kenjiArai 0:d327c184e8bb 183 mem.mflg = 0;
kenjiArai 0:d327c184e8bb 184 dump_w_err_ckeck(&ptr, &mem);
kenjiArai 0:d327c184e8bb 185 mem.mstr += 256;
kenjiArai 0:d327c184e8bb 186 break;
kenjiArai 0:d327c184e8bb 187 case 's' :
kenjiArai 0:d327c184e8bb 188 PRINTF("Memory Configuration");
kenjiArai 0:d327c184e8bb 189 put_rn();
kenjiArai 0:d327c184e8bb 190 PRINTF("%s0x%08lx to 0x%08lx ", rmsg0, mem_range[0][0], mem_range[0][1]);
kenjiArai 0:d327c184e8bb 191 put_rn();
kenjiArai 0:d327c184e8bb 192 PRINTF("%s0x%08lx to 0x%08lx ", rmsg1, mem_range[1][0], mem_range[1][1]);
kenjiArai 0:d327c184e8bb 193 put_rn();
kenjiArai 0:d327c184e8bb 194 PRINTF("%s0x%08lx to 0x%08lx ", rmsg2, mem_range[2][0], mem_range[2][1]);
kenjiArai 0:d327c184e8bb 195 put_rn();
kenjiArai 0:d327c184e8bb 196 PRINTF("%s0x%08lx to 0x%08lx ", rmsg3, mem_range[3][0], mem_range[3][1]);
kenjiArai 0:d327c184e8bb 197 put_rn();
kenjiArai 0:d327c184e8bb 198 PRINTF("%s0x%08lx to 0x%08lx ", rmsg4, mem_range[4][0], mem_range[4][1]);
kenjiArai 0:d327c184e8bb 199 put_rn();
kenjiArai 0:d327c184e8bb 200 #if defined(TARGET_NUCLEO_L152RE)
kenjiArai 0:d327c184e8bb 201 PRINTF("%s0x%08lx to 0x%08lx ", rmsg5, mem_range[5][0], mem_range[5][1]);
kenjiArai 0:d327c184e8bb 202 put_rn();
kenjiArai 0:d327c184e8bb 203 #endif
kenjiArai 0:d327c184e8bb 204 break;
kenjiArai 0:d327c184e8bb 205 case '?' :
kenjiArai 0:d327c184e8bb 206 PRINTF("d <address> [<count>] - Dump memory");
kenjiArai 0:d327c184e8bb 207 put_rn();
kenjiArai 0:d327c184e8bb 208 PRINTF("s - Show memory structure ");
kenjiArai 0:d327c184e8bb 209 put_rn();
kenjiArai 0:d327c184e8bb 210 PRINTF("o - Dump memory / start from ROM top");
kenjiArai 0:d327c184e8bb 211 put_rn();
kenjiArai 0:d327c184e8bb 212 PRINTF("a - Dump memory / start from RAM top");
kenjiArai 0:d327c184e8bb 213 put_rn();
kenjiArai 0:d327c184e8bb 214 PRINTF("k - Dump memory / keep same 256bytes");
kenjiArai 0:d327c184e8bb 215 put_rn();
kenjiArai 0:d327c184e8bb 216 PRINTF("b - Dump memory / before 256bytes");
kenjiArai 0:d327c184e8bb 217 put_rn();
kenjiArai 0:d327c184e8bb 218 PRINTF("<RET> or f, n - Dump memory / next 256bytes");
kenjiArai 0:d327c184e8bb 219 put_rn();
kenjiArai 0:d327c184e8bb 220 PRINTF("q - Exit memory mode");
kenjiArai 0:d327c184e8bb 221 put_rn();
kenjiArai 0:d327c184e8bb 222 break;
kenjiArai 0:d327c184e8bb 223 default:
kenjiArai 0:d327c184e8bb 224 PUTC('?');
kenjiArai 0:d327c184e8bb 225 put_rn();
kenjiArai 0:d327c184e8bb 226 }
kenjiArai 0:d327c184e8bb 227 }
kenjiArai 0:d327c184e8bb 228 PRINTF("Return to All Mode");
kenjiArai 0:d327c184e8bb 229 }