STM32-04-STM32时钟树

news2025/1/19 3:25:43

STM32时钟树

  • 什么是时钟?

    时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。(时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要)。

  • 时钟树
    在这里插入图片描述

  • 时钟源

    • 2个外部时钟源
      • 高速外部振荡器(HSE):外接石英/陶瓷谐振器,频率为4MHz~16MHz。
      • 低速外部振荡器(LSE):外接32.768kHz石英晶体,主要作用于RTC的时钟源。
    • 2个内部时钟源
      • 高速内部振荡器(HSI):由内部RC振荡器产生,频率为8MHz。
      • 低速内部振荡器(LSI):由内部RC振荡器产生,频率为40kHz,可作为独立看门狗的时钟源。
  • 锁相环

    锁相环是自动控制系统中常用的一个反馈电路,在STM32主控中,锁相环的作用主要有两个方面:

    输入时钟净化:利用锁相环电路的反馈机制实现;

    倍频:用于使芯片在更高且频率稳定的时钟下工作。

    经过分频器处理后的输出振荡时钟信号比直接输入的时钟信号更稳定。

  • 系统时钟SYSCLK

    STM32的系统时钟SYSCLK为整个芯片提供了时序信号。在STM32F1系列中,它可以为HSI、PLLCLK、HSE中的一个,通过CFGR的位SW[1:0]设置。

  • 系统时钟配置步骤

    1. 配置HSE_VALUE stm32xxxx_hal_conf.h

      #if !defined (HSE_VALUE)
      	#if defined(USE_STM3210C_EVAL)
      		#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
      	#else 
      		#define HSE_VALUE 8000000U  /*!< Value of the External oscillator in Hz */
      	#endif 
      #endif /* HSE_VALUE */
      
    2. 调用SystemInit函数 system_stm32xxxx.c

      Reset_Handler PROC
       	EXPORT Reset_Handler [WEAK]
      	IMPORT SystemInit
      	IMPORT __main
       	LDR R0, =SystemInit
       	BLX R0
       	LDR R0, =__main
       	BX R0
       	ENDP
      
      void SystemInit (void)
      {
      	#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || 	defined(STM32F103xE) || defined(STM32F103xG)
       		#ifdef DATA_IN_ExtSRAM
       			SystemInit_ExtMemCtl();
       		#endif /* 配置扩展 SRAM */
      	#endif 
       	/* 配置中断向量表 */
      	#if defined(USER_VECT_TAB_ADDRESS)
       		SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table 			Relocation in Internal SRAM. */
      	#endif /* USER_VECT_TAB_ADDRESS */
      }
      

      主要用于外部存储器配置和中断向量表地址配置

    3. 选择时钟源,配置PLL system_stm32xxxx.c

      void sys_stm32_clock_init(uint32_t plln)
      {
          HAL_StatusTypeDef ret = HAL_ERROR;
          RCC_OscInitTypeDef rcc_osc_init = {0};
          RCC_ClkInitTypeDef rcc_clk_init = {0};
      
          rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE;       /* 选择要配置HSE */
          rcc_osc_init.HSEState = RCC_HSE_ON;                         /* 打开HSE */
          rcc_osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1;          /* HSE预分频系数 */
          rcc_osc_init.PLL.PLLState = RCC_PLL_ON;                     /* 打开PLL */
          rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE;             /* PLL时钟源选择HSE */
          rcc_osc_init.PLL.PLLMUL = plln;                             /* PLL倍频系数 */
          ret = HAL_RCC_OscConfig(&rcc_osc_init);                     /* 初始化 */
      
          if (ret != HAL_OK)
          {
              while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
          }
      
          /* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2*/
          rcc_clk_init.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
          rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;        /* 设置系统时钟来自PLL */
          rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;               /* AHB分频系数为1 */
          rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV2;                /* APB1分频系数为2 */
          rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV1;                /* APB2分频系数为1 */
          ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_2);  /* 同时设置FLASH延时周期为2WS,也就是3个CPU周期。 */
      
          if (ret != HAL_OK)
          {
              while (1);                                              /* 时钟初始化失败,之后的程序将可能无法正常执行,可以在这里加入自己的处理 */
          }
      }
      
      HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
      
          
      typedef struct 
      { 
      	uint32_t  OscillatorType; 		/* 选择需要配置的振荡器 */ 
      	uint32_t  HSEState; 			/* HSE 状态 */ 
      	uint32_t  HSEPredivValue; 		/* HSE 预分频值 */ 
      	uint32_t  LSEState; 			/* LSE 状态 */ 
      	uint32_t  HSIState; 			/* HSI状态 */ 
      	uint32_t  HSICalibrationValue; 	/* HSI 校准值 */ 
      	uint32_t  LSIState; 			/* LSI 状态 */ 
      	RCC_PLLInitTypeDef  PLL; 		/* PLL 结构体 */ 
      }RCC_OscInitTypeDef;
      
      
      typedef struct 
      { 
      	uint32_t  PLLState; 		/* PLL 状态 */ 
      	uint32_t  PLLSource; 	/* PLL 时钟源 */ 
      	uint32_t  PLLMUL; 		/* PLL 倍频系数 */ 
      }RCC_PLLInitTypeDef;
      
    4. 选择系统时钟源,配置总线分频器 HAL_RCC_ClockConfig()

      HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)
      
          
      typedef struct 
      { 
      	uint32_t  ClockType; 		/* 要配置的时钟(SYSCLK/HCLK/PCLK1/PCLK2) */ 
      	uint32_t  SYSCLKSource; 		/* 系统时钟源 */ 
      	uint32_t  AHBCLKDivider; 		/* AHB  时钟预分频系数 */ 
      	uint32_t  APB1CLKDivider; 	/* APB1 时钟预分频系数 */ 
      	uint32_t  APB2CLKDivider; 	/* APB2 时钟预分频系数 */ 
      }RCC_ClkInitTypeDef;
      
      
      uint32_t FLatency 
      
      #define  FLASH_LATENCY_0   0x00000000U 				/* FLASH 0个等待周期 */ 
      #define  FLASH_LATENCY_1   FLASH_ACR_LATENCY_0 		/* FLASH 1个等待周期 */ 
      #define  FLASH_LATENCY_2   FLASH_ACR_LATENCY_1 		/* FLASH 2个等待周期 */
      
    5. 配置拓展外设时钟

