前一节详细介绍了系统默认的时钟配置,及各路时钟输出是多少,这是默认配置的,但实际使用的时钟默认的时钟并不符合要求,所以就得知道如何调用库函数进行配置。

最好的资料就是查阅stm32f2xx_rcc.c文件,里面有各种功能函数,并有详细的注释,这让我们这样的新手上手是非常快的。

  1. //VCO = PLL input clock(HSE or HSI)/PLLM
  2. //倍频电压后值V = VCO * PLLN
  3. //sysclk = V / PLLP
  4. //PLL48CK = V / PLLQ
  5. #define PLLM 25 //分频因子
  6. #define PLLN 240 //倍频因子
  7. #define PLLP 2 //分频因子
  8. #define PLLQ 5 //分频因子
  9.  
  10. vu16 ADC_ConvertedValue[]; //定义数组,存放PA6和PA7的转换后的数据
  11. float PA6_AD_value; //压力传感器
  12. float PA7_AD_value; //锂电池电压
  13.  
  14. void Delay(__IO uint32_t nCount);
  15. void SetClock(void);
  16. int CheckDatas(void);
  17.  
  18. /* Private functions ---------------------------------------------------------*/
  19.  
  20. /**
  21. * @brief Main program.
  22. * @param None
  23. * @retval None
  24. */
  25. int main(void)
  26. {
  27. unsigned int i = ;
  28. RCC_ClocksTypeDef rcc_clocks;
  29.  
  30. SetClock();
  31. USART_Config();
  32. RCC_GetClocksFreq(&rcc_clocks);
  33.  
  34. printf("\r\nSYSCLK_Frequency = %d MHz\n",rcc_clocks.SYSCLK_Frequency/);
  35. printf("\r\nHCLK_Frequency = %d MHz\n",rcc_clocks.HCLK_Frequency/);
  36. printf("\r\nPCLK1_Frequency = %d MHz\n",rcc_clocks.PCLK1_Frequency/);
  37. printf("\r\nPCLK2_Frequency = %d MHz\n",rcc_clocks.PCLK2_Frequency/);

上面是main函数部分代码,时钟设置SetClock()函数,设置完后,可以调用库函数RCC_GetClockFreq(&rcc_clocks)进行查阅配置的时钟是否正确。在使用该函数前,定义一个RCC_ClockTypeDef rcc_clocks结构变量,通过参数传递,就可以访问到RCC_ClockTypeDef里的结构成员变量。

接下来介绍SetClocks()函数,直接看中文注释

  1. void SetClock(void)
  2. {
  3. RCC_DeInit();//复位系统所有配置时钟
  4. // RCC_HSICmd(DISABLE); //RCC_DeInit()后,HSI作为系统时钟,在这调用是不生效的
  5. RCC_LSICmd(DISABLE);//关闭内部低速时钟
  6. RCC_PLLI2SCmd(DISABLE);//关闭PLLI2S Clock
  7. RCC_RTCCLKCmd(DISABLE);//disables the RTC clock
  8.  
  9. RCC_HSEConfig(RCC_HSE_ON);//外部时钟使能
  10. while(!RCC_WaitForHSEStartUp());//Waits for HSE start-up
  11.  
  12. RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, PLLN, PLLP, PLLQ);//配置PLL时钟
  13. RCC_PLLCmd(ENABLE); //PLL时钟使能
  14. while((RCC->CR & RCC_CR_PLLRDY) == );//等待PLL 时钟准备好
  15.  
  16. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//PLL CLK 作为系统时钟 sysclk =120M
  17. RCC_HSICmd(DISABLE);//关闭内部高速时钟,如果内部高速时钟作为系统时钟,此函数不生效
  18. RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB = SYSCLK 不分频 120M
  19. RCC_PCLK1Config(RCC_HCLK_Div4); //PCLK1 4分频 = 30M
  20. RCC_PCLK2Config(RCC_HCLK_Div2); //PCLK2 2分频 = 60M
  21. }

这里注意的是HSE时钟使能不是用RCC_HSECmd(ENABLE)这样的函数,而是使用的是RCC_HSEConfig(RCC_HSE_ON),使能后一定要等待HSE start-up,
同样PLL使能后,也要等待一会,配置时钟时最好按照时钟树结构进行设置,先什么在配置什么,然后PLL时钟先配置在使能,注意一下顺序。

