一、RCC原理

所有stm32的外设都是挂载在相应的时钟上的,如下

挂载在AHB上的外设

挂载在APB1上的

APB2上的

所以RCC很重要,特别像TIM这种对时钟特别敏感的外设就必须把SYSCLK确定好,才能正常使用TIM外设。

那么问题来了,SYSCLK如何产生,或者如何配置?

其实不做任何配置芯片外设也是可以正常工作的,一般是默认设置,使用SYSCLK=HSI。对于F1就是8M,F2就是16M。

要配置自己想要的SYSCLK频率其实很简单。

1.确定好时钟源

RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);

不难发现这里可以选择的时钟有三种HSI/HSE/PLLCLK三种。

前两种很好理解,HSE或HSI频率是多少SYSCLK的频率就是多少,直等关系。缺点是可选的频率少。

2.使用PLL产生需要的时钟频率

锁相环PLL理论上可以生成任意频率的时钟,PLL不产生时钟他也需要时钟源,如下图PLL可选HSI或SHE作为其时钟源。

RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);

然后需要设置其倍频分频系数,暂且设PLL的时钟源为S

PLLCLK = S*N/M*P

举个例子S=16M,需要PLLCLK=120M,怎么选择系数。

120 = 16N/M*P,  N/M*P = 120/16(因为N要>192) = 240/32 = 240/16*2 = 240/8*4 配置方法不一

要注意的是时钟振荡频率不能大于120M对于F2系列来说。

二、代码实现(HSE版)

1.清除之前设置,还原默认值  RCC_DeInit();

2.打开HSE  RCC_HSEConfig(RCC_HSE_ON);

3.等待起振  RCC_WaitForHSEStartUp() == SUCCESS

4.设置AHB    RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
   设置高速AHB  RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
   设置低速AHB  RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M

5.设置PLL  RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
   开启PLL  RCC_PLLCmd(ENABLE);

等待PLL  RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET

6.选择SYSCLK为PLL  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   等待SYSCLK启动 (RCC_GetSYSCLKSource() != 0x08  

HSI版:

void RCC_Config()
{
RCC_DeInit();
// RCC_HSEConfig(RCC_HSE_ON);外部晶振不准暂不启用
// if(RCC_WaitForHSEStartUp() == SUCCESS)
// {
// }
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M
// /*设置FLASH存储器延时时钟周期数*/
// FLASH_SetLatency(FLASH_Latency_2);//FLASH_Latency_2 2延时周期
// /*选择FLASH预取指缓存的模式*/
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能
RCC_HSICmd(ENABLE);
RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)//等待PLL启动
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)//等待SYSCLK启动
{
}
}

【STM32】SYSCLK配置|学习笔记的更多相关文章

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  2. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  3. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

  4. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  5. Chapter 2. OpenSSL的安装和配置学习笔记

    Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...

  6. redis 安装配置学习笔记

    redis 安装配置学习笔记 //wget http://download.redis.io/releases/redis-2.8.17.tar.gz 下载最新版本 wget http://downl ...

  7. stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

    STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...

  8. STM32嵌入式开发学习笔记(六):串口通信(上)

    本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...

  9. Elasticsearch的配置学习笔记

    文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器.它提供一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,Elasticsearch是用Java语言开发的. ...

  10. stm32寄存器版学习笔记08 DMA

    DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...

随机推荐

  1. vue项目引用vue-pdf打包多出worker.js文件

    问题描述:项目要用到pdf预览功能,因为是vue项目就是直接导入了vue-pdf组件,但是在进行打包的时候在dist文件夹下面多个worker.js文件,导致项目部署后预览pdf直接报了404 方案一 ...

  2. jquery实现多图片上传

    在做后台管理的时候,遇到这样一个需求,实现多张图片上传并按选中的顺序显示.PS:图片上传的时候是即时上传到服务器,后台返回图片在服务器上的地址,在最后点击提交按钮的时候,把地址传给后端写入数据库即可. ...

  3. java中overload与override的区别

    1.综述 重写(Override)也称覆盖,它是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现. override从字面就可以知道,它是覆盖了一个方法并且对其重写 ...

  4. Linux 服务器内存异常问题记录

    一.内存异常 1. 问题描述:服务器内存一会儿就增加1G,但也没有看到有消耗内存较大的进程:最后联想到项目最近做ARM架构适配,有变更代码,立马想到使用的SSH组件,一查看就发现有大量的进程: 解决办 ...

  5. macos 安装多版本PHP,composer

    PHP版本切换网上有写博客用 brew-php-switcher 切换实际没生效,博客也是相互抄,看了袭浪费时间.讲一下我的思路,因为php 可以cli 和fpm 的方式.安装php 将不同版本添加命 ...

  6. Linxu后台运行Java的jar包

    1.直接运行 java -jar myjar-0.0.1-SNAPSHOT.jar 这种方式需要一直挂载终端(Ctrl+C会结束进程.关闭shell也会结束进程),故不符合需求 2.后台运行 A.Ct ...

  7. GridView.RowCellClick Event

    Fires when a user clicks a data cell. If data is editable and the ColumnViewOptionsBehavior.EditorSh ...

  8. python菜鸟学习: 15 GUI界面化记事本

    # -*- coding: utf-8 -*-import tkinter as tkdef getNewCreate(): passdef getCharcount1(sss): # 添加字数统 s ...

  9. ubuntu 20.04 ibus添加五笔输入法

    ubuntu 20.04 ibus添加五笔输入法:虽然现在五笔输入法已经没有什么新人使用,如果还有一两个人,找不到系统自带的极点五笔输入,可以按如下方式操作:以前是用ibus-setup,点添加,现在 ...

  10. Python学习笔记(五)if分支语句

    一.if语法 示例: 1 money = int(input('请输入余额:')) 2 if money >= 5: 3 print('买得起!') 4 5 if True: 6 print(' ...