【STM32】初学者必读STM32时钟系统详解

这篇具有很好参考价值的文章主要介绍了【STM32】初学者必读STM32时钟系统详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 前言

2 时钟系统介绍

3 时钟源

3.1 系统时钟源

3.2 次级时钟源

3.3 时钟源特点

4 时钟

4.1 AHB总线时钟

4.2 APB1总线时钟

4.3 APB2总线时钟

5 时钟控制器

6 CubeMx配置时钟系统

6.1 选择单片机型号

6.2 选择时钟源

6.3 配置系统时钟

6.4 时钟系统初始化代码

7 结论

1 前言

        STM32的时钟系统比较复杂,初学者一看时钟树必然蒙圈,我该怎么用?怎么设置?搞不懂,就根据开发板源码很快完成设置,虽然能用起来,碰到问题或自己改代码时必然蒙圈。要做好底层驱动设计,还是要对STM32的时钟有深入的理解,本文将为大家详细介绍STM32的时钟。

2 时钟系统介绍

        STM32的时钟系统由三大部分组成:时钟源、时钟控制器、时钟。

        时钟源是产生时钟信号的电路,可以是晶振、RC震荡电路,产生方波信号,由时钟控制器分频或倍频后作为内核或外设的时钟。

        时钟可以理解为给外设提供工作频率的方波信号,该方波信号的频率是时钟源的倍频或分频。

        时钟控制器介于时钟源和时钟之间,对时钟源进行选择、分频、倍频控制,为内核及外设提供时钟。

        STM32F407的系统时钟框图如图 1所示,时钟控制器将HIS、HSE、主PLL时钟源转化为内核及外设所需的时钟,接收外部I2S时钟、PHY以太网时钟、USBPhy时钟,为I2S、MAC、USB等外设提供时钟。时钟控制器还提供2路时钟输出MCO1和MCO2,最大输出频率100MHz。

【STM32】初学者必读STM32时钟系统详解

图 1 STM32F407时钟系统框图

        STM32F407的系统时钟树如图 2所示。

【STM32】初学者必读STM32时钟系统详解

图 2 STM32F407时钟树

3 时钟源

        STM32的时钟源由系统时钟源和次级时钟源组成。

3.1 系统时钟源

        STM32单片机可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK),三种时钟源分别为:

        ● HSI 振荡器时钟

        ● HSE 振荡器时钟

        ● 主 PLL (PLL) 时钟

        注意这里说的HIS、HSE或主PLL提供的是系统时钟(SystemClk),对于单片机而言,时钟源只有HSI或HSE,主PLL的时钟源也是HSI或HSE,经过PLL倍频后作为系统时钟的时钟源,提供高于HIS、HSE时钟频率的时钟源。将STM32F407的时钟树系统时钟源简化后的框图如图 2所示。

【STM32】初学者必读STM32时钟系统详解

图 3 系统时钟源框图

3.2 次级时钟源

        STM32单片机器件具有两个次级时钟源,分别为:

        ● 32 kHz 低速内部 RC (LSI RC)。该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。

        ● 32.768 kHz 低速外部晶振( LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)。

3.3 时钟源特点

        每个时钟源都可单独打开或者关闭,不用时关闭时钟源以降低功耗。

        时钟控制器为应用带来了高度的灵活性,用户在运行内核和外设时可选择使用外部晶振或者使用振荡器,既可采用最高的频率,也可为以太网、 USB OTG FS 以及 HS、 I2S 和 SDIO等需要特定时钟的外设保证合适的频率。

4 时钟

        通过前文介绍,了解到STM32F407的时钟包括以太网ptp时钟、系统时钟SystemClk、AHB时钟、APB时钟等。APB时钟分为高速 APB (APB2) 和低速 APB (APB1),时钟控制器可对这些时钟的频率进行配置。这些时钟为单片机的AHB总线、AHB1总线、APB1总线、APB总线提供工作时钟,各外设分别连接到各个总线上,获得相应的工作时钟,时钟频率收到总线工作时钟最大频率限制。以STM32F407为例,AHB 的最大频率为 168 MHz,低速 APB1 的最大允许频率为 42 MHz,高速 APB2 的最大允许频率为 84 MHz。

        STM32F407总线如图 4所示。

