打印
[其它]

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

[复制链接]
4042|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangtaohui|  楼主 | 2023-2-25 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HT-时钟配置库简单使用1.时钟配置分析1)有关系统运行时钟的配置图

2)整个时钟架构的框图


使用特权

评论回复
评论
wangtaohui 2023-2-25 12:17 回复TA
版权声明:本文为博主原创文章,遵循 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/article/details/123031135 

相关帖子

沙发
wangtaohui|  楼主 | 2023-2-25 12:01 | 只看该作者
2.配置时钟的代码流程简析
以官方库中的48MHZ标准配置为例:

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

使能HSE,并检查HSE是否就绪(没有HSE就死循环了);
CKCU_HSECmd(ENABLE);
ClockStatus = CKCU_WaitHSEReady();
if(ClockStatus == SUCCESS)

使用特权

评论回复
板凳
wangtaohui|  楼主 | 2023-2-25 12:02 | 只看该作者
HSE就绪的话,填写结构体配置PLL锁相环(⭐不同频率的配置关键1),并使能锁相环。
    CKCU_PLLInit(&PLLInit);

    CKCU_PLLCmd(ENABLE);
        //主要结构体成员如下:
1.  ClockSource //时钟来源,可填:CKCU_PLLSRC_HSE/CKCU_PLLSRC_HSI
2.  CFG  //配置时钟用,可填宏:
    #define CKCU_PLL_4M_48M         ((12UL << 23) | (0UL << 21))
        #define CKCU_PLL_4M_40M         ((10UL << 23) | (0UL << 21))
        #define CKCU_PLL_8M_48M         (( 6UL << 23) | (0UL << 21))
        #define CKCU_PLL_8M_40M         (( 5UL << 23) | (0UL << 21))
        #define CKCU_PLL_8M_32M         (( 4UL << 23) | (0UL << 21))
        #define CKCU_PLL_12M_48M        (( 4UL << 23) | (0UL << 21))
        #define CKCU_PLL_16M_48M        (( 3UL << 23) | (0UL << 21))
          #if (LIBCFG_CKCU_SYS_CK_60M)
          #define CKCU_PLL_4M_60M         ((0UL << 28) | (15UL << 23) | (0UL << 21))
          #define CKCU_PLL_8M_60M         ((1UL << 28) | (15UL << 23) | (0UL << 21))
          #define CKCU_PLL_12M_60M        ((0UL << 28) | ( 5UL << 23) | (0UL << 21))
          #define CKCU_PLL_16M_56M        ((1UL << 28) | ( 7UL << 23) | (0UL << 21))
3.        BYPASSCmd//是否使能旁路

使用特权

评论回复
地板
wangtaohui|  楼主 | 2023-2-25 12:04 | 只看该作者
等待锁相环标志位就绪。


while(CKCU_GetClockReadyStatus(CKCU_FLAG_PLLRDY) == RESET);

使用特权

评论回复
5
wangtaohui|  楼主 | 2023-2-25 12:04 | 只看该作者
将FLASH等待的时钟对应配置。

FLASH_SetWaitState(FLASH_WAITSTATE_1);

使用特权

评论回复
6
wangtaohui|  楼主 | 2023-2-25 12:05 | 只看该作者
Flash等待状态为哪一种(0/1/2)可以参考手册中对Flash的CFCR寄存器的[2:0]位中的描述。

使用特权

评论回复
7
wangtaohui|  楼主 | 2023-2-25 12:07 | 只看该作者
配置分频系数(⭐不同频率的配置关键2)

CKCU_SetHCLKPrescaler(CKCU_SYSCLK_DIV1);

使用特权

评论回复
8
wangtaohui|  楼主 | 2023-2-25 12:08 | 只看该作者
设置时钟来源为锁相环PLL输入,并检查其是否设置成功。

    ClockStatus = CKCU_SysClockConfig(CKCU_SW_PLL);

    if(ClockStatus != SUCCESS)
    {
      while(1);
    }

使用特权

评论回复
9
wangtaohui|  楼主 | 2023-2-25 12:09 | 只看该作者
整个函数如下:
void SysClockConfig_48MHz(void)
{
  ErrStatus ClockStatus;

  /* Reset CKCU, SYSCLK = HSI */
   
  CKCU_DeInit();

  /* Enable HSE */
  CKCU_HSECmd(ENABLE);

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

  if(ClockStatus == SUCCESS)
  {
    /* PLL configuration, PLLCLK = 48 MHz */
    PLLInit.ClockSource = CKCU_PLLSRC_HSE;
    #if defined(HTCFG_HSE_12MHZ)
    PLLInit.CFG = CKCU_PLL_12M_48M;
    #else
    PLLInit.CFG = CKCU_PLL_8M_48M;
    #endif
    PLLInit.BYPASSCmd = DISABLE;
    CKCU_PLLInit(&PLLInit);

    CKCU_PLLCmd(ENABLE);

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

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

    /* HCLK = SYSCLK/1 */
    CKCU_SetHCLKPrescaler(CKCU_SYSCLK_DIV1);

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

    if(ClockStatus != SUCCESS)
    {
      while(1);
    }
  }
  else
  {
    /* HSE is failed. User can handle this situation here. */
    while(1);
  }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

482

帖子

0

粉丝