以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者更好的方法欢迎大家批评指正。

从技术文档上得到STM32时钟源有三种, HSI 振荡器时钟 、HSE 振荡器时钟 、主 PLL时钟,由于每个时钟的工作特性的差异,若想将系统时钟设置为最高频时需使用PLL将基础时钟源进行倍频。

由于使用外部晶振倍频精确度会比内部震荡时钟高很多,所以一般都是使用外部晶振,这跟我们使用库开发是一样的原理,所以一般的配置关键点大概如下图红框所示:

1、第一步首先要将外部HSE时钟打开,等待震荡稳定后再进行下一步操作。

2、配置PLL寄存器参数。

3、切换系统时钟源。

第一步实现:

依据:

开启HSE时钟源主要是控制CR寄存器的16位,然后打开后硬件会自动将第17位置位,如果未成功则等待,当然在这个地方可以加入时间等待,如果超时说明打开失败,进行其他方法设置。

实现:

第二步实现:

依据:

在这里技术文档上说明了各个参数的设置范围:

2 ≤ PLLQ  ≤ 15 、 PLLP = 2、4、6 或 8、 192 ≤ PLLN ≤ 432 、 2 ≤ PLLM ≤  63

由于我想将STM32设置成最高频168M,于是根据以上参数范围以及计算方法,选择一组设置参数如下:

PLL_M = 8,PLL_N  = 336,PLL_P  =  1  (2分频),PLLQ  =  7;

参数确定便可以直接设置,这些位只能在 PLL 已禁止时写入。

实现:在这里记录一下自己的小心得,以前配置寄存器都是将要配置的数先算出来,耽误时间,今天在看技术文档时突然发现直接用移位即可,且为提高代码的可读性,最好是选用或运算单个设置每个设置点。这样看起来就舒服多了。

第三步实现:

依据:

这个时候就需要将系统时钟切换过来了,主要是设置SW开关,然后再设置AHB、APB1、APB2、等时钟,在上时钟树上可看出。

还是操作对应的位,在这里又发现一个小技巧,原来STM32系统头文件已经做好这些设置的宏定义,直接使用即可,而且从可读性来说大大加强,如下图所示。最后将设置好的时钟通过MCO1输出,检测。

实现:

整个时钟就到此配置结束,原以为会梦想成真,可实际却发现不尽人意,为啥波形没有呢,苦思冥想了很长时间,最后参考库函数底层实现方式,加了一句:

然后就完美输出,在这里我不是很理解为什么要添加这句,以前用msp430的时候好像也没这个设置,而且我发现光设置CPU等待周期还不行,还得设置前面两个参数,不然设置的时钟偏差很大。

实际设置函数如下所示:

 void SystemClockInit(void)
{ RCC->CR |= RCC_CR_HSEON;
while(!(RCC->CR & RCC_CR_HSERDY)){} RCC->CR &= ~RCC_CR_PLLON;
RCC->PLLCFGR = 0x00000000;
//PLL_M = 8,PLL_N = 336,PLL_P = 1 (2分频)
RCC->PLLCFGR |= << ;
RCC->PLLCFGR |= << ;
RCC->PLLCFGR |= << ; RCC->PLLCFGR |= << ; //配置PLLQ为48M
RCC->CR |= RCC_CR_PLLON; while(!(RCC->CR & RCC_CR_PLLRDY)){} FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS; RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //不分频使AHB时钟为168M
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; //APB2 = 84M
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; //APB1 = 42M RCC->CFGR |= RCC_CFGR_SWS_PLL;
RCC->CFGR |= RCC_CFGR_SW_PLL; RCC->CFGR |= 3 << ; //PLL输出
RCC->CFGR |= 4 << ; // 2分频 }

最后两分频的波形显示如下:

到此配置就结束了,留有一个问题,那就是STM32时钟配置为啥要配置那个CPU等待周期,也就是这条语句:

欢迎大神不吝赐教,下方留言解答,万分感谢。

STM32的时钟配置随笔的更多相关文章

  1. stm32时钟配置总结

    stm32时钟配置时钟源: 1,HSE(高速外部时钟)即常见的外接8M晶振方案: 2,HSI(高速内部时钟) 即8M内部振荡时钟方案: 3,LSE(低速外部时钟)即常见的32.768Khz晶振方案: ...

  2. STM32 MCO时钟输出配置实验

    STM32的PA.8引脚具有复用功能——时钟输出(MCO), 该功能能将STM32内部的时钟通过PA.8输出. 操作流程: 1).设置PA.8为复用AF模式. RCC_AHB1PeriphClockC ...

  3. [转] STM32各种时钟的区别

    [原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...

  4. (六)STM32的时钟系统

    在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL (1) HSI是高速内部时钟,RC振荡器,频率为8MHz: (2) HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外 ...

  5. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  6. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  7. 四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件

    原创文章,欢迎转载,转载请注明出处 这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢?           1.本人有点小强迫症哈,虽然RTT将文 ...

  8. STM32F4时钟配置库函数详解

    在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...

  9. STM32F407VG (四)时钟配置

    1.STM32 F407VG 的starup_stm32f40_41xxx.s的例如以下位置调用 IMPORT SystemInit,之后调用main函数,所以 进入main函数时候就已经自己主动完毕 ...

随机推荐

  1. ECMAScript5之JSON对象属性的遍历顺序

    测试浏览器 Chrome.Safari 一 键可以用parseInt解析成整数的,按数值升序顺序. var intObj = { '3.3' : 3.3, '2' : 222, '1' :111 } ...

  2. jQuery之双下拉框

    双下拉框要实现的效果,实际上就是左边下拉选择框里的内容,可以添加到右边,而右边同理.写了个简单的例子,来说明一下. 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  3. SSH框架整合jar包时的注意事项

    SSH框架整合jar包时的注意事项: 在将三个框架所需的jar整合到一起后,要看一下有没有相同类型但是版本不同的jar包,如果有的话,需要把低版本的jar包删除掉,否则会报错.我这里整合的时候java ...

  4. PAT 1074 宇宙无敌加法器(20)(代码+思路+测试点分析)

    1074 宇宙无敌加法器(20 分)提问 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为"P ...

  5. dedecms的if标签、foreach标签

    1.if标签 (1)下拉列表 <select name="prize_type[]" class="type J-prize-type" id=" ...

  6. 深入浅出 JMS(一) - JMS 基本概念

    深入浅出 JMS(一) - JMS 基本概念 一.JMS 是个什么鬼 JMS 是 Java Message Service 的简称,即 Java 消息服务.什么是消息服务呢,我们来看一下 Oracle ...

  7. 02 Maven 入门使用

    Maven 入门使用 1. Maven 项目工程目录约定 Project |-src | |-main | | |-java -- 存放项目的 .java 文件 | | |-resources -- ...

  8. 01 Maven 安装与配置

    Maven 安装与配置 1. Maven 介绍 Maven 翻译为 "专家","内行".Maven 是 Apache 下的一个纯 Java 开发的开源项目,它是 ...

  9. msys2 git status显示中文文件名问题

    git config [--global] core.quotepath off https://stackoverflow.com/questions/5854967/git-msysgit-acc ...

  10. highcharts点击事件系列

    http://www.highcharts.com/demo/line-ajax 参考设置(bar 柱状图) plotOptions: {                series: {       ...