野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8553|回复: 3

关于设置系统时钟的库函数有几行实在不懂

[复制链接]
发表于 2019-3-27 22:58:53 | 显示全部楼层 |阅读模式
红色部分的具体意义是什么啊,我算了半天都算不对,求详细解答,谢谢

static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;



    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

回复

使用道具 举报

发表于 2019-3-28 09:00:27 | 显示全部楼层
PLL 锁相环配置啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-28 16:52:21 | 显示全部楼层
Brave000 发表于 2019-3-28 09:00
PLL 锁相环配置啊

谢谢您的回复。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-28 17:04:51 | 显示全部楼层
Brave000 发表于 2019-3-28 09:00
PLL 锁相环配置啊

谢谢您的回复。但是结合寄存器功能进行分析,我是在不理解,请您指教。我的想法如下:

RCC_CFGR_PLLXTPRE      ((uint32_t)0x00020000)    表示:外部4-16MHz振荡器就绪
RCC_CFGR_PLLSRC          ((uint32_t)0x00010000)    表示:HSE振荡器开启。
RCC_CFGR_PLLMULL         ((uint32_t)0x003C0000)   表示:1110: PLL 16倍频输出     这里的16倍频我完全不理解

以及将这个表达式的结果,我也不能理解,按照这样的计算 ,我得到的一串数字,对照CRR_CFGR寄存器时,完全看不懂这个程序想表达什么 。
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-27 22:27 , Processed in 0.036621 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表