【STM32】初学者必读STM32时钟系统详解

图 4 STM32F407总线

4.1 AHB总线时钟

        AHB 总线时钟的最大频率为系统时钟SystemClk,以STM32F407为例,最大为 168 MHz。AHB总线的外设如图 5所示。

【STM32】初学者必读STM32时钟系统详解

图 5 AHB总线外设

4.2 APB1总线时钟

        APB1为APB低速总线,最大频率为系统时钟SystemClk的4分频,以STM32F407为例,最大为 42MHz。APB1总线的外设如图 6所示。

【STM32】初学者必读STM32时钟系统详解

图 6 APB1总线外设

4.3 APB2总线时钟

        APB2为APB高速总线,最大频率为系统时钟SystemClk的2分频,以STM32F407为例,最大为 84MHz。APB2总线的外设如图 7所示。

【STM32】初学者必读STM32时钟系统详解

图 7 APB2总线外设

5 时钟控制器

        STM32单片机的时钟控制通过配置RCC时钟控制寄存器、RCC PLL配置寄存器、RCC时钟配置寄存器、RCC时钟中断寄存器、RCC外设复位寄存器、RCC外设时钟寄存器等组成。这里不在赘述,详细可查阅《STM32F4xx参考手册》。

6 CubeMx配置时钟系统

6.1 选择单片机型号

        NewProjectà选择单片机型号,以STM32F407为例。如图 8所示。

【STM32】初学者必读STM32时钟系统详解

图 8 选择单片机型号

6.2 选择时钟源

        如图 9所示,标注1的为时钟源选项,可以设置HSE、LSE,如选择Disable,则配置为内部RC振荡器,如选择外部晶体振荡器,则硬件上需设计有晶振支持,这里选择为外部晶振。

        标注2为配置是否允许MCO1、MCO2时钟输出,这里未允许。标注3为配置是否允许I2S外部时钟输入,这里未允许。

【STM32】初学者必读STM32时钟系统详解

图 9 时钟源选择

6.3 配置系统时钟

        STM32F407最大允许系统时钟168M,其配置方法如下:

  • 选择Clock Configuration选项卡。
  • 选择HSE。
  • 选择PLLCLK
  • 设置HCLK为168MHz

        如图 10所示,可查询到系统时钟、APB1、APB2等总线时钟,方便外设使用时的时钟设置。

【STM32】初学者必读STM32时钟系统详解

图 10 系统时钟配置

6.4 时钟系统初始化代码

        时钟系统初始化相关函数如表 1所示

表 1 时钟系统初始化相关函数

序号

函数名称

函数功能说明

1

SystemClock_Config(void)

系统时钟配置

        代码具体如下:

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Configure the main internal regulator output voltage 
    */
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

7 结论

        看过本文后,相信您对复杂的时钟系统有了新的认识,在未来的设计中,不会因为STM32的复杂时钟踩坑。请关注博主,学习更多实战经验,后续会陆续推出更多实战经验,还请多多关注、批评指正!文章来源地址https://www.toymoban.com/news/detail-479694.html

