1、为什么要有时钟
时钟对单片机来说就像人和心脏的关系一样,单片机有了时钟,才能够执行指令。所以使用任何一个外设都必须打开相应的时钟。
简单来说时钟是单片机的脉搏,为单片机执行每条指令提供驱动。

2、STM32系统时钟框图

将这个框图分成两部分分析:
系统时钟SYSCLK 的左边就是设置系统时钟使用哪个时钟源;
系统时钟SYSCLK 的右边是系统时钟通过AHB预分频器,给总线上挂在的外设设置对应的时钟频率

3、时钟源
在 STM32 中,一共有 5 个时钟种类,分别是 HSI 、 HSE 、 LSI 、 LSE 、 PLL 。

①HSI 是高速内部时钟, RC 振荡器,频率为 8MHz ;

②HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围是 4MHz – 16MHz ;

③LSI 是低速内部时钟, RC 振荡器,频率为 40KHz ;

④LSE 是低速外部时钟,接频率为 32.768KHz 的石英晶体;

⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源(因为PLL并不是自己产生的时钟源,而是通过其他三个时钟源倍频得到的时钟), PLL 的输入可以接 HSI/2 、 HSE 或者 HSE/2 。PLL倍频可选择为 2 – 16 倍,但是其输出频率最大不得超过 72MHz 。

4、系统时钟确定
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟
默认时钟使用HSE,经过PLL倍频,得到72M系统时钟。

5、与时钟有关的总线
(1)AHB总线
系统时钟(SYSCLK)最大频率为 72MHz ,它通过 AHB 分频器分频后送给5 大模块使用:

   ①送给 AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟;②通过 8 分频后送给 Cortex 的系统定时器时钟STCLK;③直接送给 Cortex 的空闲运行时钟 FCLK ;④送给 APB1 分频器。 APB1分频器可以选择1、2、4、8、16分频,其输出一路供 APB1 外设使用( PCLK1 ,最大频率36MHz),另一路送给定时器 (Timer)2 、 3 、 4 倍频器使用。该倍频器根据PCLK1的分频值自动选择 1 或者 2 倍频,时钟输出供定时器 2 、 3 、 4 使用。⑤送给 APB2 分频器。 APB2分频器可以选择1、2、4、8、16分频,其输出一路供 APB2 外设使用( PCLK2 ,最大频率 72MHz ),另外一路送给定时器 (Timer)1 倍频使用。该倍频器根据PCLK2的分频值自动选择1 或 2 倍频,时钟输出供定时器 1 使用。另外 APB2 分频器还有一路输出供 ADC 分频器使用,分频后送给 ADC 模块使用。 ADC分频器可选择为2、4、6、8分频。

(2)APB1,APB2总线
APB1从AHB上2分频,频率是36MHz,
APB2从AHB上1分频,频率是72MHz。
APB1和APB2总线上连接的模块:

6、MCO时钟输出

STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟SYSCLK。
这样可以把时钟信号输出供外部使用,也可以接在示波器上查看当前时钟频率是否与设定值吻合。
有些外部IC没有时钟不工作,但是加一个晶振需要成本,就可以考虑这个

7、程序
(1)默认时钟(使用HSE,经过PLL倍频,得到72M系统时钟)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

(2)HSE时钟

void HSE_SetSysClk( uint32_t RCC_PLLMul_x )
{ErrorStatus HSEStatus;// 把RCC 寄存器复位成复位值RCC_DeInit();   // 使能 HSE RCC_HSEConfig(RCC_HSE_ON);HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS ) {// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );} else {/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */}
}

(3)HSI时钟

void HSI_SetSysClk( uint32_t RCC_PLLMul_x )
{__IO uint32_t HSIStatus = 0;// 把RCC 寄存器复位成复位值RCC_DeInit();    // 使能 HSI RCC_HSICmd(ENABLE);HSIStatus = RCC->CR & RCC_CR_HSIRDY;if( HSIStatus == RCC_CR_HSIRDY ) {// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );} else {/* 如果HSI 启动失败,用户可以在这里添加处理错误的代码 */}
}

(4)MCO

/** 复用推挽模式开启MCO对应引脚PA8**/
void MCO_GPIO_Config()
{GPIO_InitTypeDef  GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
}
RCC_MCOConfig(RCC_MCO_SYSCLK);  /* 参数为要输出的时钟 */

配置好之后示波器探头接到PA8 上即可看到时钟波形

8、程序分享
链接:https://pan.baidu.com/s/18mjutYzEUkMvhEcDCtFnsg
提取码:u68h

