STM32的RCC原理(复位和时钟控制)

基本概念

STM32微控制器的RCC(Reset and Clock Control)模块是一个非常重要的部分,它负责管理微控制器的时钟系统和复位系统。以下是一些基本的原理和概念:

  1. 时钟源:STM32微控制器的时钟系统有多个时钟源,包括内部的HSI(High Speed Internal)时钟,外部的HSE(High Speed External)时钟,以及PLL(Phase-Locked Loop)时钟。这些时钟源可以根据需要进行选择和配置。

  2. 时钟树:STM32微控制器的各个模块和外设都通过一个复杂的时钟树与时钟源相连。RCC模块负责管理这个时钟树,包括使能或禁止各个外设的时钟,以及配置各个外设的时钟分频。

  3. 复位系统:RCC模块还负责管理微控制器的复位系统。当微控制器发生错误或异常时,如电源故障、系统错误等,复位系统可以将微控制器重置到初始状态,以保证系统的稳定运行。

  4. 配置和控制:RCC模块提供了一系列的寄存器,用于配置和控制时钟系统和复位系统。通过编写这些寄存器,我们可以选择时钟源,配置时钟分频,使能或禁止外设的时钟,以及控制复位系统。

时钟源选择

  1. HSI(High-Speed Internal):这是一种内部高速时钟源,通常在8MHz左右。它是STM32微控制器的默认时钟源之一。

  2. HSE(High-Speed External):这是一种外部高速时钟源,通常通过外部晶体振荡器或时钟信号提供。它可以提供更高的时钟精度和稳定性。

  3. LSI(Low-Speed Internal):这是一种内部低速时钟源,通常在32kHz左右。它主要用于低功耗和低速应用

  4. LSE(Low-Speed External):这是一种外部低速时钟源,通常通过外部晶体振荡器或时钟信号提供。它主要用于低功耗和低速应用

STM32时钟树示意图

           ┌──────────────────────┐
           │       HSE (外部)      │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      PLL (锁相环)     │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      SYSCLK (系统时钟) │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      AHB (高速总线)   │
           └──────────────────────┘
                     │       |
                     ▼       │
                              ---------  ▼
           ┌──────────────────────┐      ┌──────────────────────┐
           │      APB2 (高速总线)  │      │      APB1 (低速总线)  │
           └──────────────────────┘       └──────────────────────┘
                                          
                       
    
  1. HSE (外部时钟源):HSE是一种外部高速时钟源,通常通过外部晶体振荡器或时钟信号提供。它可以提供更高的时钟精度和稳定性。

  2. PLL (锁相环):PLL是一个模块,可以通过倍频来生成高速时钟。它通常可以选择HSE或HSI作为输入时钟源,并通过配置倍频因子来生成所需的高速时钟。生成的时钟称为SYSCLK。

  3. SYSCLK (系统时钟):SYSCLK是STM32微控制器的系统时钟,它驱动整个微控制器的运行。它的频率取决于PLL的配置和倍频因子。

  4. AHB (高速总线):AHB是STM32微控制器的高速总线,用于连接主要的内部总线和外设。它的时钟频率通常等于SYSCLK,但可以通过时钟分频器进行分频。

  5. APB1 (低速总线):APB1是STM32微控制器的低速总线,用于连接一些低速外设。它的时钟频率通常是AHB时钟频率的一半,但也可以通过时钟分频器进行进一步分频。

  6. APB2 (高速总线):APB2是STM32微控制器的高速总线,用于连接一些高速外设。它的时钟频率通常等于AHB时钟频率,但也可以通过时钟分频器进行分频。

代码实例

这段代码是STM32F1系列微控制器的系统时钟配置函数,目标是将系统时钟配置为72MHz。

