From 0800db1400f97b9ed8da43216189f596659b1357 Mon Sep 17 00:00:00 2001 From: Jamie <48308473+JamieTx@users.noreply.github.com> Date: Wed, 22 Jan 2025 07:43:46 +0800 Subject: [PATCH] Add pm driver for F472 and add lVD unlock in board_init --- bsp/hc32/ev_hc32f448_lqfp80/board/board.c | 2 +- bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c | 2 +- bsp/hc32/ev_hc32f472_lqfp100/board/board.c | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c | 2 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c | 2 +- bsp/hc32/libraries/hc32_drivers/drv_pm.c | 8 ++++++++ bsp/hc32/libraries/hc32_drivers/drv_pm.h | 2 +- bsp/hc32/tests/test_pm.c | 16 ++++++++-------- 8 files changed, 22 insertions(+), 14 deletions(-) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c index 5e5aa64930..3b821593e6 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c @@ -15,7 +15,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c index 49a8f4392d..1e03c37f5e 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c @@ -14,7 +14,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c index 6a82da8f95..bb1fde8dbf 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c @@ -15,7 +15,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c index 54a661e0c0..d18b1402c5 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c @@ -14,7 +14,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c index 9f23f247f3..c254a68b6e 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c @@ -13,7 +13,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.c b/bsp/hc32/libraries/hc32_drivers/drv_pm.c index 00d2d2cc15..b9013b109d 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.c @@ -108,6 +108,7 @@ static void _sleep_enter_deep(void) (void)PWC_STOP_Config(&sleep_deep_cfg.cfg); +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) if (PWC_PWRC2_DVS == (READ_REG8(CM_PWC->PWRC2) & PWC_PWRC2_DVS)) { CLR_REG8_BIT(CM_PWC->PWRC1, PWC_PWRC1_STPDAS); @@ -116,6 +117,7 @@ static void _sleep_enter_deep(void) { SET_REG8_BIT(CM_PWC->PWRC1, PWC_PWRC1_STPDAS); } +#endif PWC_STOP_Enter(sleep_deep_cfg.pwc_stop_type); } @@ -161,14 +163,20 @@ static void _run_switch_high_to_low(void) struct pm_run_mode_config st_run_mode_cfg = PM_RUN_MODE_CFG; st_run_mode_cfg.sys_clk_cfg(PM_RUN_MODE_LOW_SPEED); + +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) PWC_HighSpeedToLowSpeed(); +#endif } static void _run_switch_low_to_high(void) { struct pm_run_mode_config st_run_mode_cfg = PM_RUN_MODE_CFG; +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) PWC_LowSpeedToHighSpeed(); +#endif + st_run_mode_cfg.sys_clk_cfg(PM_RUN_MODE_HIGH_SPEED); } diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.h b/bsp/hc32/libraries/hc32_drivers/drv_pm.h index e32dec436d..40c1004189 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.h +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.h @@ -91,7 +91,7 @@ struct pm_sleep_mode_shutdown_config ******************************************************************************/ #if defined(HC32F4A0) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET) && (EFM_GetStatus(EFM_FLAG_RDY1) == SET)) -#elif defined(HC32F460) || defined (HC32F448) +#elif defined(HC32F460) || defined (HC32F448) || defined (HC32F472) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET)) #endif #define PM_CHECK_XTAL() ((CM_CMU->XTALSTDCR & CLK_XTALSTD_ON) == 0) diff --git a/bsp/hc32/tests/test_pm.c b/bsp/hc32/tests/test_pm.c index dd54ccde53..bf463fa5dd 100644 --- a/bsp/hc32/tests/test_pm.c +++ b/bsp/hc32/tests/test_pm.c @@ -24,12 +24,14 @@ * PM_SLEEP_MODE_STANDBY | 掉电模式1或2(可配,默认配置是模式1) * PM_SLEEP_MODE_SHUTDOWN | 掉电模式3或4(可配,默认配置是模式3) * -* 操作步骤: +* 操作步骤1: * 1)按下按键K10: MCU进入休眠模式 * 2)再按下按键K10:MCU退出休眠模式 * 3)重复上述按键操作,MCU循环进入休眠模式(deep、standby、shutdown、idle)和退出对应的休眠模式。 * 每次进入休眠模式前,MCU打印 "sleep:" + 休眠模式名称 * 每次退出休眠模式后,MCU打印 "wake from sleep:" + 休眠模式名称 +* 操作步骤2: +* 1)支持运行模式切换的芯片循环切换 低速->高速->低速 运行模式,对应时钟输出口输出对应模式下的时钟信号 */ #include @@ -37,11 +39,8 @@ #include #include - #if defined(BSP_USING_PM) -#define EFM_ERASE_TIME_MAX_IN_MILLISECOND (20) - #if defined (HC32F4A0) #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) #define BSP_KEY_PORT (GPIO_PORT_A) /* Key10 */ @@ -101,10 +100,6 @@ #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ5) #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP1) #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP11) - - #define MCO_PORT (GPIO_PORT_A) - #define MCO_PIN (GPIO_PIN_08) - #define MCO_GPIO_FUNC (GPIO_FUNC_1) #endif #define KEYCNT_BACKUP_ADDR (uint32_t *)(0x200F0010) @@ -327,6 +322,7 @@ static void pm_cmd_handler(void *parameter) } } +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) static void pm_run_main(void *parameter) { static rt_uint8_t run_index = 0; @@ -354,6 +350,7 @@ static void pm_run_main(void *parameter) rt_thread_mdelay(3000); } } +#endif static void _keycnt_cmd_init_after_power_on(void) { @@ -440,6 +437,7 @@ int pm_sample_init(void) rt_kprintf("create pm sample thread failed!\n"); } +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) thread = rt_thread_create("pm_run_main", pm_run_main, RT_NULL, 1024, 25, 10); if (thread != RT_NULL) { @@ -449,6 +447,8 @@ int pm_sample_init(void) { rt_kprintf("create pm run thread failed!\n"); } +#endif + return RT_EOK; } MSH_CMD_EXPORT(pm_sample_init, pm sample init);