|
1 | 1 | #include "panic.h" |
2 | 2 |
|
3 | | -// only compile in core debug mode |
4 | | -#ifdef __CORE_DEBUG |
5 | | -#include "../gpio/gpio.h" |
6 | | -#include "../../core_hooks.h" |
7 | | -#include "../usart/usart_sync.h" |
8 | | -#include <stdarg.h> |
9 | | -#include <stdio.h> |
10 | | -#include <hc32_ddl.h> |
| 3 | +#if ENABLE_PANIC_HANDLER |
11 | 4 |
|
12 | | -// only compile usart output code if a panic print is enabled |
13 | | -#ifdef PANIC_PRINT_ENABLED |
14 | | - |
15 | | -// panic usart baud rate |
16 | | -#ifndef PANIC_USART_BAUDRATE |
17 | | -#define PANIC_USART_BAUDRATE 115200 |
18 | | -#endif |
19 | | - |
20 | | -// panic usart configuration |
21 | | -const stc_usart_uart_init_t panic_usart_config = { |
22 | | - .enClkMode = UsartIntClkCkNoOutput, |
23 | | - .enClkDiv = UsartClkDiv_1, |
24 | | - .enDataLength = UsartDataBits8, |
25 | | - .enDirection = UsartDataLsbFirst, |
26 | | - .enStopBit = UsartOneStopBit, |
27 | | - .enParity = UsartParityNone, |
28 | | - .enSampleMode = UsartSampleBit8, |
29 | | - .enDetectMode = UsartStartBitFallEdge, |
30 | | - .enHwFlow = UsartRtsEnable, |
31 | | -}; |
| 5 | + #include "../usart/usart_sync.h" |
| 6 | + #include <hc32_ddl.h> |
| 7 | + #include <stdarg.h> |
| 8 | + #include <stdio.h> |
32 | 9 |
|
33 | 10 | // |
34 | | -// panic helper functions |
| 11 | +// default panic output |
35 | 12 | // |
36 | | -#define PANIC_PRINTF_BUFFER_SIZE 256 |
37 | | -char panic_printf_buffer[PANIC_PRINTF_BUFFER_SIZE]; |
38 | | - |
39 | | -void panic_begin(void) |
| 13 | +__attribute__((weak)) void panic_begin(void) |
40 | 14 | { |
41 | | - core_hook_panic_begin_pre(); |
| 15 | + #if PANIC_OUTPUT_AVAILABLE |
| 16 | + const stc_usart_uart_init_t panic_usart_config = { |
| 17 | + .enClkMode = UsartIntClkCkNoOutput, |
| 18 | + .enClkDiv = UsartClkDiv_1, |
| 19 | + .enDataLength = UsartDataBits8, |
| 20 | + .enDirection = UsartDataLsbFirst, |
| 21 | + .enStopBit = UsartOneStopBit, |
| 22 | + .enParity = UsartParityNone, |
| 23 | + .enSampleMode = UsartSampleBit8, |
| 24 | + .enDetectMode = UsartStartBitFallEdge, |
| 25 | + .enHwFlow = UsartRtsEnable, |
| 26 | + }; |
42 | 27 |
|
43 | | -// initialize USART |
44 | | -#ifdef PANIC_USART1_TX_PIN |
45 | | - usart_sync_init(M4_USART1, PANIC_USART1_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
46 | | -#endif |
47 | | -#ifdef PANIC_USART2_TX_PIN |
48 | | - usart_sync_init(M4_USART2, PANIC_USART2_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
49 | | -#endif |
50 | | -#ifdef PANIC_USART3_TX_PIN |
51 | | - usart_sync_init(M4_USART3, PANIC_USART3_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
52 | | -#endif |
53 | | -#ifdef PANIC_USART4_TX_PIN |
54 | | - usart_sync_init(M4_USART4, PANIC_USART4_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
55 | | -#endif |
| 28 | + // initialize USART |
| 29 | + #ifdef PANIC_USART1_TX_PIN |
| 30 | + usart_sync_init(M4_USART1, PANIC_USART1_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
| 31 | + #endif |
| 32 | + #ifdef PANIC_USART2_TX_PIN |
| 33 | + usart_sync_init(M4_USART2, PANIC_USART2_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
| 34 | + #endif |
| 35 | + #ifdef PANIC_USART3_TX_PIN |
| 36 | + usart_sync_init(M4_USART3, PANIC_USART3_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
| 37 | + #endif |
| 38 | + #ifdef PANIC_USART4_TX_PIN |
| 39 | + usart_sync_init(M4_USART4, PANIC_USART4_TX_PIN, PANIC_USART_BAUDRATE, &panic_usart_config); |
| 40 | + #endif |
| 41 | + #endif // PANIC_OUTPUT_AVAILABLE |
| 42 | +} |
| 43 | + |
| 44 | +__attribute__((weak)) void panic_puts(const char *str) |
| 45 | +{ |
| 46 | + // print to USART |
| 47 | + #ifdef PANIC_USART1_TX_PIN |
| 48 | + usart_sync_write(M4_USART1, str); |
| 49 | + #endif |
| 50 | + #ifdef PANIC_USART2_TX_PIN |
| 51 | + usart_sync_write(M4_USART2, str); |
| 52 | + #endif |
| 53 | + #ifdef PANIC_USART3_TX_PIN |
| 54 | + usart_sync_write(M4_USART3, str); |
| 55 | + #endif |
| 56 | + #ifdef PANIC_USART4_TX_PIN |
| 57 | + usart_sync_write(M4_USART4, str); |
| 58 | + #endif |
| 59 | +} |
56 | 60 |
|
57 | | - core_hook_panic_begin_post(); |
| 61 | +__attribute__((noreturn, weak)) void panic_end(void) |
| 62 | +{ |
| 63 | + #ifdef HANG_ON_PANIC |
| 64 | + // enter infinite loop |
| 65 | + while (1) |
| 66 | + ; |
| 67 | + #else |
| 68 | + // reset MCU |
| 69 | + NVIC_SystemReset(); |
| 70 | + #endif |
58 | 71 | } |
59 | 72 |
|
| 73 | +// |
| 74 | +// helper functions |
| 75 | +// |
| 76 | +static char panic_printf_buffer[PANIC_PRINTF_BUFFER_SIZE]; |
| 77 | + |
60 | 78 | size_t panic_printf(const char *fmt, ...) |
61 | 79 | { |
62 | | - // format the string into buffer |
63 | | - va_list args; |
64 | | - va_start(args, fmt); |
65 | | - size_t len = vsnprintf(panic_printf_buffer, PANIC_PRINTF_BUFFER_SIZE, fmt, args); |
66 | | - va_end(args); |
| 80 | + // format the string into buffer |
| 81 | + va_list args; |
| 82 | + va_start(args, fmt); |
| 83 | + size_t len = vsnprintf(panic_printf_buffer, PANIC_PRINTF_BUFFER_SIZE, fmt, args); |
| 84 | + va_end(args); |
67 | 85 |
|
68 | | - // print to USART |
69 | | -#ifdef PANIC_USART1_TX_PIN |
70 | | - usart_sync_write(M4_USART1, panic_printf_buffer); |
71 | | -#endif |
72 | | -#ifdef PANIC_USART2_TX_PIN |
73 | | - usart_sync_write(M4_USART2, panic_printf_buffer); |
74 | | -#endif |
75 | | -#ifdef PANIC_USART3_TX_PIN |
76 | | - usart_sync_write(M4_USART3, panic_printf_buffer); |
77 | | -#endif |
78 | | -#ifdef PANIC_USART4_TX_PIN |
79 | | - usart_sync_write(M4_USART4, panic_printf_buffer); |
80 | | -#endif |
| 86 | + // then use puts to print it |
| 87 | + panic_puts(panic_printf_buffer); |
81 | 88 |
|
82 | | - // return length of formatted string |
83 | | - return len; |
| 89 | + // return length of formatted string |
| 90 | + return len; |
84 | 91 | } |
85 | 92 |
|
86 | | -#endif // PANIC_PRINT_ENABLED |
87 | | - |
88 | | -void panic_end(void) |
| 93 | +void _panic(const char *message) |
89 | 94 | { |
90 | | - core_hook_panic_end(); |
| 95 | + if (message != NULL) |
| 96 | + { |
| 97 | + panic_begin(); |
| 98 | + panic_printf(message); |
| 99 | + } |
91 | 100 |
|
92 | | -#ifdef HANG_ON_PANIC |
93 | | - // enter infinite loop |
94 | | - while (1) |
95 | | - ; |
96 | | -#else |
97 | | - // reset MCU |
98 | | - NVIC_SystemReset(); |
99 | | -#endif |
| 101 | + panic_end(); |
100 | 102 | } |
101 | 103 |
|
102 | | -#endif // __CORE_DEBUG |
| 104 | +#endif // ENABLE_PANIC_HANDLER |
0 commit comments