当前位置: 首页 > news >正文

STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟

一、实验背景与目的

上一节课中,我们已经学习了如何使用外部高速时钟 HSE(High Speed External)作为系统时钟源,并通过 MCO(Microcontroller Clock Output)输出信号来验证时钟配置是否正确。

本节我们将继续深入学习:
如何使用内部高速时钟 HSI(High Speed Internal)配置系统时钟,并通过 MCO 输出验证系统频率。


二、HSI 的原理回顾

HSI 是 STM32 内部自带的高速 RC 振荡器(通常为 8 MHz),不依赖外部晶振。它启动速度快,但精度略低,一般用于:

  • 节省成本或无外部晶振时;

  • 在调试、测试阶段使用;

  • 或在低功耗快速启动应用中。

HSI 可直接作为系统时钟源,也可以经过 除 2 后作为 PLL 输入源,经倍频后生成更高频率。

例如:

HSI = 8 MHz
HSI / 2 = 4 MHz
若倍频因子 = 16 → 系统时钟 = 4 MHz × 16 = 64 MHz


三、代码分析与实现步骤

1. 头文件 bsp_rcclkconfig.h
#ifndef __BSP_RCCLKCONFIG_H
#define __BSP_RCCLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClk(uint32_t RCC_PLLMul_x);
void MCO_GPIO_Config(void);
void HSI_SetSysClk(uint32_t RCC_PLLMul_x);#endif

这里声明了三个函数:

  • HSE_SetSysClk():上节课的外部晶振配置函数。

  • MCO_GPIO_Config():配置 PA8 为时钟输出引脚。

  • HSI_SetSysClk():本节新增的函数,用于用 HSI 配置系统时钟。


2. 主函数 main.c
int main(void)
{HSI_SetSysClk(RCC_PLLMul_16);  // 使用HSI × 16 = 64MHzMCO_GPIO_Config();              // 配置MCO输出引脚RCC_MCOConfig(RCC_MCO_SYSCLK);  // 输出系统时钟到PA8LED_GPIO_Config();              // 初始化LEDwhile(1){LED_G(OFF);Delay(0xFFFFF);LED_G(ON);Delay(0xFFFFF);}
}
程序逻辑讲解:
  1. HSI_SetSysClk()
    使用内部时钟 HSI 作为 PLL 输入,倍频后配置系统时钟为目标频率(例:64 MHz)。

  2. MCO_GPIO_Config()
    配置 PA8 为复用推挽输出,用于输出时钟信号。

  3. RCC_MCOConfig(RCC_MCO_SYSCLK)
    将系统时钟源(SYSCLK)输出到 MCO 引脚(PA8),以便用示波器测量。

  4. LED_GPIO_Config() 与循环闪灯
    通过 LED 闪烁的频率变化,粗略观察系统时钟的快慢。


3. bsp_rcclkconfig.c 的实现逻辑
void HSI_SetSysClk(uint32_t RCC_PLLMul_x)
{__IO uint32_t HSIStatus;RCC_DeInit();                   // 复位RCC寄存器RCC_HSICmd(ENABLE);             // 使能HSIHSIStatus = RCC->CR & RCC_CR_HSIRDY;  // 判断HSI是否稳定if(HSIStatus == RCC_CR_HSIRDY)  // 若稳定则配置系统时钟{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);  // HSI/2 × 倍频RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);   // 等待PLL稳定RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);             // 切换系统时钟源while(RCC_GetSYSCLKSource() != 0x08);                 // 等待切换完成}else{/* 如果HSI启动失败,可以在这里加入错误处理 */}
}
代码逻辑拆解:
步骤动作说明
RCC_DeInit()将 RCC 寄存器恢复到复位状态,防止旧配置干扰。
RCC_HSICmd(ENABLE)开启内部 8 MHz RC 振荡器。
RCC->CR & RCC_CR_HSIRDY检查 HSI 是否准备就绪。
FLASH_SetLatency()调整 Flash 等待周期,适应高频访问速度。
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x)设置 PLL 源为 HSI/2,并指定倍频因子。
RCC_PLLCmd(ENABLE)启动 PLL 并等待其锁定(稳定)。
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)将系统时钟切换到 PLL 输出。
RCC_GetSYSCLKSource()验证切换成功。