static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON); // 启动HSE(高速外部)振荡器
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY; // 等待HSE准备就绪
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); // 如果HSE没有准备就绪,并且没有超时,则继续等待

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01; // HSE准备就绪
  }
  else
  {
    HSEStatus = (uint32_t)0x00; // HSE没有准备就绪
  }  

  if (HSEStatus == (uint32_t)0x01) // 如果HSE准备就绪
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE; // 启用预取指缓冲区

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); // 清除Flash访问延迟设置
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    // 设置Flash访问延迟为2个周期

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; // 设置AHB时钟(HCLK)分频系数为1,即HCLK=SYSCLK
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; // 设置APB2时钟(PCLK2)分频系数为1,即PCLK2=HCLK
    
    /* PCLK1 = HCLK/2 */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; // 设置APB1时钟(PCLK1)分频系数为2,即PCLK1=HCLK/2

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); // 清除PLL配置
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); // 设置PLL的输入为HSE,并设置PLL倍频系数为9,即PLLCLK=HSE*9=72MHz

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON; // 启动PLL

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0) // 等待PLL准备就绪
    {
    }
    
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); // 清除系统时钟源设置
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    // 设置系统时钟源为PLL

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) // 等待PLL作为系统时钟源
    {
    }
  }
  else
  { 
    /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
    // 如果HSE启动失败,那么应用程序的时钟配置将会出    /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
    // 如果HSE启动失败,那么应用程序的时钟配置将会出错。用户可以在这里添加一些代码来处理这种错误。
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能课程】计算机科学博士作业三

【人工智能课程】计算机科学博士作业三 来源:李宏毅2022课程第10课的作业 1 图片攻击概念 图片攻击是指故意对数字图像进行修改,以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入…

使用 Docker 部署 File Browser 文件管理系统

1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目:File Browser,简单实用、轻量级、跨平台,安装部署简单快…

Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量 1.创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对像的名字 nsems:信号量的数量 semflg:IPC_CREAT 返回值:成功返回信号量ID…

职场中的团队合作:如何建立高效的团队协作

在职场中,团队合作是至关重要的。一个高效的团队可以协同工作,共同实现目标,提高工作效率,创造出卓越的成果。然而,建立一个高效的团队并不容易,需要团队成员之间的良好沟通、相互信任和合作。本文将分享一…

Java核心技术卷1——运算符 每日笔记

3.5 运算符 运算符用于连接值。 3.5.1算数运算符 在Java中,使用算术运算符、-、*、/表示加、减、乘、除运算。 当参与/运算的两个操作数都是整数时,表示整数除法; 否则表示浮点数除法。 整数的求余(取模)操作用%表示…

Laravel Octane 和 Swoole 协程的使用分析二

又仔细研究了下 Octane 源码和 Swoole 的文档,关于前几天 Laravel Octane 和 Swoole 协程的使用分析中的猜想,得到进一步验证: Swoole 的 HTTP Server 启动后会创建一个 master 进程和一个 manager 进程;master 进程又会创建多个…

《UE5_C++多人TPS完整教程》学习笔记26 ——《P27 在线会话测试(Testing An Online Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P27 在线会话测试(Testing An Online Session)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主&#xff0…

山海鲸可视化软件实战:如何制作一个高效的商品销售数据看板

作为一名数据分析师,我经常需要通过各种工具将数据转化为有价值的信息,为公司的决策提供支持。最近,我使用山海鲸可视化软件制作了一个商品销售数据看板,山海鲸可视化是一款可以免费可视化编辑、免费私有化部署的产品。下面&#…

6_怎么看原理图之协议类接口之LCD笔记

首先想一想再前几篇文章讲的协议类的前提 1、双方约定好通信的协议 2、双方满足一定的时序要求 以上第二点又有一些要求: 1)弄清2440在这个通信协议中,能设置哪些时序的值,这些值的含义是什么——2440手册 2)弄清楚这…

一文详解:Open SSL

Open SSL是 SSL (传输层安全)和 TLS (传输层安全)协议的健壮的开源实现。这些加密协议被广泛用于保护计算机网络上的通信,通过在两个通信应用程序之间提供隐私和数据完整性。从更实际的角度来说,OpenSSL 是一个工具包,其中包含各种命令行实用…

学习JAVA的第十四天(基础)

目录 Collection集合 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 遍历 数据结构 栈 队列 数组 链表 前言: 学习JAVA的第十三天 Collection集合 Collection的遍历方式: 迭代器(不依赖索引)遍…

当磁盘无法读取时,这样做能拯救你的数据!

一、遭遇磁盘无法读取的困境 在现代社会中,磁盘已成为我们存储和传输数据的重要工具。然而,当磁盘突然无法读取时,我们可能会面临数据丢失的风险,这无疑是一个令人头疼的问题。磁盘无法读取可能表现为电脑无法识别磁盘、磁盘在读…

基于yolov5的水果新鲜度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的水果新鲜度检测系统,系统既能够实现图像检测,也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov5的水果新鲜度检测系统是在pytorch框架下实现的,这是一个完整的…

opengl日记23-opengl文字渲染-渐变色-教程示例

Author: wencoo Blog:https://wencoo.blog.csdn.net/ Date: 23/02/2024 Email: jianwen056aliyun.com Wechat:wencoo824 QQ:1419440391 Details:文章目录 目录正文 或 背景 效果展示 目录 正文 或 背景 前些天发现了一个巨牛的人工智能学习…

华为HQoS配置案例

HQoS基于层次化调度,cpe上支持三级队列: level3流队列:每个用户的同类业务是一个业务流,针对每个用户不同的业务流进行队列调度,流队列一般与业务类型对应(EF、AF、BE等)。 level2用户队列&…

适用于 Windows 的7大数据恢复软件解决方案

数据丢失是数字世界中令人不快的一部分,它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件,这可能会在您努力恢复它们时带来不必要的压力。幸运的是,数据恢复软件可以帮助恢复已删除的文件,即使您没有备份它们。以下…

玩转小米:如何取消王者荣耀微信双开默认选择

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯💢 问题 💢 当我们在手机上安装了多个微信(分身)后,在一些软件(例如王者)使用微信登入时会出现让们选择使用哪个微信进行登入,但是有时候我们不小心设置了默认某一个微信登入后,下次就无法出现选择页面…

Codesys 位置式PID闭环控制系统(PID+PWM控制无刷电机)

有关Codesys位置式PID算法公式和源代码,请参考下面文章链接: 1、Codesys位置式PID https://rxxw-control.blog.csdn.net/article/details/131591254https://rxxw-control.blog.csdn.net/article/details/1315912542、博途PLC PWM输出控制 https://rxxw-control.blog.csdn.…

JavaScript 闭包:让你更深入了解函数和作用域

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Mybatis框架相关问题

HashMap相关问题 部分示例代码 Mybatis框架相关问题 一、MyBatis框架是如何实现分页的?二、MyBatis框架里面的缓存机制是怎么回事?一级缓存二级缓存 一、MyBatis框架是如何实现分页的? 分页分为两种: 逻辑分页:将所…