嵌入式单片机开发 - 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();
相关推荐
ajassi20001 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
兆龙电子单片机设计1 小时前
【STM32项目开源】STM32单片机智能恒温箱控制系统
stm32·单片机·物联网·开源·毕业设计
鹅毛在路上了3 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug3 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
索迪迈科技4 小时前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机宠物投食系统
c语言·stm32·单片机·嵌入式硬件·51单片机
方圆工作室4 小时前
Arduino音乐键盘程序
单片机·嵌入式硬件·计算机外设
小欣加油4 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
王璐WL5 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
aramae5 小时前
C++ -- 模板
开发语言·c++·笔记·其他