嵌入式单片机开发 - 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();
相关推荐
无垠的广袤11 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雾岛听蓝12 小时前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
Dream it possible!12 小时前
LeetCode 面试经典 150_图_克隆图(90_133_C++_中等)(深度优先:DFS)
c++·leetcode·面试·
鸭子程序员13 小时前
c++ 算法
开发语言·c++·算法
不会c嘎嘎13 小时前
算法百练,直击OFFER -- day5
c++·算法
序属秋秋秋13 小时前
《Linux系统编程之进程环境》【环境变量】
linux·运维·服务器·c语言·c++·操作系统·系统编程
雲烟13 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞14 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
乌萨奇也要立志学C++14 小时前
【洛谷】二分查找专题 告别二分死循环!模板 + 细节 + 实战
c++·算法
Yue丶越14 小时前
【C语言】数据在内存中的存储
c语言·开发语言·网络