14 #if defined ( __CC_ARM ) 15 #if (__ARMCC_VERSION < 400000) 18 #pragma import _printf_widthprec 24 #if defined(DEBUG_ENABLE_SEMIHOST) 30 #define DEBUG_PORT UART0 34 #if !(defined(__ICCARM__) && (__VER__ >= 6010000)) 35 # if (__ARMCC_VERSION < 6040000) 41 #elif(__VER__ >= 8000000) 61 printf(
"r0 = 0x%x\n", stack[
r0]);
62 printf(
"r1 = 0x%x\n", stack[
r1]);
63 printf(
"r2 = 0x%x\n", stack[
r2]);
64 printf(
"r3 = 0x%x\n", stack[
r3]);
65 printf(
"r12 = 0x%x\n", stack[
r12]);
66 printf(
"lr = 0x%x\n", stack[
lr]);
67 printf(
"pc = 0x%x\n", stack[
pc]);
68 printf(
"psr = 0x%x\n", stack[
psr]);
79 printf(
"In Hard Fault Handler\n");
93 #if defined(DEBUG_ENABLE_SEMIHOST) 95 static char g_buf[16];
96 static char g_buf_len = 0;
100 # if defined ( __GNUC__ ) && !(__CC_ARM) && !(__ICCARM__) 102 # elif defined(__ICCARM__) // IAR 129 int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
147 void Get_LR_and_Branch(
void)
150 "B Hard_Fault_Handler \n" 160 void Stack_Use_MSP(
void)
163 "B Get_LR_and_Branch \n" 173 void HardFault_Handler_Ret(
void)
178 "BEQ Stack_Use_MSP \n" 180 "B Get_LR_and_Branch \n" 191 void SP_Read_Ready(
void)
193 asm(
"LDR R1, [R0, #24] \n" 195 "LDR R2, [pc, #8] \n" 197 "BNE HardFault_Handler_Ret \n" 199 "STR R1, [R0, #24] \n" 202 "B HardFault_Handler_Ret \n" 216 "B Get_LR_and_Branch \n" 267 BNE HardFault_Handler_Ret
273 HardFault_Handler_Ret
280 MRS R0, PSP ;stack use PSP
283 MRS R0, MSP ; stack use MSP
285 MOV R1, LR ; LR current
value 304 __asm int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
327 #else // ndef DEBUG_ENABLE_SEMIHOST 331 # if defined ( __GNUC__ ) && !(__CC_ARM) && !(__ICCARM__) 351 "B Hard_Fault_Handler \n" 354 "B Hard_Fault_Handler \n" 360 # elif defined(__ICCARM__) 362 void Get_LR_and_Branch(
void)
365 "B Hard_Fault_Handler \n" 369 void Stack_Use_MSP(
void)
372 "B Get_LR_and_Branch \n" 391 "BEQ Stack_Use_MSP \n" 393 "B Get_LR_and_Branch \n" 441 #ifndef NONBLOCK_PRINTF 456 #define BUF_SIZE 2048 459 static uint8_t u8Buf[BUF_SIZE] = {0};
460 static int32_t i32Head = 0;
461 static int32_t i32Tail = 0;
471 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
472 if(i32Tmp != i32Tail)
474 u8Buf[i32Head] =
'\r';
480 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
481 if(i32Tmp != i32Tail)
489 if(i32Tail == i32Head)
496 i32Tmp = i32Tail + 1;
497 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
506 }
while(i32Tail != i32Head);
523 #if defined(DEBUG_ENABLE_SEMIHOST) 524 g_buf[g_buf_len++] = ch;
525 g_buf[g_buf_len] =
'\0';
526 if(g_buf_len + 1 >=
sizeof(g_buf) || ch ==
'\n' || ch ==
'\0')
529 if(SH_DoCommand(0x04, (
int)g_buf,
NULL) != 0)
539 for(i = 0; i < g_buf_len; i++)
563 #ifdef DEBUG_ENABLE_SEMIHOST 564 # if defined (__CC_ARM) 566 while(SH_DoCommand(0x101, 0, &nRet) != 0)
570 SH_DoCommand(0x07, 0, &nRet);
576 while(SH_DoCommand(0x7, 0, &nRet) != 0)
678 #if defined (__GNUC__) && !defined(__ARMCC_VERSION) 680 int _write (
int fd,
char *ptr,
int len)
700 int _read (
int fd,
char *ptr,
int len)
747 #ifdef DEBUG_ENABLE_SEMIHOST 749 void __exit(
int return_code)
753 if(SH_DoCommand(0x18, 0x20026,
NULL) == 0)
762 void _sys_exit(
int return_code)
766 if(SH_DoCommand(0x18, 0x20026,
NULL) == 0)
int IsDebugFifoEmpty(void)
Check if debug message finished.
__asm int32_t HardFault_Handler(void)
This HardFault handler is implemented to show r0, r1, r2, r3, r12, lr, pc, psr.
void _ttywrch(int ch)
C library retargetting.
static void SendChar(int ch)
Routine to send a char.
NuMicro peripheral access layer header file.
void Hard_Fault_Handler(uint32_t stack[])
Hard fault handler.
int fputc(int ch, FILE *stream)
Write character to stream.
int ferror(FILE *stream)
Check error indicator.
int kbhit(void)
Check any char input from UART.
static void stackDump(uint32_t stack[])
Helper function to dump register while hard fault occurred.
static char GetChar(void)
Routine to get a char.
#define UART_FIFOSTS_TXEMPTYF_Msk
#define UART_FIFOSTS_RXEMPTY_Msk
static void SendChar_ToUART(int ch)
Routine to send a char.
#define NULL
NULL pointer.
int fgetc(FILE *stream)
Get character from UART debug port or semihosting input.
#define UART_FIFOSTS_TXFULL_Msk