声明:资料来源(战舰STM32F103ZET6开发板资源包)

  1. Cortex-M3权威指南(中文).pdf
  2. STM32F10xxx参考手册_V10(中文版).pdf
  3. STM32F103 战舰开发指南V1.3.pdf
  4. STM32F103ZET6(中文版).pdf
  5. 战舰V4 硬件参考手册_V1.0.pdf

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

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

相关文章

Lava多模态大模型调试(基于vscode框架)

文章目录 前言一、整体概括二、launch.json文件配置三、调试展示前言 之前博客这里介绍LLava1.5多模态大模型的安装、训练、预测等。但对于你想查看源码或多或少都有些麻烦,也不利于代码调试。基于此,本文是一篇基于vscode框架调试llava大模型的教程。 一、整体概括 我是在…

再谈前端算法

楔子 – 青蛙跳台阶什么是算法算法实例 &#xff1a; 实现一个LRU缓存 实现 LRUCache扩展&#xff1a; ES6 Map Map的创建和初始化&#xff1a;添加键值对&#xff1a;获取键值对&#xff1a;检查Map中是否存在某个键&#xff1a;删除键值对&#xff1a;遍历Map&#xff1a;获取…

MulticoreWare与Imagination一同按下汽车计算工作负载的“加速键”

中国北京 – 2024年1月8日 - MulticoreWare Inc与Imagination Technologies共同宣布已在德州仪器TDA4VM处理器上实现了GPU计算&#xff0c;不仅使算力提升了约50 GFLOPS&#xff0c;而且还实现了自动驾驶和高级驾驶辅助系统&#xff08;ADAS&#xff09;常见工作负载性能的跃升…

环境变量的使用

1.用法 1.建立文件夹.env.production&#xff08;开发&#xff09;.env.development(生产) 代码: NODE_ENVdevelopment VUE_APP_BASE_APIwww.aaa.comNODE_ENVproduction VUE_APP_BASE_APIwww.xxx.com 注意: 环境变量的文件夹应该是和src目录同级的: 2.获取 process.env.V…

php环境搭建

PHP环境搭建 1.软件下载及安装 php网址&#xff1a;php.net vscode网址&#xff1a;https://code.visualstudio.com/ 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1kx_Z-2dz3kGozDcynW7C_Q 提取码&#xff1a;1234 PHP&#xff1a; PHP安装 解压到指定…

无线与局域网技术期末划题自制答案

简答题 1.描述5G的三大应用场景&#xff1f; 5G的三大应用场景包括增强型移动宽带&#xff08;eMBB&#xff09;、超可靠低延迟通信&#xff08;URLLC&#xff09;和大规模机器类型通信&#xff08;mMTC&#xff09;。增强型移动宽带&#xff08;eMBB&#xff09;主要用于支持…

2024.1.9每日一题

LeetCode 2707.字符串中的额外字符 2707. 字符串中的额外字符 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出…

