嵌入式单片机开发 - HAL 库 STM32F1 外设的时钟使能(时钟使能宏、时钟禁用宏)

概述

  1. STM32 外设的时钟使能宏(ENABLE 系列)与时钟禁用宏(DISABLE系列)位于 STM32F1xx_hal_rcc.h

  2. 下面主要以 APB2 总线上的外设的时钟使能宏与时钟禁用宏为例


一、时钟使能宏

1、基本介绍
c 复制代码
#define __HAL_RCC_AFIO_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_GPIOA_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_GPIOB_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_GPIOC_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_GPIOD_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_ADC1_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_TIM1_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_SPI1_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

#define __HAL_RCC_USART1_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)
  • 这些时钟使能宏的结构相同,只是针对不同的外设
说明
__HAL_RCC_AFIO_CLK_ENABLE() 使能 AFIO 的时钟
__HAL_RCC_GPIOA_CLK_ENABLE() 使能 GPIOA 的时钟
__HAL_RCC_GPIOB_CLK_ENABLE() 使能 GPIOB 的时钟
__HAL_RCC_GPIOC_CLK_ENABLE() 使能 GPIOC 的时钟
__HAL_RCC_GPIOD_CLK_ENABLE() 使能 GPIOD 的时钟
__HAL_RCC_ADC1_CLK_ENABLE() 使能 ADC1 的时钟
__HAL_RCC_TIM1_CLK_ENABLE() 使能 TIM1 的时钟
__HAL_RCC_SPI1_CLK_ENABLE() 使能 SPI1 的时钟
__HAL_RCC_USART1_CLK_ENABLE() 使能 USART1 的时钟
2、解读
c 复制代码
#define __HAL_RCC_AFIO_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)
  • __HAL_RCC_AFIO_CLK_ENABLE() 为例
  1. 使用 do { ... } while(0) 结构,确保宏在使用时的安全性

  2. 声明一个临时变量 tmpreg

  3. SET_BIT 设置 RCC->APB2ENR 寄存器中对应的位,这里是 RCC_APB2ENR_AFIOEN

c 复制代码
#define SET_BIT(REG, BIT)     ((REG) |= (BIT))
  1. READ_BIT 读取该位值到临时变量,这个操作是为了插入延迟,确保时钟稳定,即读取操作会在写入操作之后
c 复制代码
#define READ_BIT(REG, BIT)    ((REG) & (BIT))
  1. UNUSED(tmpreg) 避免编译器警告未使用的变量
3、演示
c 复制代码
// 使能 GPIOA 和 GPIOB 的时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();

二、时钟禁用宏

1、基本介绍
c 复制代码
#define __HAL_RCC_AFIO_CLK_DISABLE()      (RCC->APB2ENR &= ~(RCC_APB2ENR_AFIOEN))
#define __HAL_RCC_GPIOA_CLK_DISABLE()     (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPAEN))
#define __HAL_RCC_GPIOB_CLK_DISABLE()     (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPBEN))
#define __HAL_RCC_GPIOC_CLK_DISABLE()     (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPCEN))
#define __HAL_RCC_GPIOD_CLK_DISABLE()     (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPDEN))
#define __HAL_RCC_ADC1_CLK_DISABLE()      (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN))

#define __HAL_RCC_TIM1_CLK_DISABLE()      (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN))
#define __HAL_RCC_SPI1_CLK_DISABLE()      (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN))
#define __HAL_RCC_USART1_CLK_DISABLE()    (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN))
  • 这些时钟禁用宏的结构相同,只是针对不同的外设
说明
__HAL_RCC_AFIO_CLK_DISABLE() 禁用 AFIO 的时钟
__HAL_RCC_GPIOA_CLK_DISABLE() 禁用 GPIOA 的时钟
__HAL_RCC_GPIOB_CLK_DISABLE() 禁用 GPIOB 的时钟
__HAL_RCC_GPIOC_CLK_DISABLE() 禁用 GPIOC 的时钟
__HAL_RCC_GPIOD_CLK_DISABLE() 禁用 GPIOD 的时钟
__HAL_RCC_ADC1_CLK_DISABLE() 禁用 ADC1 的时钟
__HAL_RCC_TIM1_CLK_DISABLE() 禁用 TIM1 的时钟
__HAL_RCC_SPI1_CLK_DISABLE() 禁用 SPI1 的时钟
__HAL_RCC_USART1_CLK_DISABLE() 禁用 USART1 的时钟
2、解读
c 复制代码
#define __HAL_RCC_AFIO_CLK_DISABLE()      (RCC->APB2ENR &= ~(RCC_APB2ENR_AFIOEN))
  • __HAL_RCC_AFIO_CLK_DISABLE() 为例,直接使用 RCC->APB2ENR 寄存器,然后使用按位与操作 &= 来清除对应的位,这里是 RCC_APB2ENR_AFIOEN
3、演示
c 复制代码
// 禁用 GPIOA 和 GPIOB 的时钟
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOE_CLK_DISABLE();
相关推荐
L_09074 分钟前
【C++】C++11 新特性
开发语言·c++
Fanfanaas12 分钟前
C++ 继承
java·开发语言·jvm·c++·学习·算法
十五年专注C++开发27 分钟前
cereal 库:C++ 序列化的轻量之选
开发语言·c++·序列化·反序列化·cereal
lqqjuly37 分钟前
设计模式:理论、架构与 C++ 实现—SOLID原则到23 种经典模式
c++·设计模式·架构
m0_7471245339 分钟前
单片机 VSCode 开发环境搭建
vscode·单片机·嵌入式硬件
BestOrNothing_201539 分钟前
C++零基础到工程实战(5.2.8)多文件声明定义函数和全局变量
c++·c++多文件编译·.h头文件·.cpp·函数声明定义
嵌入式小站1 小时前
STM32 零基础可移植教程 21:1602A 并口 4 位模式,先显示 Hello
stm32·单片机·嵌入式硬件
星卯教育tony1 小时前
2026年全国青少年信息素养大赛主题应用 数字守艺人 丝路新城 星火征程 智传民韵 c++ python scratch 所有真题免费分享
开发语言·c++
夜月yeyue1 小时前
KCP 与 UDP 可靠传输
linux·网络·单片机·网络协议·udp·php
basketball6161 小时前
C++ bitset 头文件完全指南
开发语言·c++