STM32F103-时钟树

2023-11-01

STM32F1 时钟树

参考:《【野火®】零死角玩转STM32—F103指南者》
在这里插入图片描述

时钟源

  1. HSI:高速内部时钟,RC振荡器,频率为8MHz
  2. HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  3. LSI:低速内部时钟,RC振荡器,频率为40kHz
  4. LSE:低速外部时钟,接频率为32.768kHz的石英晶体
  • LSI可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。LSE也可用来通过程序选择驱动RTC。

  • 内部即指芯片已经集成,外部即指需要设计PCB时接入

  • 锁相环:这个东西可以将输入频率进行放大然后输出,比如说输入1MHz,设置倍频为3倍,最后就能输出3MHz的信号。STM32的锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

时钟配置

主要

SYSCLK:系统时钟
HCLK:AHB总线时钟
PCLK2:APB2总线时钟
PCLK1:APB1总线时钟

库函数的标准配置:PCLK2 = HCLK = SYSCLK = PLLCLK = 72M,PCLK1 = HCLK/2 = 36M
APB1和APB2搭载的外设如下图所示:

在这里插入图片描述

其它

USB时钟
USB 时钟是由 PLLCLK 经过 USB 预分频器得到,分频因子可以是:[1,1.5],具体的由时钟配置寄存器 CFGR 的位 22:USBPRE 配置。USB 的时钟最高是 48M,根据分频因子反推过来算,PLLCLK 只能是 48M 或者是 72M。一般我们设置 PLLCLK=72M,USBCLK=48M。USB 对时钟要求比较高,所以 PLLCLK 只能是由 HSE 倍频得到,不能使用 HSI 倍频。

Cortex 系统时钟
Cortex 系统时钟由 HCLK 8 分频得到,等于 9M,Cortex 系统时钟用来驱动内核的系统定时器 SysTick,SysTick 一般用于操作系统的时钟节拍,也可以用做普通的定时。

ADC 时钟
ADC 时钟由 PCLK2 经过 ADC 预分频器得到,分频因子可以是[2,4,6,8],具体的由时钟配置寄存器 CFGR 的位 15-14:ADCPRE[1:0]决定。很奇怪的是怎么没有 1 分频。ADC时钟最高只能是 14M,如果采样周期设置成最短的 1.5 个周期的话,ADC 的转换时间可以达到最短的 1us。如果真要达到最短的转换时间 1us 的话,那 ADC 的时钟就得是 14M,反推 PCLK2 的时钟只能是:28M、56M、84M、112M,鉴于 PCLK2 最高是 72M,所以只能取 28M 和 56M。

RTC 时钟、独立看门狗时钟
RTC 时钟可由 HSE/128 分频得到,也可由低速外部时钟信号 LSE 提供,频率为32.768KHZ,也可由低速内部时钟信号 HSI 提供,具体选用哪个时钟由备份域控制寄存器BDCR 的位 9-8:RTCSEL[1:0]配置。独立看门狗的时钟由 LSI 提供,且只能是由 LSI 提供,LSI 是低速的内部时钟信号,频率为 30~60KHZ 直接不等,一般取 40KHZ。

MCO 时钟输出
MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在 STM32 F1系列中 由 PA8 复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。MCO 的时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK,具体选哪个由时钟配置寄存器CFGR 的位 26-24:MCO[2:0]决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控 MCO 引脚的时钟输出来验证我们的系统时钟配置是否正确。

基于标准库的设置代码

使用标准库的模板工程,在系统启动的时候,statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟初始化成 72MHZ,SystemInit()在库文件:system_stm32f10x.c 中定义。然后再进入main函数。

如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,即改动SystemInit()函数。但是为了维持库的完整性,可以在按照标准库的方法启动后进入main函数中时,再自己写个时钟初始化函数将系统时钟重新配置。

HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时钟 SYSCLK 只能是 HSI/216=416=64MHZ。

 void HSE_SetSysClock(uint32_t pllmul)
{
    volatile uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
    RCC_DeInit();         //重设RCC寄存器为缺省值
    RCC_HSEConfig(RCC_HSE_ON);   //使能HSE
    
    do
  	{
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    StartUpCounter++;  
  	} while((HSEStartUpStatus == 0) && (StartUpCounter != 9));//等待 HSE 启动稳定
     
    if ( RCC_WaitForHSEStartUp() != 0)  //等待使能成功
  	{    	
//-----------------------------------------------------------------//
// 这两句是操作 FLASH 闪存用到的,如果不操作 FLASH,这两个注释掉也没影响
// 使能 FLASH 预存取缓冲区
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// SYSCLK 周期与闪存访问时间的比例设置,这里统一设置成 2
// 设置成 2 的时候,SYSCLK 低于 48M 也可以工作,如果设置成 0 或者 1 的时候,
// 如果配置的 SYSCLK 超出了范围的话,则会进入硬件错误,程序就死了
// 0:0 < SYSCLK <= 24M
// 1:24< SYSCLK <= 48M
// 2:48< SYSCLK <= 72M
	FLASH_SetLatency(FLASH_Latency_2);
//-----------------------------------------------------------------//
     
    // AHB预分频因子设置为1分频,HCLK = SYSCLK 
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    // APB2预分频因子设置为1分频,PCLK2 = HCLK
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 
    RCC_PCLK1Config(RCC_HCLK_Div2);

//-----------------设置各种频率主要就是在这里设置-------------------//
    // 设置PLL时钟来源为HSE,设置PLL倍频因子
     // PLLCLK = 8MHz * pllmul
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul);
//------------------------------------------------------------------//

    // 开启PLL 
    RCC_PLLCmd(ENABLE);
    // 等待 PLL稳定
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    while (RCC_GetSYSCLKSource() != 0x08);
       
   }
    else
    {
       // 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,HSI是内部的高速时钟,8MHZ
       // 如果HSE开启失败,可在这里添加出错的代码处理
    }
    
}

MCO配置

/*
 * 初始化MCO引脚PA8
 * 在F1系列中MCO引脚只有一个,即PA8,在F4系列中,MCO引脚会有两个
 */