四、使用 MCO 输出验证时钟

1. 配置 GPIO(PA8)

void MCO_GPIO_Config()
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
}

PA8 是 MCO 引脚(可输出 SYSCLK、HSI、HSE、PLLCLK/2 等信号)。
这里配置为复用推挽输出模式,以驱动示波器或外部电路。


2. 输出时钟信号

RCC_MCOConfig(RCC_MCO_SYSCLK);

此函数将 系统时钟(SYSCLK) 输出到 PA8 引脚。

若想输出 HSI,可改为 RCC_MCOConfig(RCC_MCO_HSI)
若想输出 PLLCLK/2,可改为 RCC_MCOConfig(RCC_MCO_PLLCLK_Div2)


五、实验现象与验证

配置理论频率实际测量(示波器)现象
HSE_SetSysClk(RCC_PLLMul_9)72 MHz≈ 72 MHzLED闪烁正常
HSI_SetSysClk(RCC_PLLMul_16)64 MHz≈ 64 MHzLED闪烁略慢
HSI_SetSysClk(RCC_PLLMul_12)48 MHz≈ 48 MHzLED闪烁更慢

若测得的频率与预期一致,则系统时钟配置成功。
示波器应接地良好,并断开蜂鸣器跳帽(PA8连接蜂鸣器会影响波形)。


六、实验总结

通过本节实验,我们学会了:

  1. 如何使用 HSI(内部时钟)通过 PLL 倍频配置系统时钟;

  2. 如何通过 MCO 输出验证系统时钟频率;

  3. 理解了固件库函数 RCC_HSICmdRCC_PLLConfigRCC_MCOConfig 的配合使用;

  4. 掌握了调试与验证时钟系统的基本方法。

http://www.dtcms.com/a/600689.html

相关文章:

  • Git 中新建学习分支 + 暂存修改 + VSCode 可视化查看改动(超详细教程)
  • Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
  • Docker 相关使用收录
  • 【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
  • Docker-存储
  • wap手机网站模板上饶网站建设3ao cc专业a
  • 【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
  • 域名注册和网站设计服务如何做贴吧类网站多钱
  • python+uniapp基于微信小程序的垃圾分类信息系统
  • C语言编译器安卓版 | 强大功能助力编程学习与实践
  • STM32使用金属探测传感器自制金属探测仪
  • vmware嵌套安装esxi7.0.3扩容vmfs
  • 使用 BR 备份 TiDB 到 AWS S3 存储
  • 【OpenCV + VS】OpenCV 绘图:绘制矩形、圆形、椭圆形、线条等
  • 易语言反编译工具 - 高效破解易语言程序的利器
  • 11年始终专注营销型网站提供网站建设小程序制作
  • AOSP Android13 Launcher3——TransformParams 类
  • 网站推广问题推广公司网站有哪些方式
  • 成都网站建设公司电话美食网站建设多少钱
  • 【把Linux“聊”明白】进程的概念与状态
  • GIT版本管理工具轻松入门 | TortoiseGit,本地 Git 仓库和 Git 概念,笔记02
  • 什么是美颜sdk?美型功能开发与用户体验优化实战
  • 在 React 项目中使用 Ky 与 TanStack Query 构建现代化数据请求层
  • 计算机网络---传输层安全 SSL与TLS
  • 【Linux篇】信号机制深度剖析:从信号捕捉到SIGCHLD信号处理
  • C语言编译软件选择及优化建议
  • Linux 之 【冯诺依曼体系结构与操作系统的简介】
  • 潍坊建设gc局网站windows优化软件
  • Java虚拟机(JVM)面试题(51道含答案)
  • [27] cuda 应用之 核函数实现图像通道变换