(STM32笔记)九、RCC时钟树与时钟 第二部分

news2024/9/30 13:27:30

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。

九、RCC时钟树与时钟

  • 九、RCC时钟树与时钟
    • 2、时钟配置函数
      • 时钟初始化思路(72M)
        • 复位时钟至默认状态
        • 使能HSE,并等待HSE就绪
        • 设置flash,设置时钟树,使能PLL
      • 更新时钟频率思路
        • 获取时钟源
        • 选择系统时间源
        • 保存在SystemCoreClock

九、RCC时钟树与时钟

2、时钟配置函数

在程序启动文件startup_stm32f10x_hd.s里找到SystemInit函数跳转入口
在这里插入图片描述

system_stm32f10x.c中找到SystemInit函数

时钟初始化思路(72M)

复位时钟至默认状态
    RCC->CR   |= (u32)0x00000001;                                // 开启内部时钟
    RCC->CFGR &= (u32)0xF8FF0000;                                // 复位 SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
    RCC->CFGR &= (u32)0xFF80FFFF;                                // 复位 PLL和分频的配置
    RCC->CIR   = 0x009F0000;                                     // 关闭中断,清理中断位
使能HSE,并等待HSE就绪
// 配置时钟 HCLK, PCLK, PCLK1, PCLK2, FLASH 
    __IO u32 StartUpCounter = 0, HSEStatus = 0;      
    
    RCC->CR |= ((u32)RCC_CR_HSEON);                              // 使能 HSE  
    do{                                                          // 等待HSE就绪
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;  
      } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));   // 0x0500
设置flash,设置时钟树,使能PLL
    if ((RCC->CR & RCC_CR_HSERDY) != RESET)  {  
        FLASH->ACR |= FLASH_ACR_PRFTBE;                          // 启动预取缓冲区   
        FLASH->ACR &= (u32)((u32)~FLASH_ACR_LATENCY);            // 设置时延
        FLASH->ACR |= (u32)FLASH_ACR_LATENCY_2;    
 
        RCC->CFGR  |= (u32)RCC_CFGR_HPRE_DIV1;                   // [7:4]   AHB  预分频, HCLK = SYSCLK/1  不分频     
        RCC->CFGR  |= (u32)RCC_CFGR_PPRE2_DIV1;                  // [13:11] APB2 预分频, APB2 = HCLK/1,   不分频
        RCC->CFGR  |= (u32)RCC_CFGR_PPRE1_DIV2;                  // [10: 8] APB1 预分频, APB1 = HCLK/2,    2分频
 
        RCC->CFGR  &= (u32)(~( 1<<16 | 0x01<<17 | 0xF<<18));     // 清零
        RCC->CFGR  |= (u32)(0x01<<16 | 0x07<<18);                // PLL 时钟源,低频因子,倍频系数, 使PLLCK= HSE * 9= 72MHz   
        RCC->CR    |= (u32)(0x01<<24);                           // 使能PLL    
        while((RCC->CR & RCC_CR_PLLRDY) == 0) {  }               // 等待PLL就绪
    
        RCC->CFGR &= (u32)((u32)~(0x3<<0));                      // 清0
        RCC->CFGR |= (u32)(0x1 << 1);                            // 切换系统时钟源为:PLLCLOCK    
        while ((RCC->CFGR & (u32)RCC_CFGR_SWS) != (u32)0x08) { } // 等待系统时钟切换完成
    }
    else
    { 
        // 重要!!!
        // 时钟初始化失败 
        // 处理位置
    }    

更新时钟频率思路

获取时钟源
    u32 tmp = 0, pllmull = 0, pllsource = 0;    
 
    tmp = RCC->CFGR & RCC_CFGR_SWS;                                 // 获取时钟源
