From 8ed4f9abb2eee6c10d94284fe84f1e7bc8ba8908 Mon Sep 17 00:00:00 2001 From: stark1898y <1658608470@qq.com> Date: Tue, 3 Jun 2025 13:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E7=9A=84=E5=AE=9A=E6=97=B6=E5=99=A8?= =?UTF-8?q?=E6=89=93=E5=8D=B0=EF=BC=8C=E4=B8=8D=E9=87=8D=E5=90=AF=E4=BA=86?= =?UTF-8?q?=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APP/peripheral.c | 2 +- APP/peripheral_main.c | 3 + BSP/inc/bsp_iwdg.h | 8 ++- BSP/inc/bsp_tim.h | 2 +- BSP/src/bsp_adc.c | 5 ++ BSP/src/bsp_i2c.c | 4 +- BSP/src/bsp_iwdg.c | 23 +++++++- BSP/src/bsp_tim.c | 109 +++++++++++++++++++++++++++++++++++- BSP/src/bsp_valve.c | 5 +- HAL/SLEEP.c | 22 +------- Startup/startup_CH585.S | 18 +++--- StdPeriphDriver/CH58x_sys.c | 3 +- 12 files changed, 163 insertions(+), 41 deletions(-) diff --git a/APP/peripheral.c b/APP/peripheral.c index 429b583..895a2fa 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -53,7 +53,7 @@ void BSP_NoNeeedReplyCMd(void) // How often to perform periodic event // TODO:这里长点功耗低 -#define SBP_PERIODIC_EVT_PERIOD (1600 * 60 * 3) // (160 = 100ms) +#define SBP_PERIODIC_EVT_PERIOD (1600 * 60 * 1) // (160 = 100ms) // How often to perform read rssi event #define SBP_READ_RSSI_EVT_PERIOD (1600 * 3) // (160 = 100ms) diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index aebf32e..a082f27 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -265,6 +265,7 @@ int main(void) GAPRole_PeripheralInit(); Peripheral_Init(); + for (uint8_t i = 0; i < 10; i++) { if (TMOS_GetSystemClock() > 0) @@ -325,6 +326,8 @@ int main(void) IWDG_Init(IWDG_TIMEOUT_MS); + // BSP_TMR0_Init(); + // logDebug("BSP_Get_Tick1 %d", BSP_Get_Tick()); // DelayMs(1000); // logDebug("BSP_Get_Tick2 %d", BSP_Get_Tick()); diff --git a/BSP/inc/bsp_iwdg.h b/BSP/inc/bsp_iwdg.h index 18e9c43..df05fc1 100644 --- a/BSP/inc/bsp_iwdg.h +++ b/BSP/inc/bsp_iwdg.h @@ -21,10 +21,12 @@ #define RB_WR_PROTECT 0x40000000 // RO, write protect #define RB_IWDG_EN 0x80000000 // RO, watch-dog enable -#define IWDG_TIMEOUT_MS (10000) -#define IWDG_FEED_MS (3000) +#define IWDG_TIMEOUT_MS (5000) +#define IWDG_FEED_MS (2500) -#define IWIG_FEED_EVENT (0x01 << 0) +#define IWIG_FEED_EVENT (0x01 << 0) +#define TMR0_START_EVENT (0x01 << 1) +#define TMR0_END_EVENT (0x01 << 2) void IWDG_Init(uint16_t ms); diff --git a/BSP/inc/bsp_tim.h b/BSP/inc/bsp_tim.h index d4e466d..9cd6dc9 100644 --- a/BSP/inc/bsp_tim.h +++ b/BSP/inc/bsp_tim.h @@ -17,7 +17,7 @@ uint32_t CH5XX_GetTimeStamp(uint16_t *tick); uint32_t BSP_Get_Tick(void); - +void BSP_TMR0_Init(); diff --git a/BSP/src/bsp_adc.c b/BSP/src/bsp_adc.c index 729d6b7..21175a0 100644 --- a/BSP/src/bsp_adc.c +++ b/BSP/src/bsp_adc.c @@ -29,6 +29,11 @@ uint16_t min_number = 0; uint16_t max_number = 0; double voltage = 0; +// 读adc的 一般要看有没有中断调用,如果有中断调用, 就存在风险,否则就没啥风险 +// 通用的做是, 可以先复现, 看下复现时候的电流, 根据电流来判断大概运行的位置, +// 比如卡死时候电流为mA级别的, 可能就就是代码卡到某个函数里面了 +// , 这时候可以加入一个高优先级的定时器, 定时送PC指针,当卡死时候, 看下PC指针, 就能看到卡到什么地方了, + // https://www.cnblogs.com/iot-fan/p/14304854.html __HIGH_CODE uint8_t BSP_ReadVbat(void) diff --git a/BSP/src/bsp_i2c.c b/BSP/src/bsp_i2c.c index 02e157e..24a22b0 100644 --- a/BSP/src/bsp_i2c.c +++ b/BSP/src/bsp_i2c.c @@ -409,10 +409,10 @@ int BSP_ReadTempHumi(float *humi, float *temp) int ret; GXHTC3C_Wakeup(); - DelayMs(1); + DelayMs(2); GXHTC3C_GetStart(); - DelayMs(3); + DelayMs(4); float _humi, _temp; ret = GXHTC3C_GetTempHumi(&_humi, &_temp); if (ret == 0) diff --git a/BSP/src/bsp_iwdg.c b/BSP/src/bsp_iwdg.c index 7c9a636..3dd1034 100644 --- a/BSP/src/bsp_iwdg.c +++ b/BSP/src/bsp_iwdg.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 16:13:41 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-05-21 13:11:02 + * @LastEditTime : 2025-06-03 12:08:25 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_iwdg.c * @Description : * @@ -14,6 +14,8 @@ #include "log.h" #include "bsp_tim.h" +#include "SLEEP.h" + // https://www.cnblogs.com/debugdabiaoge/p/17580033.html // https://www.cnblogs.com/risc5-ble/p/17853714.html @@ -39,9 +41,27 @@ uint16_t IWDG_ProcessEvent(uint8_t task_id, uint16_t events) // uint8_t* a = tmos_msg_allocate(1); uint32_t tmos_memory_getlen(void); logDebug("tmos_memory_getlen = %d" , tmos_memory_getlen()); + + BSP_TMR0_Init(); + BSP_BlockSleep(); + // tmos_start_task(task_id, IWIG_FEED_EVENT, MS1_TO_SYSTEM_TIME(IWDG_FEED_MS)); return (events ^ IWIG_FEED_EVENT); } + if (events & TMR0_START_EVENT) + { + BSP_TMR0_Init(); + BSP_BlockSleep(); + tmos_start_task(task_id, TMR0_END_EVENT, MS1_TO_SYSTEM_TIME(20)); + return (events ^ TMR0_START_EVENT); + } + if (events & TMR0_END_EVENT) + { + BSP_RequestSleep(); + tmos_start_task(IWDGTaskId, TMR0_START_EVENT, MS1_TO_SYSTEM_TIME(1000)); + return (events ^ TMR0_END_EVENT); + } + return 0; } @@ -82,6 +102,7 @@ void IWDG_Init(uint16_t ms) IWDGTaskId = TMOS_ProcessEventRegister(IWDG_ProcessEvent); // tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT); tmos_start_reload_task(IWDGTaskId, IWIG_FEED_EVENT, MS1_TO_SYSTEM_TIME(IWDG_FEED_MS)); + // tmos_start_task(IWDGTaskId, TMR0_START_EVENT, MS1_TO_SYSTEM_TIME(1000)); } // #define RB_RESET_FLAG 0x07 // RO: recent reset flag diff --git a/BSP/src/bsp_tim.c b/BSP/src/bsp_tim.c index 6a70104..b523833 100644 --- a/BSP/src/bsp_tim.c +++ b/BSP/src/bsp_tim.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 15:01:15 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-05-16 18:21:05 + * @LastEditTime : 2025-06-03 12:45:41 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_tim.c * @Description : * @@ -10,6 +10,20 @@ */ #include "bsp_tim.h" +#include "bsp_uart.h" +#include "log.h" + +#include "SLEEP.h" + +// https://www.cnblogs.com/debugdabiaoge/p/17580033.html +// https://www.cnblogs.com/risc5-ble/p/17853714.html + +#undef LOG_ENABLE +#define LOG_ENABLE 1 + +#undef LOG_TAG +#define LOG_TAG "tim" + // tick_1ms_cntSysTick_Handler()1ms +1 volatile uint32_t tick_1ms_cnt = 0; @@ -86,6 +100,99 @@ uint32_t BSP_Get_Tick(void) // logDebug("seconds = %d.%d", seconds, tick_1sec * 1000 / 32768); } + + +/* ʱ0趨100msʱIOƣ PB15-LED */ +void BSP_TMR0_Init() +{ + TMR0_TimerInit(FREQ_SYS / 1000 * 20); // öʱʱ + // TMR0_TimerInit(FREQ_SYS); // öʱʱ + TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // ж + PFIC_EnableIRQ(TMR0_IRQn); +} + +/********************************************************************* + * @fn TMR0_IRQHandler + * + * @brief TMR0жϺ + * + * @return none + */ +__INTERRUPT +__HIGH_CODE +void TMR0_IRQHandler(void) // TMR0 ʱж +{ + if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)) + { + TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // жϱ־ + + BSP_RequestSleep(); + PFIC_DisableIRQ(TMR0_IRQn); + #if 0 + uint32_t v_mepc, v_mcause, v_mtval; + logDebug("hardfault\n"); + + v_mepc = __get_MEPC(); + v_mcause = __get_MCAUSE(); + v_mtval = __get_MTVAL(); + + logDebug("mepc:%08x\n", v_mepc); + logDebug("mcause:%08x\n", v_mcause); + logDebug("mtval:%08x\n", v_mtval); + + FLASH_ROM_SW_RESET(); + sys_safe_access_enable(); + R16_INT32K_TUNE = 0xFFFF; + sys_safe_access_disable(); + sys_safe_access_enable(); + R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET; + sys_safe_access_disable(); + #endif + // 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) + // { + // logDebug("|%8x,%8x,%8d.....\n", MemHead->used, (uint32_t)MemHead, + // (uint32_t)(MemHead->pNext) - (uint32_t)MemHead - sizeof(struct __MEMORY_CTL)); + // MemHead = MemHead->pNext; + // } + // logDebug("\n"); + + uint32_t v_mepc, v_mcause, v_mtval; + + v_mepc = __get_MEPC(); + v_mcause = __get_MCAUSE(); + v_mtval = __get_MTVAL(); + + logDebug("00000000000000000"); + logDebug("mepc:%08x", v_mepc); + logDebug("mcause:%08x", v_mcause); + logDebug("mtval:%08x", v_mtval); + logDebug("1111111111111111"); + + #if 0 + FLASH_ROM_SW_RESET(); + sys_safe_access_enable(); + R16_INT32K_TUNE = 0xFFFF; + sys_safe_access_disable(); + sys_safe_access_enable(); + R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET; + sys_safe_access_disable(); + #endif + // while (1); + } +} + // SysTickжϺ __INTERRUPT __HIGH_CODE diff --git a/BSP/src/bsp_valve.c b/BSP/src/bsp_valve.c index 58aee94..caf956f 100644 --- a/BSP/src/bsp_valve.c +++ b/BSP/src/bsp_valve.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 15:01:15 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-05-30 16:53:07 + * @LastEditTime : 2025-06-03 10:43:05 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c * @Description : * @@ -474,6 +474,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) boost_en_flag = 0; return (events ^ VAVLE_CLOSE_END_EVT); } +#if 0 // 开始测量电磁铁电感 if (events & VAVLE_DECT_SWITCH_START_EVT) { @@ -507,7 +508,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) return (events ^ VAVLE_DECT_SWITCH_CALIB_EVT); } - +#endif if (events & VAVLE_LOW_VBAT_ALARM_EVT) { logDebug("VAVLE_LOW_VBAT_ALARM_EVT"); diff --git a/HAL/SLEEP.c b/HAL/SLEEP.c index 0d509db..b4a4a01 100644 --- a/HAL/SLEEP.c +++ b/HAL/SLEEP.c @@ -142,32 +142,17 @@ uint32_t CH58x_LowPower(uint32_t time) __nop(); } #endif + + BSP_KEY_EnterLowpower(); // LOW POWER-sleepģʽ if (!RTCTigFlag) { - if (block_boost_flag == false) - { - BOOST_EN; - } - else - { - BOOST_OFF_DEINIT; - } - if (true == block_sleep_flag) - { - // logDebug("block_sleep"); - return 0; - } - BSP_KEY_EnterLowpower(); - LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND); R8_RTC_FLAG_CTRL = (RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR); RTC_SetTignTime(time); sys_safe_access_enable(); R8_HFCK_PWR_CTRL |= RB_CLK_XT32M_KEEP; sys_safe_access_disable(); - - if(!RTCTigFlag) { LowPower_Halt(); @@ -175,9 +160,6 @@ uint32_t CH58x_LowPower(uint32_t time) R8_RTC_FLAG_CTRL = (RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR); HSECFG_Current(HSE_RCur_100); // Ϊ(͹ĺHSEƫõ) - // i = RTC_GetCycle32k(); - // while (i == RTC_GetCycle32k()); - return 0; } #endif diff --git a/Startup/startup_CH585.S b/Startup/startup_CH585.S index e0fe74e..b293657 100644 --- a/Startup/startup_CH585.S +++ b/Startup/startup_CH585.S @@ -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. *******************************************************************************/ @@ -125,24 +125,24 @@ PWMX_SPI1_IRQHandler: TMR3_IRQHandler: UART2_IRQHandler: UART3_IRQHandler: -WDOG_BAT_IRQHandler: +WDOG_BAT_IRQHandler: NFC_IRQHandler: USB2_DEVICE_IRQHandler: USB2_HOST_IRQHandler: LED_IRQHandler: -1: +1: j 1b .section .handle_reset,"ax",@progbits .weak handle_reset .align 1 handle_reset: -.option push -.option norelax +.option push +.option norelax la gp, __global_pointer$ -.option pop +.option pop 1: - la sp, _eusrstack + la sp, _eusrstack /* Load highcode_init code section from flash to RAM */ 2: @@ -210,7 +210,7 @@ __highcode_init: csrw 0x804, t0 li t0, 0x1 csrw 0xbc1, t0 - + li t0, 0x88 csrw mstatus, t0 la t0, _vector_base @@ -221,5 +221,5 @@ __highcode_init: la t0, main csrw mepc, t0 - + mret diff --git a/StdPeriphDriver/CH58x_sys.c b/StdPeriphDriver/CH58x_sys.c index 5190e12..bc6c799 100644 --- a/StdPeriphDriver/CH58x_sys.c +++ b/StdPeriphDriver/CH58x_sys.c @@ -129,7 +129,8 @@ void SetSysClock(SYS_CLKTypeDef sc) * * @return none */ -__attribute__((section(".highcode_init"))) void highcode_init(void) +__attribute__((section(".highcode_init"))) +void highcode_init(void) { R32_SAFE_MODE_CTRL |= RB_XROM_312M_SEL; R8_SAFE_MODE_CTRL &= ~RB_SAFE_AUTO_EN;