一、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. .net core使用 ELK

    一 Linux 下安装部署 第一种方法:docker-compose 安装方式 1.1 创建 docker-compose.yml 文件 version: '3.1' services: elasti ...

  2. 堆相关题目-python

    栈&队列&哈希表&堆-python  https://blog.csdn.net/qq_19446965/article/details/102982047 1.丑数 II 编 ...

  3. Ubuntu20下载安装Docker

    安装Docker 卸载旧版本 sudo apt-get remove docker \ docker-engine \ docker.io 使用apt安装 sudo apt-get update su ...

  4. transformers 之Trainer对应的数据加载

    基础信息说明 本文以Seq2SeqTrainer作为实例,来讨论其模型训练时的数据加载方式 预训练模型:opus-mt-en-zh 数据集:本地数据集 任务:en-zh 机器翻译 数据加载 Train ...

  5. echarts 总结

    ECharts访问链接 https://blog.csdn.net/Yi2008yi/article/details/122808328 :force-use-old-canvas="tru ...

  6. react native SectionList组件实现多选

    如下图所示: 代码如下: import React, { useRef, Component } from 'react'; import { Platform, Text, View, TextIn ...

  7. 【SQL SERVER】DATEDIFF() :两个日期的日期差

    定义用法 DATEDIFF() 函数返回两个日期之间的日期差. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...

  8. maven项目pom.xml报未找到指定路径文件

    解决方法: 错误环境:Tomcat7 + Eclipse + Maven + Spring + SpringMvc + Mybatis 错误描述: 错误解决步骤: 1.找到eclipse的projec ...

  9. vue 滑动到指定位置

    在Vue中,有三种方式可以实现H5页面滑动至指定位置 方法1: //先获取目标位置距离 mounted() { this.$nextTick(() => { setTimeout(() => ...

  10. 有道翻译-JS逆向-api调用

    简单方法 -调用开源api 这个比较简单四行代码就可以搞定,先放代码: 1 import requests 2 while True: 3 input_data = input('请输入你要翻译的数据 ...