Debug tools / show registers, memory and system clock data
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.
debug_tools/mon_hw_mem.h@4:02980a730cfb, 2015-04-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |