STM32F40X之时钟树

news2024/11/7 0:05:40

一、时钟树概述

目前用到的STM32的许多片上外设都需要先打开相应的时钟,告诉当前这个器件是以什么频率在运行,而每个片上外设的时钟频率其实在出厂时已经固化。

二、时钟树框架

25M / 25 * 336 / 2 = 168M

系统时钟计算公式:SYSCLK=PLLCLK = HSE / M *N / P = 168M

系统时钟 (SYSCLK==168MHZ)可以来自以下三种不同的时钟源。 
● HSI 振荡器时钟 
● HSE 振荡器时钟 
● 主 PLL (PLL) 时钟 
留心:芯片内部未使用时默认都是关闭的,目的是降低功耗,可以单独打开或者关闭。
3概念补充:
(1)MCO1/2: 微处理器的时钟输出,可以向外提供时钟源而且也可以测量芯片内部时钟是否稳定正确。
(2)芯片内部的工作时钟可以由以下四个时钟提供:(重点)
①LSI(low speed inner):内部低速时钟:该时钟是芯片内部的一个32KHZ的RC振荡器,该时钟非常不稳定,一般很少使用。
作用对象:独立看门狗和RTC
②LSE(外部低速时钟):该时钟是由芯片外部提供的的一个32.768KHZ的有源晶振,该时钟要求要很稳定,是RTC专用时钟。
作用对象:RTC也可以向外提供一个时钟源。
③HSI(内部高速时钟):该时钟是芯片内部的一个16MHZ的RC振荡器,该时钟用途很多。
作用对象:向外输出一个时钟源、给系统提供时钟、作为PLL时钟输入源。
④HSE(外部高速时钟):该时钟是由芯片外部提供的的一个25MHZ的有源晶振,该时钟非常稳定.
作用对象:向外输出一个时钟源、给系统提供时钟、作为PLL时钟输入源,作为RTC的时钟输入源。
(3)锁相环(PPL):使得输入和输出两个频率同步即具有稳定频率的作用。能使输出频率是输入频率的倍数,可以实现对输入输出信号的进行调制。

在APB1总线上的外设时钟频率为42M,但是定时器的时钟频率是84M

在APB2总线上的外设时钟频率为84M,但是定时器的时钟频率是168M

框架分析思路:

芯片要想工作需要一个时钟输入,对于该芯片(40x)时钟频率最高168Mhz,所以最终我们需要获得一个168MHZ(系统要求的) 的时钟作为系统时钟,再由该系统时钟经过分频得到各个模块的时钟。
经分析:系统时钟可以来自以下三个输入源:即HIS/HSE/PLL(锁相环)

由上图可知HIS(16MHZ)和HSE(25MHZ)都不能直接选为系统时钟(要求是168MHZ),经分析虽然HIS(16MHZ)和HSE(25MHZ)都不能直得到系统时钟(168MHZ),但是可以选择PLLCLK作为系统时钟,而PLLCLK的时钟要经过锁相环(PLL)处理才能得到。

三、时钟树程序设计

时钟设置步骤如下:                  
1使能HSI 。
2等待HSI打开成功。
3设置电压调节器输出级别默认就行)。
4打开电源开关(默认就行)
5设置AHB/APB1/APB2的分频值。
6关闭主锁相环锁 (可以不要)
7等待关闭成功(可以不要)
8配置PLL(M/N/P包括选择HSI作为锁相环输入时钟源)。
9开启主PLL。
10等待主锁相环稳定。
11设置flash的相关参数(缓存,存取指令数据缓存,等待周期等 默认就可以)    
12切换PLL为系统时钟源。
13 等待PLL作为系统时钟切换成功。

void SystemInit(void)
{
/* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;//把RCC的第0位置1

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000; //CFGR寄存器全部复位

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF; //复位HSE,CSS,PLL

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;//对于后面需要配置的PLL相应的时钟复位成原本的值

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;//复位HSEYP的位

  /* Disable all interrupts */
  RCC->CIR = 0x00000000; //复位中断

}

static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0; //StartUpCounter 超时计数变量,HSEStatus 标志位

 /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使能HSE的振荡器
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;//要不就是0,要不就是非零值
    StartUpCounter++;//累加
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
//上面的do while出来的条件有两个:一个是HSE就绪,一个是等待的时间到了

