平台keil V5.31主函数int32_t main(void) { uint8_t i 0U; /* Register write unprotected for some required peripherals. */ LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM); /* Set bus clock div. */ CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \ CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2)); /* BSP key initialize */ BSP_KEY_Init(); /* sram init include read/write wait cycle setting */ SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1); SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); /* flash read wait cycle setting */ EFM_SetWaitCycle(EFM_WAIT_CYCLE5); /* output system clock */ MCOInit(); /* Xtal initialize */ XtalInit(); /* Xtal32 initialize*/ BSP_XTAL32_Init(); /* MPLL initialize */ MPLLInit(); /* enable LRC */ (void)CLK_LrcCmd(ENABLE); /* enable HRC */ (void)CLK_HrcCmd(ENABLE); /* Switch driver ability */ PWC_HighSpeedToHighPerformance(); /* Register write protected for some required peripherals. */ LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_GPIO | LL_PERIPH_SRAM); for (;;) { if (SET BSP_KEY_GetStatus(BSP_KEY_10)) { CLK_SetSysClockSrc(au8SysClockTbl[i]); while (RESET ! BSP_KEY_GetStatus(BSP_KEY_10)); i; if (i sizeof(au8SysClockTbl) / sizeof(au8SysClockTbl[0U])) { i 0U; } } } }因为没有焊接32768晶振再执行BSP_XTAL32_Init();导致锁死无法正常烧录。需要配合PB11和NRST才可以恢复烧录。配置static uint8_t au8SysClockTbl[] { CLK_SYSCLK_SRC_HRC, CLK_SYSCLK_SRC_MRC, CLK_SYSCLK_SRC_LRC, CLK_SYSCLK_SRC_XTAL, CLK_SYSCLK_SRC_XTAL32, CLK_SYSCLK_SRC_PLL, };几个函数static void MCOInit(void) { /* Configure clock output pin */ GPIO_SetFunc(MCO_PORT, MCO_PIN, MCO_GPIO_FUNC); /* Configure clock output system clock */ CLK_MCOConfig(CLK_MCO1, CLK_MCO_SRC_HCLK, CLK_MCO_DIV8); /* MCO1 output enable */ CLK_MCOCmd(CLK_MCO1, ENABLE); } /** * brief Xtal initialize * param None * retval None */ static void XtalInit(void) { stc_clock_xtal_init_t stcXtalInit; /* XTAL config */ GPIO_AnalogCmd(BSP_XTAL_PORT, BSP_XTAL_PIN, ENABLE); (void)CLK_XtalStructInit(stcXtalInit); /* Config Xtal and Enable Xtal */ stcXtalInit.u8State CLK_XTAL_ON; stcXtalInit.u8Mode CLK_XTAL_MD_OSC; stcXtalInit.u8Drv CLK_XTAL_DRV_ULOW; stcXtalInit.u8StableTime CLK_XTAL_STB_2MS; (void)CLK_XtalInit(stcXtalInit); } /** * brief MPLL initialize * param None * retval None */ static void MPLLInit(void) { stc_clock_pll_init_t stcMPLLInit; (void)CLK_PLLStructInit(stcMPLLInit); /* MPLL config */ /* 8MHz/M*N 8/1*50/2 200MHz */ stcMPLLInit.PLLCFGR 0UL; stcMPLLInit.PLLCFGR_f.PLLM (1UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLN (50UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLP (2UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLQ (2UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLR (2UL - 1UL); stcMPLLInit.u8PLLState CLK_PLL_ON; stcMPLLInit.PLLCFGR_f.PLLSRC CLK_PLL_SRC_XTAL; /* Xtal 8MHz */ (void)CLK_PLLInit(stcMPLLInit); }屏蔽掉32768晶振部分后通过按键可以看到频率被切换。
小华芯片HC32F460之时钟实验
发布时间:2026/7/9 1:02:48
平台keil V5.31主函数int32_t main(void) { uint8_t i 0U; /* Register write unprotected for some required peripherals. */ LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM); /* Set bus clock div. */ CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \ CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2)); /* BSP key initialize */ BSP_KEY_Init(); /* sram init include read/write wait cycle setting */ SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1); SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); /* flash read wait cycle setting */ EFM_SetWaitCycle(EFM_WAIT_CYCLE5); /* output system clock */ MCOInit(); /* Xtal initialize */ XtalInit(); /* Xtal32 initialize*/ BSP_XTAL32_Init(); /* MPLL initialize */ MPLLInit(); /* enable LRC */ (void)CLK_LrcCmd(ENABLE); /* enable HRC */ (void)CLK_HrcCmd(ENABLE); /* Switch driver ability */ PWC_HighSpeedToHighPerformance(); /* Register write protected for some required peripherals. */ LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_GPIO | LL_PERIPH_SRAM); for (;;) { if (SET BSP_KEY_GetStatus(BSP_KEY_10)) { CLK_SetSysClockSrc(au8SysClockTbl[i]); while (RESET ! BSP_KEY_GetStatus(BSP_KEY_10)); i; if (i sizeof(au8SysClockTbl) / sizeof(au8SysClockTbl[0U])) { i 0U; } } } }因为没有焊接32768晶振再执行BSP_XTAL32_Init();导致锁死无法正常烧录。需要配合PB11和NRST才可以恢复烧录。配置static uint8_t au8SysClockTbl[] { CLK_SYSCLK_SRC_HRC, CLK_SYSCLK_SRC_MRC, CLK_SYSCLK_SRC_LRC, CLK_SYSCLK_SRC_XTAL, CLK_SYSCLK_SRC_XTAL32, CLK_SYSCLK_SRC_PLL, };几个函数static void MCOInit(void) { /* Configure clock output pin */ GPIO_SetFunc(MCO_PORT, MCO_PIN, MCO_GPIO_FUNC); /* Configure clock output system clock */ CLK_MCOConfig(CLK_MCO1, CLK_MCO_SRC_HCLK, CLK_MCO_DIV8); /* MCO1 output enable */ CLK_MCOCmd(CLK_MCO1, ENABLE); } /** * brief Xtal initialize * param None * retval None */ static void XtalInit(void) { stc_clock_xtal_init_t stcXtalInit; /* XTAL config */ GPIO_AnalogCmd(BSP_XTAL_PORT, BSP_XTAL_PIN, ENABLE); (void)CLK_XtalStructInit(stcXtalInit); /* Config Xtal and Enable Xtal */ stcXtalInit.u8State CLK_XTAL_ON; stcXtalInit.u8Mode CLK_XTAL_MD_OSC; stcXtalInit.u8Drv CLK_XTAL_DRV_ULOW; stcXtalInit.u8StableTime CLK_XTAL_STB_2MS; (void)CLK_XtalInit(stcXtalInit); } /** * brief MPLL initialize * param None * retval None */ static void MPLLInit(void) { stc_clock_pll_init_t stcMPLLInit; (void)CLK_PLLStructInit(stcMPLLInit); /* MPLL config */ /* 8MHz/M*N 8/1*50/2 200MHz */ stcMPLLInit.PLLCFGR 0UL; stcMPLLInit.PLLCFGR_f.PLLM (1UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLN (50UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLP (2UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLQ (2UL - 1UL); stcMPLLInit.PLLCFGR_f.PLLR (2UL - 1UL); stcMPLLInit.u8PLLState CLK_PLL_ON; stcMPLLInit.PLLCFGR_f.PLLSRC CLK_PLL_SRC_XTAL; /* Xtal 8MHz */ (void)CLK_PLLInit(stcMPLLInit); }屏蔽掉32768晶振部分后通过按键可以看到频率被切换。