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

RCC_APB2PeriphClockCmd

RCC_APB2PeriphClockCmd 函数在STM32的标准外设库中扮演着“电源开关”的角色。要理解这个函数,我们需要明白STM32微控制器的几个关键概念:

1. 外设时钟与低功耗设计

STM32内部有非常多的外设,如GPIO(A, B, C...D)、USART1、SPI1、ADC1、定时器1等。为了让芯片更加节能,每个外设都有一个独立的时钟开关。默认情况下,当你给芯片上电后,所有这些外设的时钟都是关闭的,以节省功耗。在你想要使用某个外设(比如想点亮一个LED,需要使用GPIO)之前,你必须先打开这个外设的时钟。否则,外设无法工作,你的程序也无法驱动它。这就像你想用一个电器,必须先插上电源插头一样。

2. 总线架构

STM32内部通过“总线”来连接CPU核心和各种外设。APB2(Advanced Peripheral Bus 2)是其中一条总线,它负责连接一些高速或系统关键的外设RCC_APB2PeriphClockCmd 就是专门管理这条总线上的外设时钟开关的函数。常见挂在APB2总线上的外设有:

  • 所有GPIO端口 (GPIOA, GPIOB, ... GPIOG)

  • 高级定时器 (TIM1, TIM8, TIM9, TIM10, TIM11)

  • 串口1 (USART1)

  • ADC1/ADC2/ADC3

  • SPI1

  • 系统配置控制器 (SYSCFG)

  • ...

3. 函数参数

该函数通常有两个参数:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • RCC_APB2Periph:指定要操作哪个外设的时钟。这是一个宏定义,例如:

    • RCC_APB2Periph_GPIOA

    • RCC_APB2Periph_USART1

    • RCC_APB2Periph_TIM1

    • 你可以使用 | 符号同时开启多个外设的时钟,例如 RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB

  • NewState:指定是开启还是关闭。

    • ENABLE - 打开时钟(相当于接通电源)

    • DISABLE - 关闭时钟(相当于切断电源以省电)

假设你想使用GPIOA的第5引脚来驱动一个LED,并且使用USART1进行串口通信。

在你的程序初始化部分,你必须先开启它们的时钟:

// 在main()函数的开始,初始化外设之前// 1. 开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 2. 开启USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 3. 也可以一次性同时开启GPIOA和USART1的时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);// ... 在这之后,才能继续初始化GPIO和USART的参数
GPIO_Init(...);
USART_Init(...);

常见错误

  1. 忘记开启时钟:这是初学者最常犯的错误。症状是代码逻辑看起来完全正确,但外设就是毫无反应。任何外设的使用第一步都是开启其时钟

  2. 搞错总线:除了APB2,还有APB1、AHB等总线。不同的外设挂在不同总线上。

    • APB1:连接的是低速外设,如USART2/3、I2C1/2、SPI2、定时器2/3/4/5/6/7等。操作它们需要使用 RCC_APB1PeriphClockCmd() 函数。

    • 在使用函数前,最好查一下数据手册或编程手册,确认外设挂在哪条总线上。

总结

项目说明
函数名RCC_APB2PeriphClockCmd
所属库STM32标准外设库 (SPL)
功能启用或禁用APB2总线上的外设时钟
重要性至关重要,使用任何外设前必须先调用此函数或其等效函数来开启时钟
类比给外设接通电源
http://www.xdnf.cn/news/1371439.html

相关文章:

  • GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SPM
  • 18、移动应用系统分析与设计
  • 机器人 - 无人机基础(6) - 状态估计(ing)
  • 余承东:鸿蒙智行累计交付突破90万辆
  • 算法-每日一题(DAY15)用队列实现栈
  • 算法练习——26.删除有序数组中的重复项(golang)
  • Swift 解法详解 LeetCode 363:矩形区域不超过 K 的最大数值和
  • Spring Bean 生命周期高阶用法:从回调到框架级扩展
  • Java基础第5天总结(final关键字,枚举,抽象类)
  • CVPR自适应卷积的高效实现:小核大感受野提升复杂场景下图像重建精度
  • vue新增用户密码框自动将当前用户的密码自动填充的问题
  • 高校党建系统设计与实现(代码+数据库+LW)
  • 嵌入式配置数据序列化:自定义 TLV vs nanopb
  • 深度学习篇---LeNet-5
  • 1Panel命令
  • 100种交易系统(6)均线MA识别信号与杂音
  • 深度学习----由手写数字识别案例来认识PyTorch框架
  • Python实现RANSAC进行点云直线、平面、曲面、圆、球体和圆柱拟合
  • Il2CppInspector 工具linux编译使用
  • 设计模式之命令模式
  • Vuex 和 Pinia 各自的优点
  • Linux之SELinux 概述、SSH 密钥登录、服务器初始化
  • 利用AI进行ArcGISPro进行数据库的相关处理?
  • Java数据结构速成【1】
  • 原则性 单一职责原则,第一性原则和ACID原则 : 安全/学习/节约
  • 从双重检查锁定的设计意图、锁的作用、第一次检查提升性能的原理三个角度,详细拆解单例模式的逻辑
  • Markdown学习笔记(4)
  • 矩阵微积分的链式法则(chain rule)
  • 在 Android Studio 中修改 APK 启动图标(2025826)
  • 从线到机:AI 与多模态交互如何重塑 B 端与 App 界面设计