//判断HSE有没有就绪
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }
 if (HSEStatus == (uint32_t)0x01)
  {
    /* Select regulator voltage output Scale 1 mode */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;//使能电源接口时钟
    PWR->CR |= PWR_CR_VOS;

/* HCLK = SYSCLK / 1*/
 RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHB为1分频
 /* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2为2分频

  /* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1为4分频

RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
//M分频是25,N倍频是336,P分频是2,选择 HSE 振荡器时钟作为 PLL 和 PLLI2S 时钟输入
 /* Enable the main PLL */
 RCC->CR |= RCC_CR_PLLON;//开启PLL时钟源
 /* Wait till the main PLL is ready */
  while((RCC->CR & RCC_CR_PLLRDY) == 0)//死等PLL就绪
  {
  }
 /* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL; //选择PLL作为系统时钟源168M

}


HSE改为HSI最后还是168M

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

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

相关文章

从入门到进阶 之 ElasticSearch 配置优化篇

&#x1f339; 以上分享从入门到进阶 之 ElasticSearch 配置优化篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏…

【JavaEE】_Servlet API

目录 1. HttpServlet 1.1 init方法 1.2 destroy方法 1.3 service方法 1.4 Servlet的生命周期 1.5 代码示例 1.5.1 使用postman构造请求 1.5.2 使用ajax构造请求 2. HttpServletRequest 2.1 核心方法 2.2 代码示例1&#xff1a;打印请求信息 3. 前端给后端传参 3.1…

新手如何用Airtest实现在图片范围内随机点击?

1. 前言 前几天有个新手同学在Airtest官群里问了这样一个问题&#xff1a; 我是新手&#xff0c;在图片范围内随机点击 &#xff0c;用Airtest怎么实现&#xff1f;代码&#xff1f; 那我们就以这个问题为例&#xff0c;浅浅聊一下&#xff0c;怎么把需求转化成我们的Airtest代…

Linux——shell外壳程序

shell外壳程序 1. 什么是shell外壳程序 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心 “ &#xff0c;但我们一般用户&#xff0c;不能直接使用核心。 而是通过核心的“外壳”程序&#xff0c;也就是所谓的shell。 shell是所有外壳程序的统称 平时程序员…

毅速3D打印丨哪些产品最适合应用3D打印随形水路模具

3D打印技术随形水路模具无论是从生产效率、生产成本&#xff0c;还是从产品质量出发考虑&#xff0c;在各个领域有着重要的应用&#xff0c;毅速3D打印根据统计了目前应用比较多的产品领域主要有以下几类&#xff1a; 1、医疗美妆类产品。如化妆品包装瓶、脸部按摩仪等透明产品…

行情分析——加密货币市场大盘走势(10.20)

大饼昨日迅猛上涨&#xff0c;并在今日依然上涨&#xff0c;目前处在蓝色上涨趋势线&#xff0c;上涨趋势依然在。中长线可以考虑过几天止损或者继续持有。目前MACD日线呈现绿色实心5天&#xff0c;预计明后天可能会绿色空心&#xff0c;注意后续空头的到来&#xff0c;注意多单…

UART通信——笔记

UART通信特点 异步、全双工、串行。 只使用一对线就可以实现数据的通信&#xff0c;节约成本。 数据一位一位发送&#xff0c;数据传输较慢。 只能一对一通信。 如何实现通信的&#xff1f; UART&#xff1a; 发送数据的TX接受数据的RX参考GND UART是异步通信&#xff0c;…

SpringCloud 微服务全栈体系(一)

第一章 认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 一、单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff…

MySQL数据库简单安装

MySQL介绍 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管…

大河弯弯:CSS 文档流与三大元素显示模式

文章目录 参考环境文档流概念三大显示模式 内联元素概念常见的内联元素宽高由内容决定 块级元素概念常见的块级元素宽度受容器影响&#xff0c;高度受内容影响 内联块级元素概念常见的内联块级元素折中方案 设置元素的显示模式display 属性内联元素与块级元素的切换为什么要通过…

大托,如何站上天心南部的价值高地?

作者 | 魏启扬 陈宇航 来源 | 洞见新研社 陈飞 摄 “商贾云集于四方&#xff0c;市井数盈于万户”&#xff0c;长沙南城古往今来生生不息的热辣与烟火&#xff0c;每隔一段时间&#xff0c;都会有璀璨的迸发。 才在“加长版”黄金周释放了“不夜南城”的魅力&#xff0c;第…

YOLO目标检测——红细胞数据集【(含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红细胞的自动检测和计数数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&am…

C++类和对象(四) (构造函数 析构函数)

1 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生…

SolidWorks2021 安装教程(亲测可用)

1.安装教程&#xff1a;&#xff08;断网进行&#xff0c;否则安装了后还是无法用&#xff09; 1.运行sw2021_network_serials_licensing 2. 注册表编辑器确定 3.成功添加到注册表中 4.复制SolidWorks_Flexnet_Server文件夹 5.运行SolidWorks_Flexnet_Server下的lserver_insta…

一个适合练手的接口测试实战项目——慕慕生鲜

前言 最近很多粉丝找小月要接口测试项目练练手&#xff0c;看看实力&#xff01;今天&#xff0c;它来了 慕慕生鲜&#xff0c;完整版&#xff0c;文末有福利&#xff01; 干货来咯&#xff0c;收藏好&#xff01; 1. 接口测试需求分析 常见接口文档提供的两种方式 ①wor…

代码随想录算法训练营第23期day26|39. 组合总和、40.组合总和II、131.分割回文串

目录 一、&#xff08;leetcode 39&#xff09;组合总和 二、&#xff08;leetcode 40&#xff09;组合总和II 三、&#xff08;leetcode 131&#xff09;分割回文串 一、&#xff08;leetcode 39&#xff09;组合总和 力扣题目链接 状态&#xff1a;基本回溯AC&#xff0c…

Docker(2)

Docker网络 原生网络 [rootserver1 harbor]# docker network ls默认使用桥接模式&#xff0c;桥接到docker0上 [rootserver1 ~]# docker run -d --name demo nginx [rootserver1 ~]# yum install -y bridge-utils [rootserver1 ~]# brctl showhost模式&#xff0c;容器和宿…

【vue3】Transition过渡组件

Transition 自带的内部组件xxx-enter-from 开始进入过渡 0%xxx-enter-active 过渡过程xxx-enter-to 过渡完成 100%xxx-leave-from 开始退出 0%xxx-leave-active 退出过程xxx-leave-to 退出完成 100% xxx是组件属性name的值&#xff0c;自定义的。我使用的是fade-box <templa…

JavaSE编程题目练习(三)

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;欢迎关注小弟&#xff01; 博主小留言&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟Cool&#xff0…

基于 Qt UDP通信局域网通信

前言 该例程经过实际验证可以正常使用,只简单的使用UDP中的单播模式(一对一), 所用测试系统在同一局域网,其中: QT版本:5.12 PC端UDP模式:单播 UDP通信目标:基于STM32F4+LWIP协议的以太网接口 调试助手: 虚拟串口+串口助手+UDP和TCP调试助手[编程人员必备]一、UDP通…