006 - STM32学习笔记 - RCC时钟树

news2024/11/19 16:23:40

006 - STM32学习笔记 - RCC时钟树

本节内容一定要结合RCC时钟树和官方手册学习,如果看不明白的话,建议看一下野火官方的教程,火哥讲这节讲的很详细,看一遍基本就能理解了。

上节内容中分析了启动代码,在启动代码中看到开发板上电后,会先执行Reset_Handler复位程序,里面会调用SystemInit程序

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                 LDR     R0, =SystemInit				;此处调用了SystemInit,此函数的实现实在system_stm32f4xx.c中
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

SystemInit函数原型


void SystemInit(void)
{
    #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    	SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
    #endif
    /* 设置RCC_CR中HSION位,即启用HSI时钟*/
    RCC->CR |= (uint32_t)0x00000001;
    /* 复位CFGR寄存器*/
    RCC->CFGR = 0x00000000;
    /* 复位RCC_CR中HSEON、CSSON、PLLON位,在后面会用SetSysClock在重新设置*/
    RCC->CR &= (uint32_t)0xFEF6FFFF;
    /* 复位锁相环时钟配置器*/
    RCC->PLLCFGR = 0x24003010;
    /* 复位HSE旁路时钟 */
    RCC->CR &= (uint32_t)0xFFFBFFFF;
    /* 关闭所有中断 */
    RCC->CIR = 0x00000000;
    #if defined(DATA_IN_ExtSRAM) || defined(DATA_IN_ExtSDRAM)
    	SystemInit_ExtMemCtl(); 
    #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */       
    /* 配置系统时钟,锁相环时钟及分频因子,AHB/APBx预分频及Flash设置 */
    SetSysClock();		//着重看这个函数实现,代码太长,这个函数原型就不往这贴了,下节会再把这个函数原型的学习笔记贴上来
    /* 配置向量表*/
    #ifdef VECT_TAB_SRAM
    	SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
    #else
    	SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    #endif
}

在这里插入图片描述

stm32时钟树

1、HSE时钟

HSE:High Speed External Clock Signal,外部高速时钟。一般来源为有源晶振或无源晶振,其中有源晶振频率可以达到1-50M,而无源晶振频率在4-26M之间。在429芯片上,通过OSC_OUT和OSC_IN两个引脚输入。我用的野火F429开发板使用的是无源晶振(25MHz),启用HSE需要在RCC时钟控制器(RCC_CR)中将HSE_ON置位,如果此位未写1,则系统默认启动HSI时钟

2、HSI时钟

HSI:High Speed Internal Clock Signal,内部高速时钟,当设置使用HSE后,如果HSE发生故障没有起振,系统会自动切换到HSI,等到HSE启动成功后,则会切换回HSE,429的HSI是集成到芯片内部,频率为16HHz。启用HSI需要在RCC时钟控制器(RCC_CR)中将HSI_ON置位(未选择启用HSE或者HSE故障时,系统会强制启动,所以实际此位不用操作)。
在这里插入图片描述

3、PLL锁相环

不论是HSE还是HSI时钟,作为系统时钟来说远远不够,而外部晶振频率越高,其功耗也会增加,且误差也会增大,因此需要经过一系列操作,将HSE或HSI经过分频因子M分频后,在通过倍频因子N,之后在经过分频因子P,最后计算出锁相环时钟PLLCLK。
P L L C L K = ( H S E / M ) ∗ N / P PLLCLK = ( HSE / M ) * N / P PLLCLK=(HSE/M)N/P
在这里插入图片描述
锁相环通过RCC_PLLCFGR中PLLSRC寄存器进行配置,写0:选择HSI时钟作为PLL和PLLI2S时钟输入,写1:选择HSE振荡器作为PLL和PLLI2S时钟输入。
在这里插入图片描述

M:主PLL和PLLI2S输入时钟分频系数,通过PLLM寄存器进行配置,可选配置数值可以从2-63;

在这里插入图片描述

这里需要注意在官方手册中,关于M的配置中有提示项,建议将VCO输入控制在1M-2M之间,因此此处M我们设置在选择为25,计算后25M/25 = 1MHz;

N:用于控制VCO的主PLL的倍频系数,通过PLLN寄存器配置,可选配置数值为2-432

在这里插入图片描述

这里官方提示VCO输出频率应该介于192-432MHz之间,后续计算方便,选择配置为360。

P:主系统时钟的主PLL分频系数
在这里插入图片描述

官方提示最终输出频率上限不能超过180MHz,因此这里选择分频因子p的值为2。

在以上数据选择完后,经过计算,最终PLLCLK的值为180MHz。
P L L C L K = 25 / 25 ∗ / 360 / 2 = 180 M H z PLLCLK = 25 / 25 * / 360 / 2 = 180MHz PLLCLK=25/25/360/2=180MHz

