OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4328|回复: 1

STM32时钟初始化的疑问

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2014-12-24 16:08:28 | 显示全部楼层 |阅读模式
5金钱
假设外接晶振8M

void RCC_Configuration(void)

   ErrorStatus HSEStartUpStatus;
  //GPIO_InitTypeDef GPIO_InitStructure;
  /* RCC system reset(for debug purpose) */
  SystemInit();
  
  RCC_DeInit();          ////时钟管理重置=========那么此刻重置后的SYSCLK应该是多少呢?  8M吗??

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);//使能外部晶振
  /* Disenable LSE */
  RCC_LSEConfig(RCC_LSE_OFF);//禁止内部高速晶振
/* Wait till HSE is ready */
 HSEStartUpStatus = RCC_WaitForHSEStartUp();
  
  if(HSEStartUpStatus == SUCCESS)//初始化成功,外部晶振正常
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   ///此刻的SYSCLK 应该是多少  我认为是8M    HCLK=8M
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);    //  PCLK2=8M

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 =4M

    /* Flash 0 wait state */
    FLASH_SetLatency(FLASH_Latency_0);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9= 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE); //在这 SYSCLK 的时钟源变成了PLLCLK ?   因此SYSCLK 变成了72M?+

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  {
      /* RCC system reset(for debug purpose) */
      SystemInit();
      RCC_DeInit();
      RCC_HSEConfig(RCC_HSE_OFF);
      RCC_LSEConfig(RCC_LSE_ON);
       /* Flash 0 wait state */
      FLASH_SetLatency(FLASH_Latency_0);
      /* Enable Prefetch Buffer */
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
      
      /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
      /* PCLK2 = HCLK */
      RCC_PCLK2Config(RCC_HCLK_Div1); 

      /* PCLK1 = HCLK/2 */
      RCC_PCLK1Config(RCC_HCLK_Div2);

      /* PLLCLK = 8MHz/2 * 6 = 24 MHz */
      RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
      
      /* Enable PLL */ 
      RCC_PLLCmd(ENABLE);
        /* Wait till PLL is ready */
      while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
      {
      }
      /* Select PLL as system clock source */
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
      /* Wait till PLL is used as system clock source */
      while(RCC_GetSYSCLKSource() != 0x08)
      {
      }

  }
   /* Output the HSI frequency on MCO pin (GPIOA.8)*/ 
   //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
/* Output HSE clock on MCO pin ---------------------------------------------*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  //RCC_MCOConfig(RCC_MCO_HSI);
  /* Enable USART2 、RCC_APB1Periph_I2C1 clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_I2C1, ENABLE);
  /* Enable GPIOA, GPIOB, GPIOC, USART1, and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
         | RCC_APB2Periph_AFIO, ENABLE);
 }



上边程序的绿色注释是我认为的当时的时钟  请教大侠duibu8dui+

最佳答案

查看完整内容[请看2#楼]

第一个问题,是8M,即内部RC晶振的频率 此后的问题,都可以通过软件仿真,查看peripherals里面的PRCC选项卡,来观测。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-24 16:08:29 | 显示全部楼层
第一个问题,是8M,即内部RC晶振的频率
此后的问题,都可以通过软件仿真,查看peripherals里面的PRCC选项卡,来观测。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 14:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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