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_LPC1114.cpp
- Committer:
- kenjiArai
- Date:
- 2015-04-26
- Revision:
- 4:02980a730cfb
- Parent:
- 2:b96103f9270e
File content as of revision 4:02980a730cfb:
/* * mbed Application program for the mbed LPC1114FN28 * Monitor program Ver.3 for only for LPC1114FN28 * * Copyright (c) 2010-2014 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: May 15th, 2010 * release as "monitor_01" http://mbed.org/users/kenjiArai/code/monitor_01/ * Spareted: June 25th, 2014 mon() & mon_hw() * Revised: Nobember 2nd, 2014 * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #if defined(TARGET_LPC1114) // Include --------------------------------------------------------------------------------------- #include "mbed.h" #include "mon_hw_config.h" #include "mon_hw_common.h" // Object ---------------------------------------------------------------------------------------- // Definition ------------------------------------------------------------------------------------ // Define clocks #define __XTAL (12000000UL) // Oscillator frequency #define __SYS_OSC_CLK ( __XTAL) // Main oscillator frequency #define __IRC_OSC_CLK (12000000UL) // Internal RC oscillator frequency // RAM ------------------------------------------------------------------------------------------- uint32_t SystemFrequency; // ROM / Constant data --------------------------------------------------------------------------- #if USE_MEM // Memory range data const uint32_t mem_range[][2] = { // Memory access range { 0x00000000, 0x00007fff }, // On-chip non-volatile memory //32KB Flash memory { 0x10000000, 0x10000fff }, // On-chip SRAM //4KB local RAM { 0x1fff0000, 0x1fff3fff }, // Boot ROM //16KB Boot ROM { 0x40000000, 0x4007ffff }, // IO area { 0x50000000, 0x501fffff } // IO area }; #endif // USE_MEM char *const mon_msg = "HW monitor only for mbed LPC1114FN28 created on "__DATE__","__TIME__""; char *const xmsg0 = "Not implimented yet"; char *const hmsg0 = "m - Entry Memory Mode"; char *const hmsg1 = "m>? -> Help "; char *const hmsg2 = "r - Show PORT,I2C,SPI,UART & other Reg."; char *const hmsg3 = "r>? -> Help"; char *const hmsg4 = "sf - System Clock"; char *const hmsg5 = "sc - System / CPU information"; char *const hmsg6 = "x - Special command for Debug"; char *const hmsg7 = "q - Quit (back to called routine)"; #if (USE_PORT==0)||(USE_UART==0)||(USE_SPI==0)||(USE_I2C==0) char *const io_port_name0 = "PIO0_"; char *const io_port_name1 = "PIO1_"; char *const iomsg0 = "Func->select "; char *const iomsg1 = "IO"; char *const iomsg2 = "Reserved"; char *const iomsg30 = "B0_MAT"; char *const iomsg31 = "B1_MAT"; char *const iomsg4 = "Std/F-md I2C"; char *const iomsg5 = "func. R"; char *const iomsg6 = "D-Mode"; char *const iomsg7 = "A-Mode"; #endif // Calculate CPU System Clock Frequency /refrence: system_LPCxx.c char *const fmsg0 = "Internal RC Oscillator"; char *const fmsg1 = "Xtal Osc Clock"; char *const fmsg2 = "Watch dog Osc Clock"; char *const fmsg3 = "with PLL"; char *const fmsg4 = "System Clock ="; char *const fmsg5 = "PLL Post divider ratio ="; char *const fmsg6 = "feedback devider ="; char *const fmsg7 = "NO Clock ?!"; #if (USE_UART==1) || (USE_SPI==1) || (USE_I2C == 1) char *const imsg2 = "-->Control Reg."; char *const imsg3 = "-->Status Reg."; char *const imsg4 = "-->Data Reg."; char *const imsg5 = "-->Clock control Reg."; #endif // Function prototypes --------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- // Control Program //------------------------------------------------------------------------------------------------- // No function void not_yet_impliment( void ) { PRINTF(xmsg0); put_rn(); } // No function #if (USE_MEM==0)||(USE_PORT==0)||(USE_UART==0)||(USE_SPI==0)||(USE_I2C==0)||(USE_SYS==0) void not_select( void ) { PRINTF("Not select the function (refer mon_hw_config.h)"); put_rn(); } #endif // Help Massage void msg_hlp_hw (void) { PRINTF(mon_msg); put_rn(); PRINTF(hmsg0); put_rn(); PRINTF(hmsg1); put_rn(); PRINTF(hmsg2); put_rn(); PRINTF(hmsg3); put_rn(); PRINTF(hmsg4); put_rn(); PRINTF(hmsg5); put_rn(); PRINTF(hmsg6); put_rn(); PRINTF(hmsg7); put_rn(); } #if USE_MEM char *const rmsg0 = "FLASH "; char *const rmsg1 = "SRAM "; char *const rmsg2 = "Boot ROM "; char *const rmsg3 = "IO Area0 "; char *const rmsg4 = "IO Area1 "; #include "mon_hw_mem.h" #endif // USE_MEM // Show 16bit register contents void reg_print(uint16_t size, uint16_t reg) { uint16_t i, j, k, n; if (size == 8) { PRINTF(" 7, 6, 5, 4, 3, 2, 1, 0"); put_rn(); i = 8; n = 0x80; } else if (size == 16) { PRINTF( "15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0" ); put_rn(); i = 16; n = 0x8000; } else { PRINTF("0x%08x", reg); return; } PUTC(' '); for (; i>0; i--) { k = n >> (size-i); j = reg & k; if (j) { PUTC('1'); } else { PUTC('0'); } PUTC(' '); PUTC(' '); } PRINTF(" (0x%04x)", reg); } #if USE_PORT void io_mode(uint32_t reg) { PRINTF("MODE->"); switch (reg) { case 0: PRINTF("Inactive"); break; case 1: PRINTF("P-DWN"); break; case 2: PRINTF("P-UP"); break; case 3: PRINTF("Repeater"); break; } } void io_hys(uint32_t reg) { PRINTF("HIS->"); switch (reg) { case 0: PRINTF("Dis"); break; case 1: PRINTF("Ena"); break; } } void io_od(uint32_t reg) { PRINTF("OD->"); switch (reg) { case 0: PRINTF("no OD"); break; case 1: PRINTF("OD"); break; } } void io_mode_hys_od(uint32_t reg) { io_mode ((reg >> 3) & 0x3); put_lin(); io_hys (( reg >> 5) & 0x1); put_lin(); io_od (( reg >> 10) & 0x1); } // I/O Config IO0_x void io_config0(void) { uint32_t r0; // P0_0 r0 = LPC_IOCON->RESET_PIO0_0; PRINTF("RESET_%s0(dp23)", io_port_name0); put_spc(1); reg_print( SIZE_X, r0 ); put_spc(2); PRINTF( iomsg0 ); if ((r0 & 0x7) == 0) { PRINTF("RESET"); } else { PRINTF( iomsg1 ); } put_lin(); io_mode_hys_od( r0 ); put_rn(); // P0_1 r0 = LPC_IOCON->PIO0_1; PRINTF("%s1(dp24)", io_port_name0); put_spc(3); reg_print( SIZE_X, r0 ); put_spc(2); PRINTF( iomsg0 ); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("CLKOUT"); break; case 2: PRINTF("32%s2", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_2 r0 = LPC_IOCON->PIO0_2; PRINTF("%s2(dp25)",io_port_name0); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("SSEL0"); break; case 2: PRINTF("16B0_CAP0"); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_3 r0 = LPC_IOCON->PIO0_3; PRINTF("%s3(dp26)",io_port_name0); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_4 r0 = LPC_IOCON->PIO0_4; PRINTF("%s4(dp27)",io_port_name0); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("SCL"); break; } put_lin(); switch (( r0 >> 8 ) & 0x3) { case 0: PRINTF(iomsg4); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("Fast md"); break; case 3: PRINTF(iomsg2); break; } put_rn(); // P0_5 r0 = LPC_IOCON->PIO0_5; PRINTF("%s5(dp5)",io_port_name0); put_spc(4); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("SDA"); break; } put_lin(); switch ( ( r0 >> 8 ) & 0x3 ) { case 0: PRINTF(iomsg4); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("Fast md"); break; case 3: PRINTF(iomsg2); break; } put_rn(); // P0_6 r0 = LPC_IOCON->PIO0_6; PRINTF("%s6(dp6)", io_port_name0); put_spc(4); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF(iomsg2); break; case 2: PRINTF("SCK0"); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_7 r0 = LPC_IOCON->PIO0_7; PRINTF("%s7(dp28)", io_port_name0); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("CTS"); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_8 r0 = LPC_IOCON->PIO0_8; PRINTF("%s8(dp1)", io_port_name0); put_spc(4); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("MISO0"); break; case 2: PRINTF("16%s0", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_9 r0 = LPC_IOCON->PIO0_9; PRINTF("%s9(dp2)", io_port_name0); put_spc(4); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("MOSI0"); break; case 2: PRINTF("16%s1", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_10 r0 = LPC_IOCON->SWCLK_PIO0_10; PRINTF("SWCLK_%s10(dp3)", io_port_name0); put_spc(1); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF("SWCLK"); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("SCK0"); break; case 3: PRINTF("16%s2", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P0_11 r0 = LPC_IOCON->R_PIO0_11; PRINTF("R_%s11(dp4)", io_port_name0); put_spc(1); reg_print(SIZE_X, r0); put_spc(2); PRINTF( iomsg0 ); switch ( r0 & 0x7 ) { case 0: PRINTF(iomsg5); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("AD0"); break; case 3: PRINTF("32%s3", iomsg30); break; } put_lin(); io_mode_hys_od(r0); if ( r0 & 0x80 ) { PRINTF(", %s", iomsg6); } else { PRINTF(", %s", iomsg7); } put_rn(); } // I/O Config IO1_x void io_config1(void) { uint32_t r0; // P1_0 r0 = LPC_IOCON->R_PIO1_0; PRINTF("R_%s0(dp9)", io_port_name1); put_spc(2); reg_print(SIZE_X, r0); put_spc(2); PRINTF( iomsg0 ); switch ( r0 & 0x7 ) { case 0: PRINTF(iomsg5); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("AD1"); break; case 3: PRINTF("32B1_CAP0"); break; } io_mode_hys_od(r0); if (r0 & 0x80) { PRINTF(", %s", iomsg6); } else { PRINTF(", %s", iomsg7); } put_rn(); // P1_1 r0 = LPC_IOCON->R_PIO1_1; PRINTF("R_%s1(dp10)", io_port_name1); put_spc(1); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg5); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("AD2"); break; case 3: PRINTF("32%s0", iomsg31); break; } io_mode_hys_od(r0); if (r0 & 0x80) { PRINTF(", %s", iomsg6); } else { PRINTF(", %s", iomsg7); } put_rn(); // P1_2 r0 = LPC_IOCON->R_PIO1_2; PRINTF("R_%s2(dp11)", io_port_name1); put_spc(1); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg5); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("AD3"); break; case 3: PRINTF("32%s1", iomsg31); break; } io_mode_hys_od( r0 ); if (r0 & 0x80) { PRINTF(", %s", iomsg6); } else { PRINTF(", %s", iomsg7); } put_rn(); // P1_3 r0 = LPC_IOCON->SWDIO_PIO1_3; PRINTF("SWDIO_%s3(dp12)",io_port_name1); put_spc(1); reg_print(SIZE_X, r0); put_spc(3); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF("SWDIO"); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("AD4"); break; case 3: PRINTF("32%s2", iomsg31); break; } io_mode_hys_od(r0); if (r0 & 0x80) { PRINTF(", %s", iomsg6); } else { PRINTF(", %s", iomsg7); } put_rn(); // P1_4 r0 = LPC_IOCON->PIO1_4; PRINTF("%s4(dp13)",io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF( iomsg0 ); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("AD5"); break; case 2: PRINTF("32%s3", iomsg31); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P1_5 r0 = LPC_IOCON->PIO1_5; PRINTF("%s5(dp14)",io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("RTS"); break; case 2: PRINTF("32B0_CAP0"); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P1_6 r0 = LPC_IOCON->PIO1_6; PRINTF("%s6(dp15)", io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("RXD"); break; case 2: PRINTF( "32%s0", iomsg30 ); break; } put_lin(); io_mode_hys_od( r0 ); put_rn(); // P1_7 r0 = LPC_IOCON->PIO1_7; PRINTF("%s7(dp16)", io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("TXD"); break; case 2: PRINTF("32%s1", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P1_8 r0 = LPC_IOCON->PIO1_8; PRINTF("%s8(dp17)", io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("32%s1", iomsg30); break; } put_lin(); io_mode_hys_od(r0); put_rn(); // P1_9 r0 = LPC_IOCON->PIO1_9; PRINTF("%s9(dp18)", io_port_name1); put_spc(3); reg_print(SIZE_X, r0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("16%s0", iomsg31); break; case 2: PRINTF("MOSI1"); break; } put_lin(); io_mode_hys_od(r0); put_rn(); } #endif // USE_PORT #if USE_SPI void spi_reg(int no) { uint32_t n, r0, r1 ,r2, r3, r4, r5, r6, r7, r8; if (no == SPI_0) { n = 0; r0 = LPC_SSP0->CR1; r1 = LPC_SSP0->DR; r2 = LPC_SSP0->SR; r3 = LPC_SSP0->CPSR; r4 = LPC_SSP0->IMSC; r5 = LPC_SSP0->RIS; r6 = LPC_SSP0->MIS; r7 = LPC_SSP0->ICR; r8 = LPC_SSP0->CR0; } else if (no == SPI_1) { n = 1; r0 = LPC_SSP1->CR1; r1 = LPC_SSP1->DR; r2 = LPC_SSP1->SR; r3 = LPC_SSP1->CPSR; r4 = LPC_SSP1->IMSC; r5 = LPC_SSP1->RIS; r6 = LPC_SSP1->MIS; r7 = LPC_SSP1->ICR; r8 = LPC_SSP1->CR0; } else { return; } PRINTF("Show SSP%1d(SPI%1d) Registers", n, n); put_rn(); PRINTF("CR0"); PRINTF(imsg2); reg_print(SIZE8, r8); put_rn(); PRINTF("CR1"); PRINTF(imsg2); reg_print(SIZE8, r0); put_rn(); PRINTF("DR"); PRINTF(imsg4); reg_print(SIZE8, r1); put_rn(); PRINTF("SR"); PRINTF(imsg3); reg_print(SIZE8, r2); put_rn(); PRINTF("CPSR"); PRINTF(imsg5); reg_print(SIZE8, r3); put_rn(); PRINTF("IMSC"); PRINTF(imsg2); reg_print(SIZE8, r4); put_rn(); PRINTF("RIS"); PRINTF(imsg3); reg_print(SIZE8, r5); put_rn(); PRINTF("MIS"); PRINTF(imsg3); reg_print(SIZE8, r6); put_rn(); PRINTF("ICR"); PRINTF(imsg2); reg_print(SIZE8, r7); put_rn(); } #endif //USE_SPI #if USE_UART void uart_reg(void) { uint32_t r0,r1,r2,r3,r4,r5,r6; // clear LCR[DLAB] to read registers LPC_UART->LCR &= ~(1 << 7); r0 = LPC_UART->RBR; r1 = LPC_UART->IER; r2 = LPC_UART->IIR; r3 = LPC_UART->TER; // set LCR[DLAB] to enable writing to divider registers LPC_UART->LCR |= (1 << 7); r4 = LPC_UART->DLL; r5 = LPC_UART->DLM; r6 = LPC_UART->FDR; // clear LCR[DLAB] LPC_UART->LCR &= ~(1 << 7); // Print each register PRINTF("Show UART Registers"); put_rn(); PRINTF("RBR"); PRINTF(imsg4); reg_print(SIZE8, r0); put_rn(); PRINTF("THR--Write only"); PRINTF(imsg4); put_rn(); PRINTF("DLL"); PRINTF(imsg2); reg_print(SIZE8, r4); put_rn(); PRINTF("DLM"); PRINTF(imsg2); reg_print(SIZE8, r5); put_rn(); PRINTF("IER"); PRINTF(imsg2); reg_print(SIZE8, r1); put_rn(); PRINTF("IIR"); PRINTF(imsg2); reg_print(SIZE8, r2); put_rn(); PRINTF("FCR--Write only"); PRINTF(imsg2); put_rn(); PRINTF("LCR,MCR,MSR,SCR,ACR--Not support"); put_rn(); PRINTF("FDR"); PRINTF(imsg2); reg_print(SIZE8, r6); put_rn(); PRINTF("TER"); PRINTF(imsg3); reg_print(SIZE8, r3); put_rn(); PRINTF("RS485CTRL,485ADRMATCH,485DLY--Not support"); put_rn(); } #endif //USE_UART //#if USE_SYS void cpu_inf (void) { unsigned long m1, m2; m1 = SCB->CPUID; m2 = (m1 >> 24); if (m2 == 0x41) { put_r(); PRINTF("CPU = ARM "); } else { put_r(); PRINTF("CPU = NOT ARM "); } m2 = (m1 >> 4) & 0xfff; if (m2 == 0xc23) { PRINTF("Cortex-M3"); put_rn(); } else if (m2 == 0xc20) { PRINTF("Cortex-M0"); put_rn(); } else { PRINTF("NOT Cortex-M3,M0"); put_rn(); } m2 = (m1 >> 20) & 0x0f; PRINTF("Variant:%x", m2); put_rn(); m2 = m1 & 0x7; PRINTF("Revision:%x", m2); put_rn(); #if 0 // unique ID // http://nemuisan.blog.bai.ne.jp/?eid=192845 m1 = *(__IO uint32_t *)((uint32_t)0x1FFF7A22); PRINTF("Unique device ID(94bits):(1) 0x%08x ", m1); m1 = *(__IO uint32_t *)((uint32_t)0x1FFF7A26); PRINTF("(2) 0x%08x ", m1); m1 = *(__IO uint32_t *)((uint32_t)0x1FFF7A2A); PRINTF( "(3) 0x%08x", m1 ); put_rn(); // m1 = DBGMCU->IDCODE; // PRINTF( "DBG ID: 0x%08x", m1 ); #endif } // Calculate CPU System Clock Frequency void get_freq(int pr) { uint32_t wdt_osc = 0, pll_fct0 = 0, pll_fct1 = 0; // Determine clock frequency according to clock register values switch ((LPC_SYSCON->WDTOSCCTRL >> 5) & 0x0F) { case 0: wdt_osc = 400000; break; case 1: wdt_osc = 500000; break; case 2: wdt_osc = 800000; break; case 3: wdt_osc = 1100000; break; case 4: wdt_osc = 1400000; break; case 5: wdt_osc = 1600000; break; case 6: wdt_osc = 1800000; break; case 7: wdt_osc = 2000000; break; case 8: wdt_osc = 2200000; break; case 9: wdt_osc = 2400000; break; case 10: wdt_osc = 2600000; break; case 11: wdt_osc = 2700000; break; case 12: wdt_osc = 2900000; break; case 13: wdt_osc = 3100000; break; case 14: wdt_osc = 3200000; break; case 15: wdt_osc = 3400000; break; } wdt_osc /= ((LPC_SYSCON->WDTOSCCTRL & 0x1F) << 1) + 2; put_r(); switch (LPC_SYSCON->MAINCLKSEL & 0x03) { case 0: // Internal RC oscillator SystemCoreClock = __IRC_OSC_CLK; if(pr) { PRINTF("%s = %dHz", fmsg0, SystemCoreClock); } break; case 1: // Input Clock to System PLL switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) { case 0: // Internal RC oscillator SystemCoreClock = __IRC_OSC_CLK; if(pr) { PRINTF("%s = %dHz", fmsg0, SystemCoreClock); } break; case 1: // System oscillator SystemCoreClock = __SYS_OSC_CLK; if(pr) { PRINTF("%s = %dHz", fmsg1, SystemCoreClock ); } break; case 2: // WDT Oscillator SystemCoreClock = wdt_osc; if(pr) { PRINTF("%s = %dHz", fmsg2, wdt_osc ); } break; case 3: // Reserved SystemCoreClock = 0; if(pr) { PRINTF(fmsg7); } break; } break; case 2: // WDT Oscillator SystemCoreClock = wdt_osc; if(pr) { PRINTF("%s = %dHz", fmsg2, wdt_osc ); } break; case 3: // System PLL Clock Out switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) { case 0: // Internal RC oscillator if (LPC_SYSCON->SYSPLLCTRL & 0x180) { SystemCoreClock = __IRC_OSC_CLK; if(pr) { PRINTF("%s = %dHz", fmsg0, SystemCoreClock); } } else { pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1; pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL; SystemCoreClock = __IRC_OSC_CLK * pll_fct0; if(pr) { PRINTF("Use Internal RC = %dHz", __IRC_OSC_CLK); put_rn(); PRINTF("%s %s = %dHz", fmsg0, fmsg3, SystemCoreClock); put_rn(); PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0); } } break; case 1: // System oscillator if (LPC_SYSCON->SYSPLLCTRL & 0x180) { SystemCoreClock = __SYS_OSC_CLK; if(pr) { PRINTF("%s = %dHz", fmsg1, SystemCoreClock ); } } else { pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1; pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL; SystemCoreClock = __SYS_OSC_CLK * pll_fct0; if(pr) { PRINTF("Use XTAL = %dHz", __XTAL); put_rn(); PRINTF("%s %s = %dHz", fmsg1, fmsg3, SystemCoreClock); put_rn(); PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0); } } break; case 2: // WDT Oscillator if (LPC_SYSCON->SYSPLLCTRL & 0x180) { SystemCoreClock = wdt_osc; if(pr) { PRINTF("%s = %dHz", fmsg2, wdt_osc ); } } else { pll_fct0 = (LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1; pll_fct1 = (LPC_SYSCON->SYSPLLCTRL & 0x060) >> 5UL; SystemCoreClock = wdt_osc * pll_fct0; if(pr) { PRINTF("Use WDT OSC = %dHz", wdt_osc); put_rn(); PRINTF("%s %s = %dHz", fmsg2, fmsg3, SystemCoreClock); put_rn(); PRINTF("%s %d, %s %d", fmsg5, pll_fct1, fmsg6, pll_fct0); } } break; case 3: // Reserved SystemCoreClock = 0; if(pr) { PRINTF("fmsg7"); } break; } break; } SystemCoreClock /= LPC_SYSCON->SYSAHBCLKDIV; if(pr) { put_rn(); PRINTF("%s %dHz", fmsg4, SystemCoreClock); put_rn(); } } //#endif //USE_SYS #if USE_I2C void i2c_io_reg (void) { uint32_t r0; PRINTF("<Show IO Pin>"); put_rn(); // P0_4 r0 = LPC_IOCON->PIO0_4; reg_print(SIZE_X, r0); put_spc(2); PRINTF("%s4(dp27)",io_port_name0); put_spc(2); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("SCL"); break; } put_lin(); switch (( r0 >> 8 ) & 0x3) { case 0: PRINTF(iomsg4); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("Fast md"); break; case 3: PRINTF(iomsg2); break; } put_rn(); // P0_5 r0 = LPC_IOCON->PIO0_5; reg_print( SIZE_X, r0 ); put_spc(2); PRINTF("%s5(dp5)",io_port_name0); put_spc(3); PRINTF(iomsg0); switch (r0 & 0x7) { case 0: PRINTF(iomsg1); break; case 1: PRINTF("SDA"); break; } put_lin(); switch ((r0 >> 8 ) & 0x3) { case 0: PRINTF(iomsg4); break; case 1: PRINTF(iomsg1); break; case 2: PRINTF("Fast md"); break; case 3: PRINTF(iomsg2); break; } put_rn(); } void i2c_reg (void) { uint32_t r0,r1,r2,r3,r4,r5,r6,r7; r0 = LPC_I2C->CONSET; r1 = LPC_I2C->STAT; r2 = LPC_I2C->DAT; r3 = LPC_I2C->SCLH; r4 = LPC_I2C->SCLL; r5 = LPC_I2C->CONCLR; r6 = LPC_I2C->MMCTRL; r7 = LPC_I2C->DATA_BUFFER; PRINTF("<Show I2C Registers>"); put_rn(); reg_print(SIZE8, r0); put_spc(2); PRINTF("CONSET"); PRINTF(imsg2); put_rn(); reg_print(SIZE8, r1); put_spc(2); PRINTF("STAT"); PRINTF(imsg3); put_rn(); reg_print(SIZE8, r2); put_spc(2); PRINTF("DAT"); PRINTF(imsg4); put_rn(); put_spc(2); PRINTF("ADR0--Not support"); put_rn(); reg_print(SIZE8, r3); put_spc(2); PRINTF("SCLH"); PRINTF(imsg2); put_rn(); reg_print(SIZE8, r4); put_spc(2); PRINTF("SCLL"); PRINTF(imsg2); put_rn(); reg_print(SIZE8, r5); put_spc(2); PRINTF("CONCLR"); PRINTF(imsg2); put_rn(); reg_print(SIZE8, r6); put_spc(2); PRINTF("MMCTRL"); PRINTF(imsg2); put_rn(); put_spc(2); PRINTF("ADR1,2,3--Not support"); put_rn(); reg_print(SIZE8, r7); put_spc(2); PRINTF("DATA_BUFFER"); PRINTF(imsg5); put_rn(); put_spc(2); PRINTF("MASK0,1,2,3--Not support"); put_rn(); } void i2c_freq (void) { uint32_t r0,r1; r0 = LPC_I2C->SCLH; r1 = LPC_I2C->SCLL; get_freq(0); PRINTF("<I2C Status>"); put_rn(); PRINTF("Freq. = I2CPCLK/(SCLH+SCLL) = %d/(%d+%d) = %d Hz", SystemCoreClock, r0, r1, SystemCoreClock/(r0+r1)); put_rn(); r0 = LPC_I2C->CONSET; PRINTF("I2C I/F "); if ( r0 & 0x40 ) { PRINTF("Enabled"); } else { PRINTF("disabled"); } put_rn(); } #endif //------------------------------------------------------------------------------------------------- // Monitor Main Program //------------------------------------------------------------------------------------------------- int mon_hw (void) { char *ptr; put_r(); PRINTF("%s [Help:'?' key]", mon_msg); put_rn(); #if USE_SYS get_freq(0); #endif //USE_SYS for (;;) { put_r(); PUTC('>'); ptr = linebuf; get_line(ptr, buf_size); switch (*ptr++) { //--------------------------------------------------------------------------------- // Memory //--------------------------------------------------------------------------------- case 'm' : #if USE_MEM mem_inf(ptr); put_rn(); break; #else not_select(); #endif // USE_MEM //--------------------------------------------------------------------------------- // Register //--------------------------------------------------------------------------------- case 'r' : uint8_t r_flg; put_r(); PRINTF("Reg. Mode p,u,i,s,t,a,d,l,w,c & ?"); put_rn(); r_flg = 0; for (; r_flg != 0xff;) { PRINTF("r>"); ptr = linebuf; get_line(ptr, buf_size); put_r(); switch(*ptr++) { case 'p' : #if USE_PORT put_r(); switch(*ptr++) { case '0' : io_config0(); break; case '1' : io_config1(); break; case '*' : io_config0(); put_rn(); io_config1(); break; case '?' : default: PRINTF("Enter p0,p1 and p* for all"); put_rn(); } #else not_select(); #endif // USE_PORT break; case 'u' : #if USE_UART uart_reg(); #else not_select(); #endif // USE_UART break; case 'i' : #if USE_I2C put_r(); i2c_io_reg(); i2c_reg(); i2c_freq(); #else not_select(); #endif // USE_I2C break; case 's' : #if USE_SPI switch(*ptr++) { case '0' : spi_reg(SPI_0); break; case '1' : spi_reg(SPI_1); break; case '*' : spi_reg(SPI_0); put_rn(); spi_reg( SPI_1 ); break; case '?' : default: PRINTF("Enter s0,s1 and s* for all"); put_rn(); } #else not_select(); #endif // USE_SPI break; case 't' : // not_yet_impliment(); break; case 'a' : // not_yet_impliment(); break; case 'd' : // not_yet_impliment(); break; case 'w' : // not_yet_impliment(); break; case 'l' : // not_yet_impliment(); break; case 'c' : // not_yet_impliment(); break; case 'x' : // not_yet_impliment(); break; case 'y' : // not_yet_impliment(); break; case 'q' : // quit r_flg = 0xff; break; case '?' : PRINTF("p - I/O Pin Config"); put_rn(); PRINTF("u - UART"); put_rn(); PRINTF("i - I2C"); put_rn(); PRINTF("s - SPI"); put_rn(); PRINTF("t - TIMER"); put_rn(); PRINTF("a - ADC"); put_rn(); PRINTF("d - DAC"); put_rn(); PRINTF("l - LDC"); put_rn(); PRINTF("w - WWDG"); put_rn(); PRINTF("c - COMP"); put_rn(); PRINTF("q - Exit mode"); put_rn(); break; default: PUTC('?'); put_rn(); } } PRINTF("Return to All Mode"); put_rn(); break; //--------------------------------------------------------------------------------- // System //--------------------------------------------------------------------------------- case 's' : // System related information #if USE_SYS switch (*ptr++) { case 'f' : // sc - show system clock frequency get_freq(1); break; case 'c' : // sc - show system CPU information cpu_inf(); break; case '?' : default: put_r(); PRINTF("sc - System CPU information"); put_rn(); PRINTF("sf - System Clock"); put_rn(); break; } #else not_select(); #endif // USE_SYS break; //--------------------------------------------------------------------------------- // Help //--------------------------------------------------------------------------------- case '?' : put_r(); msg_hlp_hw(); break; //--------------------------------------------------------------------------------- // Return to main routine //--------------------------------------------------------------------------------- case 'q' : // Quit PRINTF("\rReturn to monitor "); return 0; //--------------------------------------------------------------------------------- // Special command for DEBUG //--------------------------------------------------------------------------------- case 'x' : not_yet_impliment(); break; //--------------------------------------------------------------------------------- // no support //--------------------------------------------------------------------------------- default: PUTC('?'); put_rn(); break; } } } #endif // defined(TARGET_LPC1114)