4、系统时钟

在这里插入图片描述

SYSCLK,在429中,系统时钟最高为180MHz,F407最高为168MHz,其来源主要由HSI、HSE以及PLLCLK提供,当HSE以及PLLCLK发生故障时,硬件强制会自动强制使用HSI为SYSCLK提供时钟,此时系统运行将特别慢。此项选择由RCC时钟配置寄存器RCC_CFGR中SW位1:0选择可选配置如下:

  • 00:选择由HSI振荡器作为系统时钟;

  • 01:选择由HSE振荡器作为系统时钟;

  • 10:选择由PLL作为i系统时钟

  • 11:不选择。

    这里由于配置了锁相环(PLLCLK),则选择配置为10。

在这里插入图片描述

HCLK时钟

HCLK:AHB高速总线时钟,在F429中频率最高为180MHz,其主要为AHB总线外设、系统定时器(Systick)、内核(FCLK)提供时钟。可配置为不分频/2/4/8/16/64/128/258/512分频。

在这里插入图片描述

PCLK1时钟

APB低速预分频器,最高为45MHz,主要为APB1总线外设提供时钟,2倍频后为APB1总线的定时器提供时钟,最大可达到90MHz。由RCC_CFGR时钟配置寄存器PPRE1位控制。可配置为不分频/2/4/8/16分频。

在这里插入图片描述

PCLK2时钟

APB高速预分频器,最高为90MHz,主要为APB2总线外设提供时钟,2倍频后为APB1总线的定时器提供时钟,最大可达到180MHz。由RCC_CFGR时钟配置寄存器PPRE2位控制。可配置为不分频/2/4/8/16分频。

在这里插入图片描述

在时钟树中,看到除了P之外,还有两个分频因子Q和R,其中Q主要为PLL48CK提供时钟,主要用于全速USB和随机数发生器以及SDIO提供时钟。

而R主要是在F446芯片中使用到,这里不做说明。

5、其他时钟

RTC时钟

RTC:为芯片内部的RTC提供时钟,来源于HSE_RTC(HSE分频得到)、LSE(外部32.768KHz晶振提供)、LSI(32KHz),由RCC备份域控制寄存器RCC_BDCR:RTCSEL位控制。

在这里插入图片描述

后面学到的看门狗时钟IWDGCLK就是由LSI提供的。

I2S时钟

由外部引脚I2S_CKIN或者PLLI2SCLK提供。

以太网PHY时钟

F429中没有集成PHY,所以只能外接PHY,野火F429上外接的是LAN8720,大小为50MHz。这里研究了一下野火的原理图,看到PHY芯片是由一个外部25MHz的晶振提供时钟,进入PHY芯片后,经过2倍频变为50HMz,在经过PA1引脚输入429中。

USB PHY时钟

同样429中没有集成PHY,野火上外接的是USB33000,USB PHY就由USB33000提供。

MCO时钟输出

MCO是将控制器的时钟通过外部的引脚输出,可以给外部设备提供时钟,在429上引脚为MCO1为PA8,由HSI、LSE、HSE、PLLCLK提供,MCO2为PC9,由HSE、PLLCLK、SYSCLK、PLLI2SCLK提供。这里可以通过MCO输出时钟到PHY芯片,可以省掉PHY所需的晶振,节约成本。软件中设置MCO输出后,可用示波器检测系统时钟是否配置正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis - Redis16个常见使用场景

1、缓存 String类型 例如&#xff1a;热点数据缓存&#xff08;例如报表、明星出轨&#xff09;&#xff0c;对象缓存、全页缓存、可以提升热点数据的访问数据 作为Key-Value形态的内存数据库&#xff0c;Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数…

【面试题】操作系统面试实战

version&#xff1a;1.0 文章目录 操作系统进程管理&#x1f64e;‍♂️面试官&#xff1a;进程和线程的区别&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;进程有哪几种状态?&#x1f64e;‍♂️面试官&#xff1a;进程间的通信方式&#xff1f;&#x1f64e;‍♂️面试…

体验使用 InsCode AI 创作助手 来帮我完成一篇博客

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 InsCode AI 创作助手 它来啦回答不满意可以要求重新生成在输入 prompt 时&#…

Selenium2023最全攻略(元素操作,浏览器操作等)附完整代码!

一、元素操作方法 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 注意&#xff1a;在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver # 实例化浏览器 driver webdriver.Chrome(…

XDP入门--之eBPF sample内核示例代码的编译