void MCO_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	// 开启GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 选择GPIO8引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	
	//设置为复用功能推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	
	//设置IO的翻转速率为50M
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	// 初始化GPIOA8
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{	
	
	HSE_SetSysClock(RCC_PLLMul_9);
	MCO_GPIO_Config();// MCO 引脚初始化
		
	RCC_MCOConfig(RCC_MCO_SYSCLK);		     // 72M  
	
	while (1)
	{
		
	}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103-时钟树 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • C++ 集合

    目录 1 Vector 容器 2 Stack 栈 3 Queue 队列 4 Map 关联容器 5 Set 关联容器 C 的集合 较为简单 但容易混淆 所以总结一下 1 Vector 容器 Vector 是 C 的一种数据结构 确切的说是一个
  • Bing搜索核心技术BitFunnel原理

    1 概述 转载 Bing搜索核心技术BitFunnel原理 相似文章 guava 大数据量下的集合过滤 Bloom Filter 导语 从90年代中期开始 人们普遍认识 对于内容索引来说 文件签名技术比反向链接效果更差 最近几年必应搜索引擎
  • 应对当今的医疗器械软件测试开发挑战,如何选择测试软件

    随着计算机科学与技术的发展 计算机软件控制技术在医疗设备中的应用越来越广泛 并已成为医疗设备的核心技术之一 大到高端的大型医疗设备 如螺旋CT 核磁共振 直线加速器或全自动生化分析仪等 小到家用的电子血压计 血糖仪或微波理疗仪等 计算机软件
  • 修改python的默认版本

    如果电脑上安装了多个python环境 那么如何设置某一个版本的python为默认打开方式呢 我们尝试将2 7设置为默认的python环境 方法如下 此电脑 gt 属性 gt 高级系统设置 gt 环境变量 选择系统变量 然后点击编辑 将2 7
  • 前后端交互与接口设计学习

    目录 前言 介绍目录内容和目的 前后端交互概述 解释前后端交互的基本概念和作用 2 强调前后端分离的架构模式 2 前后端交互逻辑设计 1 讨论前后端交互的一般逻辑流程 2 探索不同的数据传输方式 3 提供实际案例加深理解 4 接口设计与文档
  • 太原理工大学python考试题总结

    已知x 1 2 3 那么x 3的值为 1 2 3 1 2 3 1 2 3 已知x 1 2 和y 3 4 那么x y的结果是 1 2 3 4 Python 不具备运行速度快的特点 具备扩展库丰富 跨平台 支持函数式编程的特点 Python是面
  • 15. 线性代数 - 克拉默法则

    文章目录 克拉默法则 矩阵运算 Hi 大家好 我是茶桁 上节课我们在最后提到了一个概念 克拉默法则 本节课 我们就来看看到底什么是克拉默法则 克拉默法则 之前的课程我们一直在强调 矩阵是线性方程组抽象的来的 那么既然我们抽象出来了 有没有一
  • 选中物体高亮显示(MR开发日志)

    业务逻辑 屏幕中央扫到物体 点亮该物体 离开物体 取消高亮 程序逻辑 射线选中物体 配合Outline Effect高亮显示物体 场景设置 下载插件Outline Effect 1 摄像机设置添加Outline Effect脚本 2 然后那
  • Linux防火墙端口

    在服务器上使用某些软件时需要开启相应的防火墙端口号 简单了解下Linux防火墙端口 防火墙策略 防火墙策略可以基于流量的源目地址 端口号 协议 应用等信息来定制 然后防火墙使用预先定制的策略规则监控出入的流量 若流量与某一条策略规则相匹配
  • strlen、strcpy、strcmp、strcat函数的实现

    目录 一 strlen函数的实现 二 strcpy函数的实现 三 strcmp函数的实现 四 strcat函数的实现 五 代码示例展示 strlen strcpy strcmp strcat四个函数都包含在 include
  • ios safari 开启无痕浏览(隐私模式)报QuotaExceededError: DOM Exception 22异常解决办法...

    检测safari是否开启无痕浏览 function var testKey test var storage window sessionStorage try storage setItem testKey testValue stora
  • 域适应(Domain Adaptation)综述

    根据李宏毅老师的视频所归纳的笔记 视频链接 https www bilibili com video BV1TL411p7Us spm id from 333 999 0 0 假设我们在训练集上训练黑底白字的手写数字集后 如下图 再把它用在
  • undefined symbol 问题解决记录(二)

    昨天上车自测本模块功能稳定性 顺便pull小弟分支 帮忙一起验证 结果小包上车后无法运行 一查发现一直报 undefined symbol XXXXXX 晚上下班后开始帮忙排查 今日记录以便后期回顾 前两年写过一篇关于undefined s
  • git clone 使用用户名和密码

    git clone 使用用户名和密码 一般git仓库的用户 都是用户名和密码登录 git clone命令如下 模板 git clone http 邮箱 或用户名 密码 仓库 git clone http username password
  • Java读取和写入Excel表格

    Java读取和写入Excel表格 1 绪论 2 JXL篇之程序范例 2 1 JXL 创建低版本Excel文件 2 2 JXL 读取低版本Excel文件 3 POI篇之程序范例 3 1 POI 创建低版本Excel文件 3 2 POI 读取低
  • 阿里云移动测试

    阿里云移动测试 买服务 上传APP 勾选需要的服务 提交之后 阿里云帮进行测试 这个是自动的还是人工的
  • [SQL]经典的sql语句

    一 基础 1 说明 创建数据库 CREATE DATABASE database name 2 说明 删除数据库 drop database dbname 3 说明 备份sql server 创建 备份数据的 device USE mast
  • getClass().getClassLoader()为null

    想获取resources下的文件 之前用过this getClass getClassLoader getResourceAsStream path 可以获取到 但最近的一个工程中需要在一个静态方法中获取该文件 没有了this 我直接用了C
  • Qt使用OpenGL实现立方体贴图

    效果如下 实现代码3个文件 TestWidget h TestWidget cpp main cpp TestWidget h ifndef TESTWIDGET H define TESTWIDGET H include
  • STM32F103-时钟树

    STM32F1 时钟树 参考 野火 零死角玩转STM32 F103指南者 时钟源 HSI 高速内部时钟 RC振荡器 频率为8MHz HSE 高速外部时钟 可接石英 陶瓷谐振器 或者接外部时钟源 频率范围为4MHz 16MHz LSI 低速内