选择系统时间源
switch (tmp)  {
        case 0x00:                                                  // HSI 内部高速晶振 被选为系统时钟源
            SystemCoreClock = HSI_VALUE;
            break;
    
        case 0x04:                                                  // HSE 外部高速晶振 被选为系统时钟源
            SystemCoreClock = HSE_VALUE;
            break;
    
        case 0x08:                                                  // PLL 被先为系统时钟源     
            pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;                 // PLL 时钟源及倍频系数
            pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;       
            pllmull = ( pllmull >> 18) + 2;      
            if (pllsource == 0x00)
            {        
                SystemCoreClock = (HSI_VALUE >> 1) * pllmull;       // HSI振荡器时钟2分频作为PLL时钟输入
            }
            else
            {                                                       // HSE作为PLL时钟输入                              
                if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (u32)RESET)
                {
                    SystemCoreClock = (HSE_VALUE >> 1) * pllmull;   // HSE 2分频
                }
                else
                {
                    SystemCoreClock = HSE_VALUE * pllmull;
                }
            }
            break;
 
        default:
            SystemCoreClock = HSI_VALUE;
            break;
    } 
保存在SystemCoreClock
    tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];  
    SystemCoreClock >>= tmp; 

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

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

相关文章

第128天:内网安全-横向移动IPCATSC 命令Impacket 套件CS 插件全自动

环境部署 案例一&#xff1a; 域横向移动-IPC-命令版-at&schtasks 首先是通过外网web访问到win2008&#xff0c;获得了win2008的权限&#xff0c;这一步不做演示 因为里面的主机都不出网&#xff0c;所以只能利用win2008进行正向或者反向连接 信息收集 域内用户信息&…

【Git学习笔记】零基础入门学习Git

1. 学习目标 掌握Git企业应用开发的基本操作以及背后原理&#xff0c;掌握工作区、暂存区、版本库的区别掌握Git的版本管理&#xff0c;例如版本回退、撤销、修改等操作掌握Git的分支管理&#xff0c;例如创建分支、合并分支、删除分支掌握本地仓库与远程仓库之间的区别&#…

数据结构实验报告-链表

实 验 二 报 告 一、实验目的 1.熟练掌握链表的结构类型定义、特点。 2.熟练掌握链表的基本操作算法的实现及其算法时间复杂度的分析。 3.掌握循环链表、双向链表的结构类型定义及其基本操作算法。掌握链表的应用。 二、实验内容 1&#xff0e;请编写一个完整的程序&…

基于RHEL7的服务器批量安装

目录 一、项目要求 二、实验环境 三、生成kickstart自动化安装脚本 四、搭建dhcp服务并测试kickstart脚本 五、搭建pxe网络安装环境实现服务器自动部署 ​编辑 六、测试 一、项目要求 1.使用kickstart编写自动化安装脚本 2.搭建dhcp服务并测试kickstart脚本 3.搭建px…

软件设计之HTML5

软件设计之HTML5 【狂神说Java】HTML5完整教学通俗易懂 学习内容&#xff1a; 软件开发技能点参照&#xff1a;软件开发&#xff0c;小白变大佬&#xff0c;这套学习路线让你少走弯路是认真的&#xff0c;欢迎讨论 软件开发技能点参照&#xff1a;Java学习完整路线&#xff…

【doghead】mac构建 2: player 端 clion构建

准备工作 【doghead】mac构建 1 【doghead】mac: clion2024.1启动崩溃 mbp的 uv 构建ok zhangbin@zhangbin-mbp-2  ~/tet/Fargo/zhb-bifrost/Bifrost-202403/worker/third_party/libuv   main clion使用lldb cmake构建 更

SQL注入:MySQL元数据库,外网实战手工SQL注入

MySQL元数据库 MySQL的元数据库是一组特殊的数据库&#xff0c;用于存储MySQL服务器的元数据信息&#xff0c;在sql注入中较为常用为以下两种元数据库&#xff1a; information_schema&#xff1a;这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表…

7 WIFI

7 WIFI 1、ESP8266模块2、烧写固件3、调试工具4、使用库函数实现wifi4.1 实现串口3和DMA的初始化4.2 利用串口3实现wifi 1、ESP8266模块 ESP8266系列无线模块是安信可科技自主研发设计的一系列高性价比WIFI SOC模组。该系列模块支持标准的IEEE802.11 b/g/n协议&#xff0c;内置…

Unity UnityWebRequest封装类

简化api调用流程&#xff0c;非常奈斯。 RestWebClient.cs using System; using System.Collections; using UnityEngine; using UnityEngine.Networking;namespace MYTOOL.RestClient {/// <summary>/// UnityWebRequest封装类/// </summary>public class RestW…

基于R语言绘制GGE双标图1

