目录

STMF4时钟系统重点概要

HSE作为系统时钟配置方法(附带程序)

正点开发板晶振问题(不同频率晶振配置方法)

STM F407时钟系统概要

时钟框图

设置系统时钟SYSCLK、设置AHB 分频因子(决定HCLK 等于多少)、设置APB2 分频因子(决定PCLK2 等于多少)、设置APB1 分频因子(决定PCLK1 等于多少)、设置各个外设的分频因子;控制AHB、APB2 和APB1 这三条总线时钟的开启、控制每个外设的时钟的开启。对于SYSCLK、HCLK、PCLK2、PCLK1 这四个时钟的配置一般是:HCLK = SYSCLK=PLLCLK = 168M, PCLK1=HCLK/2 = 84M,PCLK1=HCLK/4 = 42M。这个时钟配置也是库函数的标准配置,我们用的最多的就是这个。

HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从4-26MHZ 不等。当使用有源晶振时,时钟从OSC_IN 引脚进入,OSC_OUT 引脚悬空,当选用无源晶振时,时钟从OSC_IN 和OSC_OUT 进入,并且要配谐振电容。

HSE 或者HSI 经过PLL 时钟输入分频因子M(2~63)分频后,成为VCO 的时钟输入,VCO 的时钟必须在1~2M 之间(大多配为1较为方便),我们选择HSE=25M(正点原子HSE=8M) 作为PLL 的时钟输入,M 设置为25(设置为HSE值,这里正点原子M设置为8),那么VCO 输入时钟就等于1M。

VCO 输入时钟经过VCO 倍频因子N 倍频之后,成为VCO 时钟输出,VCO 时钟必须在192~432M之间。我们配置N 为336,则VCO的输出时钟等于336M。如果要把系统时钟超频,就得在VCO 倍频系数N 这里做手脚。PLLCLK_OUTMAX = VCOCLK_OUTMAX/P_MIN =432/2=216M,即F407最高可超频到216M。VCO 输出时钟之后有三个分频因子:PLLCLK 分频因子p,USB OTG FS/RNG/SDIO 时钟分频因子Q,分频因子R(F446 才有,F407 没有)。p 可以取值2、4、6、8, 我们配置为2,则得到PLLCLK=168M。Q 可以取值4~15,但是USB OTGFS 必须使用48M,Q=VCO 输出时钟336/48=7。有关PLL 的配置有一个专门的RCC PLL 配置寄存器RCC_PLLCFGR,具体描述看手册即可。当HSE 出现故障的时候,系统时钟会切换为HSI=16M,直到HSE 恢复正常为止。当HSE 直接或者间接(HSE 经过PLL 倍频)的作为系统时钟的时候,如果HSE 发生故障,不仅HSE 会被关闭,连PLL 也会被关闭,这个时候系统会自动切换HSI 作为系统时钟,此时SYSCLK=HSI=16M,如果没有开启CSS 和CSS 中断的话,那么整个系统就只能在低速率运行,这是系统跟瘫痪没什么两样。
如果开启了CSS 功能的话,那么可以当HSE 故障时,在CSS 中断里面采取补救措施,使用HSI,重新设置系统频率为168M,让系统恢复正常使用。但这只是权宜之计,并非万全之策,最好的方法还是要采取相应的补救措施并报警,然后修复HSE。临时使用HSI 只是为了把损失降低到最小,毕竟HSI 较于HSE 精度还是要低点。

HSE作为系统时钟配置方法

* 使用HSE时,设置系统时钟的步骤
 * 1、开启HSE ,并等待 HSE 稳定
 * 2、设置 AHB、APB2、APB1的预分频因子
 * 3、设置PLL的时钟来源
 *    设置VCO输入时钟 分频因子        m
 *    设置VCO输出时钟 倍频因子        n
 *    设置PLLCLK时钟分频因子          p
 *    设置OTG FS,SDIO,RNG时钟分频因子 q
 * 4、开启PLL,并等待PLL稳定
 * 5、把PLLCK切换为系统时钟SYSCLK
 * 6、读取时钟切换状态位,确保PLLCLK被选为系统时

程序

/ *野火HSE是25MHz,所以配置为 HSE_SetSysClock(25, 432, 2, 9);

正点原子HSE是8MHz,所以配置为 HSE_SetSysClock(8, 432, 2, 9);
 */
void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)    
{
  __IO uint32_t HSEStartUpStatus = 0;
  
  // 使能HSE,开启外部晶振,野火F407使用 HSE=25M
  RCC_HSEConfig(RCC_HSE_ON);
    
  // 等待HSE启动稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS)
  {
    // 调压器电压输出级别配置为1,以便在器件为最大频率
        // 工作时使性能和功耗实现平衡
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;
        
        // HCLK = SYSCLK / 1
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        
        // PCLK2 = HCLK / 2
        RCC_PCLK2Config(RCC_HCLK_Div2);
        
        // PCLK1 = HCLK / 4
        RCC_PCLK1Config(RCC_HCLK_Div4);
        
    // 如果要超频就得在这里下手啦
        // 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,
        //  设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q
        RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);
        
        // 使能PLL
        RCC_PLLCmd(ENABLE);
  
      // 等待 PLL稳定
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

/*-----------------------------------------------------*/
    //开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
//    PWR->CR |= PWR_CR_ODEN;
//    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
//    {
//    }
//    PWR->CR |= PWR_CR_ODSWEN;
//    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
//    {
//    }      
    // 配置FLASH预取指,指令缓存,数据缓存和等待状态
    FLASH->ACR = FLASH_ACR_PRFTEN 
                    | FLASH_ACR_ICEN 
                    | FLASH_ACR_DCEN 
                    | FLASH_ACR_LATENCY_5WS;
/*-----------------------------------------------------*/
        
        // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

// 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { // HSE启动出错处理

while (1)
    {
    }
  }
}

