[APM32E0] APM32E030的时钟切换

[复制链接]
68|0
口天土立口 发表于 2025-10-15 18:51 | 显示全部楼层 |阅读模式
本帖最后由 口天土立口 于 2025-10-15 18:57 编辑

7237868ef7bbe5fc81.png

APM32E030的系统时钟可配置为不同的时钟源,时钟最大72MHz;
部分应用场景可根据功耗需要使用不同的主频运行;
但给系统时钟切换时钟前,必须先把待切入的时钟配置稳定才能切入,否则可能异常;

驱动代码如下:
  1. /*
  2. * @brief       时钟引脚初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. static void bsp_clk_gpio_init(void)
  10. {
  11.     GPIO_Config_T gpioConfig;
  12.    
  13.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  14.     GPIO_ConfigStructInit(&gpioConfig);
  15.     gpioConfig.pin     = GPIO_PIN_8;
  16.     gpioConfig.mode    = GPIO_MODE_AF;
  17.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  18.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  19.     gpioConfig.pupd    = GPIO_PUPD_NO;
  20.     GPIO_Config(GPIOA, &gpioConfig);
  21.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_8, GPIO_AF_PIN0);
  22. }
  1. /*
  2. * @brief       时钟初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_clk_init(void)
  10. {
  11.     bsp_clk_gpio_init();
  12.     /* SYSCLK 作为时钟输出 */
  13.     RCM_ConfigCOC(RCM_COC_SYSCLK);
  14. }
  1. /*
  2. * @brief       系统时钟切为HSI
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_clk_sysclk_to_hsi(void)
  10. {
  11.     /* 使能HSI并等待稳定 */
  12.     RCM_EnableHSI();
  13.     while (RCM_ReadStatusFlag(RCM_FLAG_HSIRDY) == RESET);
  14.     /* 系统时钟切换为HSI */
  15.     RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_HSI);
  16.     while (RCM_ReadSYSCLKSource() != RCM_SYSCLK_SEL_HSI);
  17. }
  1. /*
  2. * @brief       系统时钟切为HSE
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_clk_sysclk_to_hse(void)
  10. {
  11.     /* 使能HSE并等待稳定 */
  12.     RCM_ConfigHSE(RCM_HSE_OPEN);
  13.     while (RCM_ReadStatusFlag(RCM_FLAG_HSERDY) == RESET);
  14.     /* 系统时钟切换为HSE */
  15.     RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_HSE);
  16.     while (RCM_ReadSYSCLKSource() != RCM_SYSCLK_SEL_HSE);
  17. }
  1. /*
  2. * @brief       系统时钟切为PLL 12MHz
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_clk_sysclk_to_pll_12MHz(void)
  10. {
  11.     /* 先关闭PLL */
  12.     RCM_DisablePLL();
  13.     while (RCM_ReadStatusFlag(RCM_FLAG_PLLRDY) == SET);   
  14.     /* 使能HSE并等待稳定 */
  15.     RCM_ConfigHSE(RCM_HSE_OPEN);
  16.     while (RCM_ReadStatusFlag(RCM_FLAG_HSERDY) == RESET);
  17.     /* 配置PLL */
  18.     RCM_ConfigCLKDIV(RCM_CLK_DIV_2);                /* 8 / 2 = 4MHz */
  19.     RCM_ConfigPLL(RCM_PLL_SEL_HSE, RCM_PLLMF_3);    /* 4 * 3 = 12MHz */
  20.     /* 使能PLL */
  21.     RCM_EnablePLL();
  22.     while (RCM_ReadStatusFlag(RCM_FLAG_PLLRDY) != SET);
  23.     /* 系统时钟切换为PLL */
  24.     RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);
  25.     while (RCM_ReadSYSCLKSource() != RCM_SYSCLK_SEL_PLL);
  26. }


测试代码如下:
  1. void delay(uint32_t n)
  2. {
  3.     volatile uint32_t d = n;
  4.     while (--d);
  5. }

  6. // 应用初始化
  7. void app_init(void)
  8. {
  9.     bsp_clk_init();
  10.     bsp_clk_sysclk_to_hsi();
  11. }
  1. // 应用任务
  2. void app_task(void)
  3. {
  4.     delay(0xFFFFF);
  5.     bsp_clk_sysclk_to_pll_12MHz();
  6.     delay(0xFFFFF);
  7.     bsp_clk_sysclk_to_hse();
  8.     delay(0xFFFFF);
  9.     bsp_clk_sysclk_to_hsi();
  10. }


详细代码,请查看附件!
CLK_SWITCH.zip (2.04 MB, 下载次数: 0)



6696768ef7df6a24a9.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部