13#if defined ( __CC_ARM )
14#if (__ARMCC_VERSION < 400000)
17#pragma import _printf_widthprec
24#if !(defined(__ICCARM__) && (__VER__ >= 6010000))
43 printf(
"r0 = 0x%x\n", stack[
r0]);
44 printf(
"r1 = 0x%x\n", stack[
r1]);
45 printf(
"r2 = 0x%x\n", stack[
r2]);
46 printf(
"r3 = 0x%x\n", stack[
r3]);
47 printf(
"r12 = 0x%x\n", stack[
r12]);
48 printf(
"lr = 0x%x\n", stack[
lr]);
49 printf(
"pc = 0x%x\n", stack[
pc]);
50 printf(
"psr = 0x%x\n", stack[
psr]);
61 printf(
"In Hard Fault Handler\n");
75#if defined(DEBUG_ENABLE_SEMIHOST)
78static char g_buf_len = 0;
82# if defined ( __GNUC__ ) && !(__CC_ARM) && !(__ICCARM__)
84# elif defined(__ICCARM__)
111int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
129void Get_LR_and_Branch(
void)
132 "B Hard_Fault_Handler \n"
142void Stack_Use_MSP(
void)
145 "B Get_LR_and_Branch \n"
155void HardFault_Handler_Ret(
void)
160 "BEQ Stack_Use_MSP \n"
162 "B Get_LR_and_Branch \n"
173void SP_Read_Ready(
void)
175 asm(
"LDR R1, [R0, #24] \n"
177 "LDR R2, [pc, #8] \n"
179 "BNE HardFault_Handler_Ret \n"
181 "STR R1, [R0, #24] \n"
184 "B HardFault_Handler_Ret \n"
198 "B Get_LR_and_Branch \n"
249 BNE HardFault_Handler_Ret
262 MRS R0, PSP ;stack use PSP
265 MRS R0, MSP ; stack use MSP
267 MOV R1, LR ; LR current
value
286__asm int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
313# if defined ( __GNUC__ ) && !(__CC_ARM) && !(__ICCARM__)
333 "B Hard_Fault_Handler \n"
336 "B Hard_Fault_Handler \n"
342# elif defined(__ICCARM__)
344void Get_LR_and_Branch(
void)
347 "B Hard_Fault_Handler \n"
351void Stack_Use_MSP(
void)
354 "B Get_LR_and_Branch \n"
373 "BEQ Stack_Use_MSP \n"
375 "B Get_LR_and_Branch \n"
423#ifndef NONBLOCK_PRINTF
441 static uint8_t u8Buf[BUF_SIZE] = {0};
442 static int32_t i32Head = 0;
443 static int32_t i32Tail = 0;
451 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
452 if(i32Tmp != i32Tail)
461 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
462 if(i32Tmp != i32Tail)
464 u8Buf[i32Head] =
'\r';
471 if(i32Tail == i32Head)
478 i32Tmp = i32Tail + 1;
479 if(i32Tmp > BUF_SIZE) i32Tmp = 0;
488 }
while(i32Tail != i32Head);
503#if defined(DEBUG_ENABLE_SEMIHOST)
504 g_buf[g_buf_len++] = ch;
505 g_buf[g_buf_len] =
'\0';
506 if(g_buf_len + 1 >=
sizeof(g_buf) || ch ==
'\n' || ch ==
'\0')
509 if(SH_DoCommand(0x04, (
int)g_buf,
NULL) != 0)
535#ifdef DEBUG_ENABLE_SEMIHOST
536# if defined (__CC_ARM)
538 while(SH_DoCommand(0x101, 0, &nRet) != 0)
542 SH_DoCommand(0x07, 0, &nRet);
548 while(SH_DoCommand(0x7, 0, &nRet) != 0)
640#if defined ( __GNUC__ )
642int _write (
int fd,
char *ptr,
int len)
659int _read (
int fd,
char *ptr,
int len)
706#ifdef DEBUG_ENABLE_SEMIHOST
708void __exit(
int return_code)
712 if(SH_DoCommand(0x18, 0x20026,
NULL) == 0)
721void _sys_exit(
int return_code)
725 if(SH_DoCommand(0x18, 0x20026,
NULL) == 0)
#define UART_FIFOSTS_TXFULL_Msk
#define UART_FIFOSTS_TXEMPTYF_Msk
#define UART_FIFOSTS_RXEMPTY_Msk
NuMicro peripheral access layer header file.
void _ttywrch(int ch)
C library retargetting.
__asm int32_t HardFault_Handler(void)
This HardFault handler is implemented to show r0, r1, r2, r3, r12, lr, pc, psr.
int fputc(int ch, FILE *stream)
Write character to stream.
int ferror(FILE *stream)
Check error indicator.
int IsDebugFifoEmpty(void)
Check if debug message finished.
void SendChar_ToUART(int ch)
Routine to send a char.
int kbhit(void)
Check any char input from UART.
int fgetc(FILE *stream)
Get character from UART debug port or semihosting input.
void Hard_Fault_Handler(uint32_t stack[])
Hard fault handler.
void SendChar(int ch)
Routine to send a char.
char GetChar(void)
Routine to get a char.
static void stackDump(uint32_t stack[])
Helper function to dump register while hard fault occurred.