晶振问题

注意:STM32F407固件库默认使用的HSE=25MHz,野火用的也是25MHz,所以在配置时不用改动,可以直接用固件库内容,而正点原子HSE=8MHz,所以要在固件库上做一点修改.

RCC_GetClocksFreq这个函数获取时钟值并不是通过单片机内部的寄存器读值的,而是预先设定好的一个宏定义值,如下图所示:

很明显,这个值和我使用的实际的晶振值是不同的,因此需要把这个值修改成实际使用的晶振值才可以,否则,程序中依赖这个值进行计算的地方都会出错。

定位到这个宏定义在stm32f4xx.h文件下,如下图:

因此需要把这个值修改成实际使用的晶振值才可以,否则,程序中依赖这个值进行计算的地方都会出错。

定位到这个宏定义在stm32f4xx.h文件下,    stm32f4xx.h文件下的第139行的HSE_VALUE值为实际晶振值,如下图:

正点原子教程在新建工程时要把HSE_VALUE改成8000000,M改成8就是这个原因.

STMF4编写系统时钟相关推荐

  1. HGP:STM32的用标准库函数自己编写的关于设置系统时钟72Mhz的函数

    /其实在system_stm32f10x.c文件中有设置72MHz的函数,本文是我在学习STM32最底层用寄存器与固件库开发时写的一个例子,当做笔记发在博客上,希望对同样从STM32基层学起的读者有帮 ...

  2. STM32系统时钟默认设置

    "我们一直都说STM32有一个非常复杂的时钟系统,然而在原子或者野火的例程中,只要涉及到时钟,我们却只能看到类似的库函数调用,如RCC_APB2PeriphClockCmd(RCC_APB2 ...

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

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

  4. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  5. STM32开发---F103系统时钟配置

    本篇,用自问自答,记录STM32系统时钟配置一些关节点. 因为已重写了系统时钟配置的代码,不再细研配置的过程.步骤,忘了就翻代码就好,且网上不缺絮絮叨叨的各种教程. 一句话总结:  过程高深, 使用简 ...

  6. 利用c语言编写一个时钟计时器(c语言基础练习)

    时间对于每个人都是宝贵的.人类从古至今都在发展计时设备和改善计时方法.远古时期,人类根据太阳和月亮的位置来判断时间.根据影子的方向长短来区分早晨.中午和黄昏.古代人也发明了很多计时的方法,日晷.沙漏. ...

  7. STM32系统时钟设置(标准库)

    1.STM32F407时钟树 2.系统时钟相关的结构 HSE高速外部时钟信号 锁相环PLL 锁相环的主要作用就是对时钟进行倍频,然后把时钟输出到各个功能部件.PLL有两个,一个主PLL,另一个是专用的 ...

  8. 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

  9. stm8L 初始化系统时钟

    库函数编写程序时,在main中首先是调用sys_clock_init() sys_clock_init()函数用于配制芯片时钟,代码如下: /* 初始化系统时钟 */ void sys_clock_i ...

最新文章

  1. http协议的队首阻塞
  2. Electron 实战桌面计算器应用
  3. boost::hana::overload用法的测试程序
  4. easyuefi只能在基于uefi启动的_电脑知识:5分钟教你深入了解BIOS+MBR和UEFI+GPT
  5. ArcGIS实验教程——实验三十七:基于ArcGIS的太阳辐射分析案例教程
  6. 分模块开发创建service子模块——(八)
  7. QQ在线客服代码 网页qq咨询html代码
  8. 计算机操作系统--思维导图
  9. 苹果手机 计算机 错误,苹果手机的计算器连1+2+3都算不对!原因太尴尬!
  10. 数字图像处理的技术方法和应用
  11. Win10开启卓越性能模式
  12. 如何让计算机显示隐藏的文件夹,隐藏的文件夹如何显示 win7与xp系统显示隐藏文件夹的设置方法...
  13. (数据结构基础)Among the following threaded binary trees (the threads are represented by dotted curves),……
  14. 服务器centos系统诛仙,云服务器搭建诛仙教程
  15. Sqoop 是什么?Sqoop 有什么特点?
  16. 51单片机控制LCD1602模块
  17. HCL Nomad 1.0.9中的新功能
  18. 旅游行业数字化进程分析——2023年元旦与春节,旅游市场开启复苏模式,跨省游热度上升
  19. 免费高质量图标搜索引擎以及图标库
  20. mlag 堆叠_华为CE交换机M-LAG配置

热门文章

  1. 朋友找工作的奇葩规定
  2. 【转】CClientDC、CPaintDC、CWindowDC的区别及基本的绘图方法
  3. ·@ComponentScan中basePackages干什么的?
  4. Android开发从入门到精通教程大总结(源码,教程,面试题,书籍,视频)
  5. git提交规范,规范自己的提交标准
  6. vscode一格式化就报错?各种风格问题各种报错烦不胜烦,教你如何用好vue的eslint风格配置...
  7. 只需一键录音转文字,会议记录让你不在烦恼
  8. RocketMQ,同一个topic下是否可以通过不同的tag来进行订阅吗?
  9. 这位创业者足够疯狂:他选择向微软发起挑战
  10. 马斯克为啥要成立SpaceX