MongoDB 设置账号密码_mongodb设置用户名和密码

MongoDB 设置账号密码_mongodb设置用户名和密码 1、安装 安装可以看我这篇文章:https://blog.csdn.net/u014641168/article/details/123937775 2、说明 由于默认安装的MongoDB是没有设置用户密码的,极其危险,所以需要设置一下用户密码 3、创建用户 用Navicat15连接Mon…

【Python学习】Python学习9-字符串

目录 【Python学习】Python学习9-字符串 前言创建语法访问字符串的值字符串拼接Python 转义字符Python字符串运算符Python格式化字符串Python 三引号Unicode字符串Python 的字符串内建函数参考 文章所属专区 Python学习 前言 本章节主要说明Python的字符串类型。 创建语法 …

Linux【C编程】 信号以及信号的处理方式

文章目录 1.什么是信号&#xff1f;1.1信号是内容受限的一种异步通信机制1.2信号由谁发出的&#xff1f;1.3信号由谁处理&#xff0c;如何处理 2.常见的信号3.进程对信号的处理3.1用signal函数处理SIGINT信号3.2使用sigaction 函数 4.alarm 和pause函数4.1 alarm函数详解4.2 pa…

1.4.1机器学习——梯度下降+α学习率大小判定

1.4.1梯度下降 4.1、梯度下降的概念 ※【总结一句话】&#xff1a;系统通过自动的调节参数w和b的值&#xff0c;得到最小的损失函数值J。 如下&#xff1a;是梯度下降的概念图。 我们有一个损失函数 J(w,b)&#xff0c;包含两个参数w和b&#xff08;你可以想象成J(w,b) w*x…

Windows环境下使用HTML5播放RTSP流

本文搭建环境选用Windows平台 一、使用笔记本摄像头推送RTSP视频流 参考文章:笔记本摄像头模拟监控推送RTSP流-CSDN博客 二、搭建Vue项目 参考项目&#xff1a; HTML5 播放 rtsp视频流 2.1 下载压缩包 2.2 解压文件&#xff0c;使用VSCode打开项目 2.3 启动项目 注&#…

vue day06

1、路由模块封装 2、声明式导航 实现导航高亮效果 直接通过这两个类名对相应标签设置样式 点击a链接进入my页面时&#xff0c;a链接 我的音乐高亮&#xff0c;同时my下的a、b页面中的 我的音乐也有router-link-active类&#xff0c;但没有精确匹配的类&#xff08;只有my页…

Talk | EMNLP 2023 最佳长论文:以标签为锚-从信息流动的视角分析上下文学习

本期为TechBeat人工智能社区第561期线上Talk。 北京时间1月4日(周四)20:00&#xff0c;北京大学博士生—王乐安的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “以标签为锚-从信息流动的视角分析上下文学习”&#xff0c;介绍了他的团队在上下文学…

Python 安卓开发:Kivy、BeeWare、Flet、Flutter

kivy&#xff1a;https://github.com/kivy python-for-android &#xff1a;https://python-for-android.readthedocs.io/en/latest/ BeeWare&#xff1a;https://docs.beeware.org/en/latest/ Flet&#xff1a;https://github.com/flet-dev/flet 把 PySide6 移植到安卓上去&a…

1880_安装QEMU_for_ARC

Grey 全部学习内容汇总&#xff1a; https://github.com/GreyZhang/g_ARC 主标题 想学习一点ARC相关的知识&#xff0c;但是手里没有开发板。看了下&#xff0c;使用QEMU似乎是一个很好的选择&#xff0c;正好也有这么一个分支。在此&#xff0c;记录一下环境搭建的过程。 …

Java项目:01 springboot智能养生平台设计与实现

项目介绍 Java项目 智能养生平台 使用技术&#xff1a;springmybatisspringmvchtmlJavaScriptcsslayuijQuery 运行环境 jdk8mysqlIntelliJ IDEAmaven 主要分两个端&#xff0c;用户端和管理员端 网站功能&#xff1a;实现论坛帖子管理&#xff0c;论坛帖子分类管理&#xff0c…

计算机基础面试题 |20.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

YOLOv5改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT(高效的视觉变换网络),EfficientViT的核心是一种轻量级的多尺度线性注意力模块,能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本的EfficientViT网络结构,论文题目是Effici…

4.MapReduce 序列化

目录 概述序列化序列化反序例化java自带的两种Serializable非Serializable hadoop序例化实践 分片/InputFormat & InputSplit日志 结束 概述 序列化是分布式计算中很重要的一环境&#xff0c;好的序列化方式&#xff0c;可以大大减少分布式计算中&#xff0c;网络传输的数…