diff --git a/StdPeriphDriver/CH59x_sys.c b/StdPeriphDriver/CH59x_sys.c index 9a2b08a..5f08452 100644 --- a/StdPeriphDriver/CH59x_sys.c +++ b/StdPeriphDriver/CH59x_sys.c @@ -6,7 +6,7 @@ * Description ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. - * Attention: This software (modified or not) and binary are used for + * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ @@ -27,7 +27,7 @@ void SetSysClock(SYS_CLKTypeDef sc) sys_safe_access_enable(); R8_PLL_CONFIG &= ~(1 << 5); // sys_safe_access_disable(); - if(sc & 0x20) // HSE div + if (sc & 0x20) // HSE div { sys_safe_access_enable(); R32_CLK_SYS_CFG = (0 << 6) | (sc & 0x1f) | RB_TX_32M_PWR_EN | RB_PLL_PWR_EN; @@ -42,7 +42,7 @@ void SetSysClock(SYS_CLKTypeDef sc) sys_safe_access_disable(); } - else if(sc & 0x40) // PLL div + else if (sc & 0x40) // PLL div { sys_safe_access_enable(); R32_CLK_SYS_CFG = (1 << 6) | (sc & 0x1f) | RB_TX_32M_PWR_EN | RB_PLL_PWR_EN; @@ -61,7 +61,7 @@ void SetSysClock(SYS_CLKTypeDef sc) R32_CLK_SYS_CFG |= RB_CLK_SYS_MOD; sys_safe_access_disable(); } - //更改FLASH clk的驱动能力 + // 更改FLASH clk的驱动能力 sys_safe_access_enable(); R8_PLL_CONFIG |= 1 << 7; sys_safe_access_disable(); @@ -81,11 +81,11 @@ uint32_t GetSysClock(void) uint16_t rev; rev = R32_CLK_SYS_CFG & 0xff; - if((rev & 0x40) == (0 << 6)) + if ((rev & 0x40) == (0 << 6)) { // 32M进行分频 return (32000000 / (rev & 0x1f)); } - else if((rev & RB_CLK_SYS_MOD) == (1 << 6)) + else if ((rev & RB_CLK_SYS_MOD) == (1 << 6)) { // PLL进行分频 return (480000000 / (rev & 0x1f)); } @@ -106,7 +106,7 @@ uint32_t GetSysClock(void) */ uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i) { - if(i == STA_SAFEACC_ACT) + if (i == STA_SAFEACC_ACT) { return (R8_SAFE_ACCESS_SIG & RB_SAFE_ACC_ACT); } @@ -145,7 +145,7 @@ void SYS_ResetExecute(void) */ void SYS_DisableAllIrq(uint32_t *pirqv) { - *pirqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); + *pirqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); PFIC->IRER[0] = 0xffffffff; PFIC->IRER[1] = 0xffffffff; } @@ -195,7 +195,7 @@ void WWDG_ITCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; - if(s == DISABLE) + if (s == DISABLE) { ctrl &= ~RB_WDOG_INT_EN; } @@ -222,7 +222,7 @@ void WWDG_ResetCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; - if(s == DISABLE) + if (s == DISABLE) { ctrl &= ~RB_WDOG_RST_EN; } @@ -263,9 +263,41 @@ void WWDG_ClearFlag(void) */ __INTERRUPT __HIGH_CODE -__attribute__((weak)) -void HardFault_Handler(void) +__attribute__((weak)) void HardFault_Handler(void) { + // https://www.cnblogs.com/gscw/p/18159920 + // 监控函数和 PC 指针可以同时使用。监控函数需要在蓝牙工程中使用才有意义,如果打印值为空,检查是否使用蓝牙。 + struct __MEMORY_CTL + { + struct __MEMORY_CTL *pNext; + uint16_t len; + uint16_t used; + }; + typedef struct __MEMORY_CTL MemoryCtl; + + extern MemoryCtl *MemCtlStart; + extern MemoryCtl *MemCtlEnd; + MemoryCtl *MemHead; + MemHead = MemCtlStart; + while (MemHead != MemCtlEnd) + { + printf("|%8x,%8x,%8d.....\n", MemHead->used, (uint32_t)MemHead, + (uint32_t)(MemHead->pNext) - (uint32_t)MemHead - sizeof(struct __MEMORY_CTL)); + MemHead = MemHead->pNext; + } + printf("\n"); + + uint32_t v_mepc, v_mcause, v_mtval; + printf("hardfault\n"); + + v_mepc = __get_MEPC(); + v_mcause = __get_MCAUSE(); + v_mtval = __get_MTVAL(); + + printf("mepc:%08x\n", v_mepc); + printf("mcause:%08x\n", v_mcause); + printf("mtval:%08x\n", v_mtval); +#if 0 FLASH_ROM_SW_RESET(); sys_safe_access_enable(); R16_INT32K_TUNE = 0xFFFF; @@ -273,7 +305,8 @@ void HardFault_Handler(void) sys_safe_access_enable(); R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET; sys_safe_access_disable(); - while(1); +#endif + while (1); } /********************************************************************* @@ -289,27 +322,27 @@ __HIGH_CODE void mDelayuS(uint16_t t) { uint32_t i; -#if(FREQ_SYS == 80000000) +#if (FREQ_SYS == 80000000) i = t * 20; -#elif(FREQ_SYS == 60000000) +#elif (FREQ_SYS == 60000000) i = t * 15; -#elif(FREQ_SYS == 48000000) +#elif (FREQ_SYS == 48000000) i = t * 12; -#elif(FREQ_SYS == 40000000) +#elif (FREQ_SYS == 40000000) i = t * 10; -#elif(FREQ_SYS == 32000000) +#elif (FREQ_SYS == 32000000) i = t << 3; -#elif(FREQ_SYS == 24000000) +#elif (FREQ_SYS == 24000000) i = t * 6; -#elif(FREQ_SYS == 16000000) +#elif (FREQ_SYS == 16000000) i = t << 2; -#elif(FREQ_SYS == 8000000) +#elif (FREQ_SYS == 8000000) i = t << 1; -#elif(FREQ_SYS == 4000000) +#elif (FREQ_SYS == 4000000) i = t; -#elif(FREQ_SYS == 2000000) +#elif (FREQ_SYS == 2000000) i = t >> 1; -#elif(FREQ_SYS == 1000000) +#elif (FREQ_SYS == 1000000) i = t >> 2; #else i = t << 1; @@ -317,7 +350,7 @@ void mDelayuS(uint16_t t) do { __nop(); - } while(--i); + } while (--i); } /********************************************************************* @@ -334,7 +367,7 @@ void mDelaymS(uint16_t t) { uint16_t i; - for(i = 0; i < t; i++) + for (i = 0; i < t; i++) { mDelayuS(1000); } @@ -344,20 +377,20 @@ void mDelaymS(uint16_t t) int _write(int fd, char *buf, int size) { int i; - for(i = 0; i < size; i++) + for (i = 0; i < size; i++) { #if DEBUG == Debug_UART0 - while(R8_UART0_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ - R8_UART0_THR = *buf++; /* 发送数据 */ + while (R8_UART0_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ + R8_UART0_THR = *buf++; /* 发送数据 */ #elif DEBUG == Debug_UART1 - while(R8_UART1_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ - R8_UART1_THR = *buf++; /* 发送数据 */ + while (R8_UART1_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ + R8_UART1_THR = *buf++; /* 发送数据 */ #elif DEBUG == Debug_UART2 - while(R8_UART2_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ - R8_UART2_THR = *buf++; /* 发送数据 */ -#elif DEBUG == Debug_UART3 - while(R8_UART3_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ - R8_UART3_THR = *buf++; /* 发送数据 */ + while (R8_UART2_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ + R8_UART2_THR = *buf++; /* 发送数据 */ +#elif DEBUG == Debug_UART3 + while (R8_UART3_TFC == UART_FIFO_SIZE); /* 等待数据发送 */ + R8_UART3_THR = *buf++; /* 发送数据 */ #endif } return size; @@ -372,18 +405,15 @@ int _write(int fd, char *buf, int size) * * @return size: Data length */ -__attribute__((used)) -void *_sbrk(ptrdiff_t incr) +__attribute__((used)) void *_sbrk(ptrdiff_t incr) { extern char _end[]; extern char _heap_end[]; static char *curbrk = _end; if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; + return NULL - 1; curbrk += incr; return curbrk - incr; } - -