【嵌入式】---- RCC相关推荐

  1. 嵌入式开发学习之--RCC(上)

    提示:本篇主要介绍一下不同时钟的特性和作用,了解为主. 文章目录 前言 一.RCC简介 二.系统时钟简介 2.1HSE 高速外部时钟信号 2.2锁相环 PLL 2.3系统时钟 SYSCLK 2.4AH ...

  2. 嵌入式开发学习之--RCC(下)

    文章目录 前言 一.使用HSE 二.使用HSI 三.代码编写 总结 前言 这一篇记录一下时钟的具体实验. 提示:以下是本篇文章正文内容,下面案例可供参考 一.使用HSE   一般情况下,我们都是使用 ...

  3. 微型计算机工业控制技术,基于ARM的微机原理与接口技术(STM32嵌入式系统架构编程与应用嵌入式与工业控制技术高等学校电子信息类专业系列教材)...

    导语 内容提要 本书首先介绍微型计算机的相关概念及嵌入式系统的应用,接着介绍Cortex M3微处理器架构及开发方法,介绍汇编语言及其程序设计.在开发应用方面,以STM32F103VET6为背景,介绍 ...

  4. ubuntu安装 rust nightly_Rust 嵌入式开发环境搭建指南 (一):让世界闪烁吧

    引 因为这是本专栏的第一篇文章,所以我打算先在这里介绍下专栏的写作目标. Rust 是一种系统编程语言. 它有着惊人的运行速度,能够防止段错误,并保证线程安全. Rust 官方一直标榜着自己是系统编程 ...

  5. 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇

    随着互联网连接技术的日益普及,以及大众环保意识增强,电子纸显示市场不断发展,墨水屏的应用场景也越来越多.墨水屏座位管理器方案具体功耗低,多节点管控,信息实时同步等特点,可应用于智慧办公,智慧零售,智慧 ...

  6. 嵌入式作业使用MDK编译stm32简单程序

    目录 一.MDK和stm32介绍 1.什么是stm32 2.什么是MDK 二.环境配置 1.准备工作 2.安装keil软件 3.keil的环境设置 三.stm32程序编译 1.新建工程 2.新建mai ...

  7. 【STM32G431RBTx】备战蓝桥杯嵌入式→基本模块→I2C→M24C02

    文章目录 前言 I2C 1.原理图以及配置元素 2.CubeMx的配置步骤 3.生成工程 4.测试代码 5.演示效果 总结 前言 G4板载了一块M24C02(eeprom)和一块MCP4017(可编程 ...

  8. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  9. 《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Windows版 - 1]

    Keil MDK.IAR等工具是各类STM32单片机使用的主要IDE,不过都是收费的,在使用中很可能牵扯到一定的版权问题.GCC(GNU Compiler Collection)作为GNU计划的一部分 ...

最新文章

  1. 【Python】zip函数
  2. win 常用网络命令
  3. mysql 服务启动异常
  4. php和java融合_JSP、PHP与JAVA融合的开发环境之二
  5. OpenGL编程指南14:混合半透明Blend
  6. 如何攻克目标检测?百度全球顶级会议双料冠军团队有话说!
  7. java 80_【JavaWeb】80:js基础详解
  8. A cycle was detected in the build path of project
  9. golang for range原理(转载)
  10. Python使用数学形态学腐蚀运算删除验证码图片中的干扰噪点和线条
  11. SMART Utility for mac (硬盘检测工具)
  12. SecondaryNamenode配置与NameNode故障恢复
  13. 网吧无盘用华为服务器,50台主机网吧无盘服务器
  14. 论文阅读笔记:Layer Normalization
  15. java 限制录入特殊字符_要求输入框里面必须同时含有字母,数字,特殊字符,且不小于8位...
  16. 中国剩余定理(孙子定理)
  17. java冒泡排序(java冒泡排序经典代码)
  18. 怎么使用视频做动图?如何快速将视频转成gif图
  19. Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)
  20. sqlserver SQL Server Management Studio和Transact-SQL创建账户、创建访问指定数据库的只读用户

热门文章

  1. 如何利用关键词采集工具,提高商品自然搜索流量?
  2. Python中shodan模块的使用
  3. 【甄选靶场】Vulnhub百个项目渗透——项目十三:SickOs 1.2(防火墙绕过,计划任务写入)
  4. 全国计算机等级考试准考证号是多少
  5. 什么是深度学习(Deep Learning)
  6. CSDN (中国软件开发联盟)泄密的两名嫌疑人已被刑事---白天工程师晚上做黑客
  7. 简析术捷盈库适合新手的一些内容和要素
  8. window route 路由表
  9. 路过秋天版博客-皮肤制作指南 [附犀利哥入侵攻防站话题]
  10. 微信惊现任意代码执行漏洞 360手机卫士提供自检方案