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

【STM32】什么在使能寄存器或外设之前必须先打开时钟?

这篇文章解释一个非常基础但是重要的问题:

为什么在使能寄存器或外设之前必须先打开时钟?

我们会发现,如果不开时钟就访问寄存器 ⇒ 会“写不进去”或“读取错误”。 因此,我们在写代码时,总是需要 先开时钟,再配置寄存器。 因为外设的寄存器和功能依附于该外设的时钟,未给外设开时钟,访问它的寄存器就是访问 “虚空”

原因一:STM32 采用总线分频 + 外设时钟门控机制

STM32 的整个芯片系统是按照模块划分的,每个模块(GPIO、ADC、DAC、USART、TIM等)都挂载在不同的总线上(如 APB1、APB2、AHB 等)。为了节能和提升效率,STM32 默认关闭大多数外设的时钟

原因二:外设寄存器依赖其时钟供电

外设模块的寄存器(如 GPIOx->CRLADC1->SRDAC->CR 等)属于模块内部电路的一部分,如果该模块没有时钟供电:

  • 寄存器不可访问或访问无效
  • 配置内容无法写入或无响应
  • 写入后不生效
  • 有可能引发不可预测行为(如锁死)
举个例子
//❌ 错误:先配置 GPIO,但未使能时钟
GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_0;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio); // [未开时钟,配置无效!]
✅ 正确流程:先使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开PA端口时钟
GPIO_Init(GPIOA, &gpio);

STM32 时钟控制机制图示

		┌───────────────────────────────────┐ RCC(时钟控制器)                └───────────────────────────────────┘┌────────────────────┐ APB2 总线          │──→ 控制 GPIO、ADC、TIM1、USART1 等外设└────────────────────┘┌────────────────────┐ GPIOA 模块         └────────────────────┘          [RCC 控制信号]  决定是否给 GPIOA 模块供时钟

外设的寄存器属于该模块本身的一部分,而模块只有在获得时钟供电之后,内部逻辑电路才会被“点亮”,寄存器才会真正“存在”于系统中。

常见外设时钟开启方式(标准库)
外设时钟函数
GPIOA~GPIOGRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
ADC1~3RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx, ENABLE);
DACRCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
USART1RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART2~5RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE);

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

http://www.lryc.cn/news/588541.html

相关文章:

  • java基础-1 : 运算符
  • 使用dify生成测试用例
  • 13.计算 Python 字符串的字节大小
  • HTML 文本格式化标签
  • 工业新引擎:预测性维护在工业场景中的实战应用(流程制造业为例)
  • 具身智能零碎知识点(五):VAE中对使用KL散度的理解
  • JJ20 Final Lap演唱会纪念票根生成工具
  • HashMap的长度为什么要是2的n次幂以及HashMap的继承关系(元码解析)
  • C语言:20250714笔记
  • 文本预处理(四)
  • AI驱动编程范式革命:传统开发与智能开发的全维度对比分析
  • 【DataWhale】快乐学习大模型 | 202507,Task01笔记
  • js的局部变量和全局变量
  • Java面试总结(经典题)(Java多线程)(一)
  • kotlin学习笔记
  • 【日常技能】excel的vlookup 匹配#N/A
  • Linux ACL权限策略
  • Faiss库
  • OFDM系统中关于信号同步的STO估计与CFO估计的MATLAB仿真
  • 基于Android的景点旅游信息系统App
  • DNS重绑定
  • 操作系统-第一章操作系统和第二章进程(知识点学习/期末复习/笔试/面试/考研)
  • 机载激光雷达目标识别:从点云到凝视成像的算法全景
  • 延迟双删懂不
  • 大数据领域开山鼻祖组件Hadoop核心架构设计
  • 逻辑代数中的基本规则,代入规则和反演规则,对偶规则
  • 九、官方人格提示词汇总(中-3)
  • 【C语言进阶】指针面试题详解(2)
  • LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
  • 【Bluedroid】蓝牙协议栈enable流程深度解析