参考资料&#xff1a; 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、安装GGEBiplots包 目前搜索到的资料多数为“GGEBiplotGUI”安装包&#xff0c;但在安装时报错&#xff0c;如下…

【独家原创】基于APO-Transformer-LSTM多特征分类预测(多输入单输出)Matlab代码

【独家原创】基于APO-Transformer-LSTM多特征分类预测&#xff08;多输入单输出&#xff09;Matlab代码 目录 【独家原创】基于APO-Transformer-LSTM多特征分类预测&#xff08;多输入单输出&#xff09;Matlab代码分类效果基本描述程序设计参考资料 分类效果 基本描述 [24年最…

【初阶数据结构题目】11.相交链表

相交链表 点击链接做题 思路&#xff1a; 如何判断链表是否相交找相交链表的起始节点 遍历两个链表&#xff0c;若尾结点相同&#xff0c;则链表一定相交。两个链表节点个数相同&#xff1a;往后遍历&#xff0c;找到相交的位置两个链表节点个数不同&#xff1a; 找两个链表的…

End-to-End Object Detection with Transformers(Detection Transformer)翻译

摘要 我们提出了一种新方法&#xff0c;将目标检测视为直接的集合预测问题。我们的方法简化了检测流程&#xff0c;有效消除了对许多手工设计组件的需求&#xff0c;如非极大值抑制过程或锚框生成&#xff0c;这些组件显式编码了我们对任务的先验知识。新框架称为检测变换器&a…

Meta Reality Labs:巨额亏损背后的挑战与展望

一、财务概况 自2020年以来,Meta的Reality Labs部门累计亏损已超过450亿美元,其中2023年的亏损达到160亿美元,2024年第一季度亏损38亿美元,分析师预计第二季度亏损可能接近50亿美元。尽管投入巨大,Reality Labs的收入却呈现下降趋势,与不断增加的支出形成鲜明对比。 二…

QT使用V4L2摄像头采集数据

前言 之前我们已经实现了摄像头用V4L2框架采集一张图片&#xff0c;现在就是实现用摄像头采集视频流&#xff08;本质一张图片就是一帧&#xff0c;很多张图片就是很多帧&#xff0c;拼起来就是一个视频&#xff09;。 本部分需要大家有一点QT相关的知识&#xff0c;整体框架还…

CSP 2020 第三题:表达式

牛客网题目 题目内容&#xff1a; 示例1 输入 x1 x2 & x3 | 3 1 0 1 3 1 2 3输出 1 1 0题意&#xff1a; 给出后续表达式&#xff0c;需要计算这个表达式的值&#xff0c;并让某几个变量值取反&#xff0c;再输出新的表达式的值&#xff08;变量改变均为临时的&#xff…

基于Orangepi全志H616学习Python3

目录 一、功能需求 二、Python的安装和环境搭建 三、Python的基础学习 3.1 Python的特点&#xff1a; 3.2 编写并运行第一个Python程序&#xff1a; 3.3 标识符&#xff1a; 3.4 关键字&#xff1a; 3.5 注释&#xff1a; 3.6 行与缩进&#xff1a; 3.7 多行语句&…

虚拟机(CentOS7)安装jenkins

centos7安装jenkins 前提条件&#xff0c;安装jdk与maven 1、JDK17安装 # 进入系统管理员 sudo root # 进入对应文件夹下 cd /usr/local # 下载jdk17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm # rpm命令安装下载的jdk17 rpm -ivh jdk-17_li…

从根儿上学习spring 七 之run方法启动第四段(1)

图1 一步一步我们转眼间来到了第四部分&#xff0c;这是spring最核心的部分包含了bean的整个生命周期过程&#xff0c;不过大家不用担心如果内容过长我会分多个小节来说明以防止一篇文章让大家看晕看累难以吸收理解。让我们直接进入正题。 我们先进入图1的refreshContext方法看…

PEX实验

一、kickstart自动安装脚本制作 1.关闭本机dhcp服务 2.安装图形化生成kickstart自动安装脚本的工具 3.配置http服务 下载httpd 启动并挂载 3.启动图形制作工具 system-config-kickstart 4.配置ks.cfg 5.拷贝到/var/www/html/中去 6.浏览器测试 配置dhcp服务 测试 二.搭建pex…