到了这里,关于【STM32】初学者必读STM32时钟系统详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32初学者,到底选标准库还是HAL库?

    当初学者尝试学习STM32开发时,通常会面临一个关键的选择:是选择STM32的标准库,还是HAL库?这两个库各自有着优势与适用场景,本文将从多个角度分析,帮助初学者更好地选择适合自己的库。 在开始之前,让我们先搞清楚这两个库的基本概念。标准库是一组用于STM32系列微

    2024年02月08日
    浏览(45)
  • 【初学者必读】能让你月薪过万的5大web前端核心技能

    前言 Web前端开发所涉及的内容主要包括W3C标准中的结构、行为和表现,那么这三项中我们需要掌握的核心技能是什么呢?看小编来为你揭开谜底的。 HTML发展历史有二十多年,历经多次版本更新,HTML5和CSS3的出现又是一次革新。有些人认为前端开发要掌握的技能简单,不就是

    2024年02月08日
    浏览(52)
  • 不怕没项目做!github上的STM32 优秀开源项目和初学者项目

    TinyGo - Go语言编译器,适用于微控制器、WebAssembly、命令行工具,基于LLVM。 语言:Go 星标数:14,267+ 描述:TinyGo带来了Go语言在嵌入式系统的实现,使得STM32等微控制器编程更加多样化。 Flipper Zero Firmware - Flipper Zero的固件源码。 语言:C 星标数:10,699+ 描述:为Flipper Zero多功能

    2024年03月20日
    浏览(139)
  • 了解 ESP32 FreeRTOS:初学者指南

    ESP32 FreeRTOS是针对ESP32微控制器的一个实时操作系统(RTOS),它采用了FreeRTOS内核,可以帮助开发人员在ESP32芯片上进行多任务处理。简单来说,FreeRTOS提供了一种方式来管理软件任务并协调它们的执行。 ESP32是一个功能强大的嵌入式系统,可以用于构建各种物联网应用程序。

    2023年04月14日
    浏览(59)
  • Python初学者友好丨详解参数传递类型

    摘要:  本文清晰地解释了Python中的不同参数传递类型,并提供了示例代码来说明每种类型的用法。对于初学者或不清楚Python传参的读者们来说是非常有益的,文中提供了足够的信息来理解和使用Python中的函数参数传递。 本文分享自华为云社区《提升Python函数调用灵活性:参

    2024年02月09日
    浏览(44)
  • 什么是SSH协议?初学者指南详解SSH协议

    SSH又称为“安全外壳协议”(Secure Shell),是一种加密的网络传输协议,提供了一个在网络中安全地远程连接到其他计算机和设备的方法。SSH协议通过使用加密技术创建安全的隧道,保障了数据在传输过程中的安全性和完整性。 在互联网通信时代的初期,通信内容都是明文传

    2024年04月12日
    浏览(32)
  • xss-labs初学者通关详解1-18

    很久的一篇文章 有错误请指正~ 目录 xss漏洞  level1-无过滤机制 level2-闭合标签  level3-单引号闭合+添加事件  level4-双引号闭合+添加事件 level5-新建标签 ​level6-大小写绕过  level7-双写绕过 level8-编码绕过 ​level9-检测 level10-隐藏信息 ​level-11Referer信息  level-12user-agent信

    2024年02月06日
    浏览(44)
  • 【Git】git常用命令大全(初学者必看!!最强详解!!)

    目录 初学者在使用之前,需要对git有一个初步的认知 什么是git 常用命令 1、创建仓库 2、克隆远程仓库 3、查询文件状态 4、 添加文件到暂存区 5、 添加所有文件到暂存区 6、 提交暂存区文件到本地建的仓库 7、拉取远程仓库的变更 8、推送本地仓库的变更到远程仓库 9、 查看

    2024年02月10日
    浏览(43)
  • docker常用命令详解(图文结合纯干货,适用于初学者)

    docker最常用命令 1.docker 或 docker --help #查看docker自带的帮助信息(里面内容对初学者十分不友好) 启动类命令 systemctl start docker #启动docker systemctl stop docker #停止docker systemctl restart docker #重启docker systemctl status docker #查看docker状态 systemctl enable docker #将docker设为开机自启动 3.d

    2024年02月08日
    浏览(41)
  • 详解 matplotlib.pyplot ,Python 初学者真能看懂

    Matplotlib 是一个 Python 中的 2D 绘图库, pyplot 模块是一个方便使用 Matplotlib 的接口。 下面是 pyplot 模块中的五个重要的知识点: 【创建图形】: pyplot 模块提供了许多简单易用的函数来创建图形,如 plot、scatter、bar、hist 等。这些函数可以绘制不同类型的图形,例如散点图、折

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包