[其它] HT单片机笔记1-时钟配置(2022/2/20)

[复制链接]
5599|9
 楼主| wangtaohui 发表于 2023-2-25 12:01 | 显示全部楼层 |阅读模式
HT-时钟配置库简单使用1.时钟配置分析1)有关系统运行时钟的配置图

2)整个时钟架构的框图


评论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_51915497/article/details/123031135 ———————————————— 版权声明:本文为CSDN博主「点灯的棉羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_51915497/articl  发表于 2023-2-25 12:17
 楼主| wangtaohui 发表于 2023-2-25 12:01 | 显示全部楼层
2.配置时钟的代码流程简析
以官方库中的48MHZ标准配置为例:

默认初始化时钟(配置成HSI);
  1. CKCU_DeInit();

使能HSE,并检查HSE是否就绪(没有HSE就死循环了);
  1. CKCU_HSECmd(ENABLE);
  2. ClockStatus = CKCU_WaitHSEReady();
  3. if(ClockStatus == SUCCESS)
 楼主| wangtaohui 发表于 2023-2-25 12:02 | 显示全部楼层
HSE就绪的话,填写结构体配置PLL锁相环(⭐不同频率的配置关键1),并使能锁相环。
  1.     CKCU_PLLInit(&PLLInit);

  2.     CKCU_PLLCmd(ENABLE);
  3.         //主要结构体成员如下:
  4. 1.  ClockSource //时钟来源,可填:CKCU_PLLSRC_HSE/CKCU_PLLSRC_HSI
  5. 2.  CFG  //配置时钟用,可填宏:
  6.     #define CKCU_PLL_4M_48M         ((12UL << 23) | (0UL << 21))
  7.         #define CKCU_PLL_4M_40M         ((10UL << 23) | (0UL << 21))
  8.         #define CKCU_PLL_8M_48M         (( 6UL << 23) | (0UL << 21))
  9.         #define CKCU_PLL_8M_40M         (( 5UL << 23) | (0UL << 21))
  10.         #define CKCU_PLL_8M_32M         (( 4UL << 23) | (0UL << 21))
  11.         #define CKCU_PLL_12M_48M        (( 4UL << 23) | (0UL << 21))
  12.         #define CKCU_PLL_16M_48M        (( 3UL << 23) | (0UL << 21))
  13.           #if (LIBCFG_CKCU_SYS_CK_60M)
  14.           #define CKCU_PLL_4M_60M         ((0UL << 28) | (15UL << 23) | (0UL << 21))
  15.           #define CKCU_PLL_8M_60M         ((1UL << 28) | (15UL << 23) | (0UL << 21))
  16.           #define CKCU_PLL_12M_60M        ((0UL << 28) | ( 5UL << 23) | (0UL << 21))
  17.           #define CKCU_PLL_16M_56M        ((1UL << 28) | ( 7UL << 23) | (0UL << 21))
  18. 3.        BYPASSCmd//是否使能旁路
 楼主| wangtaohui 发表于 2023-2-25 12:04 | 显示全部楼层
等待锁相环标志位就绪。


  1. while(CKCU_GetClockReadyStatus(CKCU_FLAG_PLLRDY) == RESET);

 楼主| wangtaohui 发表于 2023-2-25 12:04 | 显示全部楼层
将FLASH等待的时钟对应配置。

  1. FLASH_SetWaitState(FLASH_WAITSTATE_1);
 楼主| wangtaohui 发表于 2023-2-25 12:05 | 显示全部楼层
Flash等待状态为哪一种(0/1/2)可以参考手册中对Flash的CFCR寄存器的[2:0]位中的描述。

 楼主| wangtaohui 发表于 2023-2-25 12:07 | 显示全部楼层
配置分频系数(⭐不同频率的配置关键2)

  1. CKCU_SetHCLKPrescaler(CKCU_SYSCLK_DIV1);
 楼主| wangtaohui 发表于 2023-2-25 12:08 | 显示全部楼层
设置时钟来源为锁相环PLL输入,并检查其是否设置成功。

  1.     ClockStatus = CKCU_SysClockConfig(CKCU_SW_PLL);

  2.     if(ClockStatus != SUCCESS)
  3.     {
  4.       while(1);
  5.     }
 楼主| wangtaohui 发表于 2023-2-25 12:09 | 显示全部楼层
整个函数如下:
  1. void SysClockConfig_48MHz(void)
  2. {
  3.   ErrStatus ClockStatus;

  4.   /* Reset CKCU, SYSCLK = HSI */
  5.    
  6.   CKCU_DeInit();

  7.   /* Enable HSE */
  8.   CKCU_HSECmd(ENABLE);

  9.   /* Wait until HSE is ready or time-out */
  10.   ClockStatus = CKCU_WaitHSEReady();

  11.   if(ClockStatus == SUCCESS)
  12.   {
  13.     /* PLL configuration, PLLCLK = 48 MHz */
  14.     PLLInit.ClockSource = CKCU_PLLSRC_HSE;
  15.     #if defined(HTCFG_HSE_12MHZ)
  16.     PLLInit.CFG = CKCU_PLL_12M_48M;
  17.     #else
  18.     PLLInit.CFG = CKCU_PLL_8M_48M;
  19.     #endif
  20.     PLLInit.BYPASSCmd = DISABLE;
  21.     CKCU_PLLInit(&PLLInit);

  22.     CKCU_PLLCmd(ENABLE);

  23.     /* Wait until PLL is ready */
  24.     while(CKCU_GetClockReadyStatus(CKCU_FLAG_PLLRDY) == RESET);

  25.     /* FLASH wait state configuration */
  26.     FLASH_SetWaitState(FLASH_WAITSTATE_1);  /* FLASH one wait clock */

  27.     /* HCLK = SYSCLK/1 */
  28.     CKCU_SetHCLKPrescaler(CKCU_SYSCLK_DIV1);

  29.     /* Configure PLL as system clock */
  30.     ClockStatus = CKCU_SysClockConfig(CKCU_SW_PLL);

  31.     if(ClockStatus != SUCCESS)
  32.     {
  33.       while(1);
  34.     }
  35.   }
  36.   else
  37.   {
  38.     /* HSE is failed. User can handle this situation here. */
  39.     while(1);
  40.   }
  41. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

529

帖子

0

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