还要注意一个地方,当不需要内部高速时钟时,使用RCC_HSICmd(DISABLE),不能随调用,可以查看该函数的注释,就是说“如果内部高速时钟作为系统时钟时,该时钟不能停止”也就是说当该时钟作为系统时钟时,调用该函数是无效的,而使用RCC_DeInit()后,内部高速时钟就是作为了系统时钟,所以该函数放置在RCC_SYSCLKConfig()函数后。

串口打印的数据符合理论算的值,如下图:

新手的话可能不会在意那些不用的时钟关掉,但是在做项目上,考虑到低功耗时就的把不必要的时钟进行关掉,节省电,还有当处于休眠状态时,也可以考虑降低主时钟,因频率越快,越耗电。

STM32F2系列时钟的配置的更多相关文章

  1. Cotex-M3内核LPC17xx系列时钟及其配置方法

    一.背景: 最近正在接手一个项目,核心芯片既是LPC17XX系列MCU,内核为ARM的Cotex-M3内核. 想要玩转一个MCU,就一定得搞定其时钟! 时钟对MCU而言,就好比人类的心脏.由其给AHB ...

  2. Cotex-M3内核STM32F10XX系列时钟及其配置方法

    一.背景 最近做个项目,需要使用STM32,还是以前一样的观点,时钟就是MCU心脏,供血即时钟频率输出,想要弄明白一个MCU,时钟是一个非常好的切入点.言归正传,网上已经有太多大神详述过STM32的详 ...

  3. STM32F2系列系统时钟默认配置

    新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M呢?单片机外挂的时 ...

  4. STM32F7系列时钟相关问题:HSE模式配置(旁路模式、非旁路模式

    从时钟源的角度,分为两类外部时钟(E)和内部时钟(I).从时钟速率的角度,分为两类高速时钟(HS)和低速时钟(LS).而把它们组合起来就有四种时钟:HSE.HIS.LSE.LSI.至于为什么会有这么复 ...

  5. STM32入门系列-STM32时钟系统,时钟使能配置函数

    之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...

  6. Spartan6系列之芯片配置模式详解

    1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对 ...

  7. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  8. ANDROID Porting系列二、配置一个新产品

    ANDROID Porting系列二.配置一个新产品 详细说明 下面的步骤描述了如何配置新的移动设备和产品的makefile运行android. 1.         目录//vendor/创建一个公 ...

  9. Robotframework-Appium系列:安装配置

    1.   Robotframework-android系列:安装配置 1.1. 安装环境 64位win10家庭中文版 1.1. 安装说明 网上robotframework-appium安装资料也不少, ...

随机推荐

  1. vs中的各种快捷键

    1. VS注释与取消注释快捷键 CTRL + K , CTRL + C(注释) CTRL + K , CTRL + U(取消注释)

  2. 线程池Executors探究

    线程池用到的类在java.util.concurrent包下,核心类是Executors,通过其不同的几个方法可产生不同的线程池. 1.生成固定大小的线程池 public static Executo ...

  3. UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法

    有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的 ...

  4. Git单独checkout子目录

    http://schacon.github.io/git/git-read-tree.html#_sparse_checkout Existing Repository If you already ...

  5. RLE行程长度编码压缩算法

    在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息! 特点 一种压缩过的位图文件格式,RLE压缩方案是一种极其成熟的压 ...

  6. SQLServer 错误: 15404,无法获取有关 Windows NT 组 用户

    因做服务器数据库迁移,造成的一系列问题, 1.重启SQL 代理,操作也不可. 然后又进行操作: SQL---------安全性------登录名 中原来的系统用户名前的计算机名更改为现在所用的计算机名 ...

  7. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  8. H5之重力感应篇

    手机的重力感应支持里,有两个主要的事件: 1. OrientationChange (在屏幕发生翻转的时候触发) 2. DeviceOrientation+DeviceMotion(重力感应与陀螺仪) ...

  9. word转pdf swf 在线预览

    来源:http://www.cnblogs.com/wuhenke/archive/2010/08/01/1789750.html 之前在项目中研究使用了一套word转PDF,然后将PDF转成SWF的 ...

  10. frameset框架样式 加边框

    <frameset rows="580,*" FRAMESPACING="3"> <frame noresize name="Top ...