Linux内核代码提供了很多eBPF的示例代码(以linux6.1版本内核代码为例)&#xff0c;我们可以在/Linux/samples/bpf目录下找到示例代码。 1、查看Linux内核版本 本文不讨论交叉编译的情况&#xff0c;因为eBPF还在快速发展中&#xff0c;不同版本的Linux内核的支持情况不太一至…

网络安全就业有什么要求?一般人还真不行

前言 网络安全工程师又叫信息安全工程师。随着互联网发展和 IT 技术的普及&#xff0c;网络和 IT 已经日渐深入到日常生活和工作当中&#xff0c;社会信息化和信息网络化&#xff0c;突破了应用信息在时间和空间上的障碍&#xff0c;使信息的价值不断提高。但是与此同时&#…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

程序员职业病之中医颈椎痛缓解办法

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 治疗颈椎病的穴位按摩是一种传统中医疗法&#xff0c;可以缓解颈椎病引起的疼痛和不适。下面是关于五个常用穴位的介绍、取穴定位、按摩方法和功效主治的总结&#xff1a; 人体穴位图 穴位图 1. 揉捏风池穴&#xf…

Linux 备份要点

文章目录 Linux 备份要点确定备份的目录和文件备份的种类、频率与工具的选择完整备份增量备份差异备份镜像备份 定期备份远程备份的脚本使用rsync上传备份数据 Linux 备份要点 在Linux系统中&#xff0c;备份数据是非常重要的&#xff0c;特别是在生产环境中。以下是Linux备份…

【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法

&#x1f4af; 博客内容&#xff1a;【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&…

Hadoop HA(高可用)搭建

ZooKeeper配置 解压安装 添加ZK环境变量 分发文件 启动 安装配置 Hadoop 解压安装 修改hadoop-env.sh文件 修改Hadoop配置文件core-site.xml HDFS 配置文件hdfs-site.xml MapReduce 配置文件 mapred-site.xml YARN 配置文件yarn-site.xml 配置worekers 分发配…

Nginx配置文件

四.Nginx配置 1.位置 /usr/local/nginx/conf/nginx.conf2.内容 Nginx的主配置文件是nginx.conf&#xff0c;这个配置文件一共由三部分组成&#xff0c;分别为全局块、events块和http块。在http块中&#xff0c;又包含http全局块、多个server块。每个server块中&#xff0c;可…

基于3.0.0-cdh6.3.2版本编译Flink1.14.4

一、背景 异常描述 CDH-6.3.2环境下使用Flink-1.14.4的FlinkSQL的hive方言时出现如下异常 java.lang.Runtimelxception: java,lang.IllegalArgumentException: Unrecoonized Hadoop major version number: 3.0.0-cdh6.2.1 问题说明 开源社区hive 2.x的版本这种情况下是不支…

Java时间类(十一) -- Date类工具类 -- Java获取当天、本周、本月、本年 开始及结束时间

目录 1. 今天的日期如下: 2. DateUtils工具类的源代码: 3. 测试类 1. 今天的日期如下:

React Hooks useRef 源码解读+最佳实践

参考&#xff1a;https://juejin.cn/post/7027949526170206239 入口 下篇文章有入口源码详解&#xff0c;想看的可以跳转过去&#xff0c;这里就不放源码了&#xff0c;简单梳理一下流程吧 React Hooks useState 使用详解实现原理源码分析 流程 beginWork 判断组件类型&#x…

SpringCloud(26):系统自适应保护实现

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制&#xff0c;结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标&#xff0c;通过自适应的流控策略&#xff0c;让系统的入口流量和系统的负载达到一个平衡&#xff0c;让系统尽可…

ACP(MaxCompute篇)-MaxCompute自定义函数开发

概述 数据映射关系 自定义函数 相关资料 【MaxCompute】实现自定义UDF、UDTF详解_maxcompute 自定义函数_beautiful_huang的博客-CSDN博客 UDF UDTF UDAF 函数发布 test11_123>add jar C:\Users\zhang\Desktop\相关电子书\test\target\test-1.jar -f; OK: Resource tes…

Linux 分布式版本控制系统git

目录 什么是git&#xff1f; 安装git 创建版本库 工作区和版本库、 向版本库中添加文件 版本回退 远程操作 什么是git&#xff1f;  Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 linux是一个开源软件&#xff0c;第一版本&am…

【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)

Maven介绍 由于Java的生态非常丰富&#xff0c;无论你想实现什么功能&#xff0c;都能找到对应的工具类&#xff0c;这些工具类都是以jar包的形式出现的&#xff0c;例如Spring,SpringMVC、MyBatis、数据库驱动&#xff0c;等等&#xff0c;都是以jar包的形式出现的&#xff0…

华为OD机试之完美走位(Java源码)

完美走位 题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位。 假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键…