STM32开发详解:stm32f10x.h头文件——内存映射、寄存器配置、宏定义及位操作指南,结合点灯案例实践
概述
STM32F10x.h
是 STM32F1 系列微控制器的核心头文件,提供了所有外设寄存器的定义和内存映射一、内存映射
#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
-
PERIPH_BASE
是片上外设的起始地址,对于STM32系列是0x40000000
-
根据这个基础地址,APB1、APB2、AHB 外设的地址空间是依次偏移的,分别为
+0x00000
、0x10000
、0x20000
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
-
访问 GPIO 外设的基地址定义,它们基于 APB2PERIPH_BASE
-
GPIO 的地址按端口(GPIOA、GPIOB…)依次偏移
0x400
二、寄存器结构体与宏
1、复位和时钟控制 RCC
typedef struct
{
__IO uint32_t CR; // 时钟控制寄存器
__IO uint32_t CFGR; // 时钟配置寄存器
__IO uint32_t CIR; // 时钟中断寄存器
__IO uint32_t APB2RSTR; // APB2 外设复位寄存器
__IO uint32_t APB1RSTR; // APB1 外设复位寄存器
__IO uint32_t AHBENR; // AHB 外设时钟使能寄存器
__IO uint32_t APB2ENR; // APB2 外设时钟使能寄存器
__IO uint32_t APB1ENR; // APB1 外设时钟使能寄存器
__IO uint32_t BDCR; // 备份域控制寄存器
__IO uint32_t CSR; // 控制 / 状态寄存器
#ifdef STM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif
} RCC_TypeDef;
#define RCC ((RCC_TypeDef *) RCC_BASE)
2、通用输入输出 GPIO
typedef struct
{
__IO uint32_t CRL; // 端口配置低寄存器
__IO uint32_t CRH; // 端口配置高寄存器
__IO uint32_t IDR; // 输入数据寄存器
__IO uint32_t ODR; // 输出数据寄存器
__IO uint32_t BSRR; // 位设置/清除寄存器
__IO uint32_t BRR; // 位清除寄存器
__IO uint32_t LCKR; // 配置锁定寄存器
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
三、寄存器位定义
1、RCC_APB2RSTR
寄存器位定义
#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */
#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */
#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */
#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */
#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */
#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */
#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL)
#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */
#endif
#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */
#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */
#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */
#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */
#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */
#endif
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL)
#define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */
#endif /* STM32F10X_LD && STM32F10X_LD_VL */
#if defined (STM32F10X_HD) || defined (STM32F10X_XL)
#define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */
#define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */
#define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */
#define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */
#endif
#if defined (STM32F10X_HD_VL)
#define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */
#define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */
#endif
#ifdef STM32F10X_XL
#define RCC_APB2ENR_TIM9EN ((uint32_t)0x00080000) /*!< TIM9 Timer clock enable */
#define RCC_APB2ENR_TIM10EN ((uint32_t)0x00100000) /*!< TIM10 Timer clock enable */
#define RCC_APB2ENR_TIM11EN ((uint32_t)0x00200000) /*!< TIM11 Timer clock enable */
#endif
宏定义 | 值 | 说明 |
---|---|---|
RCC_APB2ENR_AFIOE |
0x00000001 |
复位 AFIO |
RCC_APB2ENR_IOPAEN |
0x00000004 |
使能 GPIOA |
RCC_APB2ENR_IOPBEN |
0x00000008 |
使能 GPIOB |
RCC_APB2ENR_IOPCEN |
0x00000010 |
使能 GPIOC |
RCC_APB2ENR_IOPDEN |
0x00000020 |
使能 GPIOD |
RCC_APB2ENR_ADC1EN |
0x00000200 |
使能 ADC1 |
RCC_APB2ENR_TIM1EN |
0x00000800 |
使能高级定时器 TIM1 |
RCC_APB2ENR_SPI1EN |
0x00001000 |
使能 SPI1 |
RCC_APB2ENR_USART1EN |
0x00004000 |
使能 USART1 |
2、GPIO_CRL
寄存器位定义
#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */
#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */
#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */
#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */
#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */
#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */
#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */
#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */
#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */
#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */
#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */
#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */
#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */
#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */
#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */
#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */
#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */
#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */
#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */
#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */
#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */
#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */
#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */
#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */
#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */
#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */
#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */
#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */
#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */
#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */
#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */
#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */
#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */
#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */
#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */
#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */
#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */
#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */
#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */
#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */
#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */
#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */
#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */
#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */
#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */
#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */
#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */
#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */
#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */
#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */
宏定义 | 值(十六进制) | 值(二进制) | 功能描述 |
---|---|---|---|
GPIO_CRL_MODE |
0x33333333 |
... 00110011 |
所有引脚的 MODE 位掩码(复位值) |
GPIO_CRL_MODE0 |
0x00000003 |
... 00000011 |
引脚 0 的 MODE 位 0、1 |
GPIO_CRL_MODE0_0 |
0x00000001 |
... 00000001 |
引脚 0 的 MODE 位 0 |
GPIO_CRL_MODE0_1 |
0x00000002 |
... 00000010 |
引脚 0 的 MODE 位 1 |
GPIO_CRL_MODE1 |
0x00000030 |
... 00110000 |
引脚 1 的 MODE 位 4 、5 |
GPIO_CRL_MODE1_0 |
0x00000010 |
... 00010000 |
引脚 1 的 MODE 位 4 |
GPIO_CRL_MODE1_1 |
0x00000020 |
... 00100000 |
引脚 1 的 MODE 为 5 |
… | … | … | … |
宏定义 | 值(十六进制) | 值(二进制) | 功能描述 |
---|---|---|---|
GPIO_CRL_CNF |
0xCCCCCCCC |
... 11001100 |
所有引脚的 CNF 位掩码(复位值) |
GPIO_CRL_CNF0 |
0x0000000C |
... 00001100 |
引脚 0 的 CNF 位 2、3 |
GPIO_CRL_CNF0_0 |
0x00000004 |
... 00000100 |
引脚 0 的 CNF 位 2 |
GPIO_CRL_CNF0_1 |
0x00000008 |
... 00001000 |
引脚 0 的 CNF 位 3 |
GPIO_CRL_CNF1 |
0x000000C0 |
... 11000000 |
引脚 1 的 CNF 位 6、7 |
GPIO_CRL_CNF1_0 |
0x00000040 |
... 01000000 |
引脚 1 的 CNF 位 6 |
GPIO_CRL_CNF1_1 |
0x00000080 |
... 10000000 |
引脚 1 的 CNF 位 7 |
… | … | … | … |
3、GPIO_ODR
寄存器位定义
#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */
#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */
#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */
#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */
#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */
#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */
#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */
#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */
#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */
#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */
#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */
#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */
#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */
#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */
#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */
#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */
宏定义 | 值(十六进制) | 二进制值 | 说明 |
---|---|---|---|
GPIO_ODR_ODR0 |
0x0001 |
... 00000001 |
设置引脚 0 |
GPIO_ODR_ODR1 |
0x0002 |
... 00000010 |
设置引脚 1 |
GPIO_ODR_ODR2 |
0x0004 |
... 00000100 |
设置引脚 2 |
GPIO_ODR_ODR3 |
0x0008 |
... 00001000 |
设置引脚 3 |
… | … | … | … |
实现点灯案例
#include "stm32f10x.h"
int main()
{
// RCC APB2 使能
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
// 清除 PB5 的配置位 [23:20]
// GPIO_CRL_MODE5 为 00000000 00110000 00000000 00000000
// GPIO_CRL_CNF5 为 00000000 11000000 00000000 00000000
// GPIO_CRL_MODE5 | GPIO_CRL_CNF5 得到 00000000 11110000 00000000 00000000
// ~(GPIO_CRL_MODE5 | GPIO_CRL_CNF5) 得到 11111111 00001111 11111111 11111111
GPIOB->CRL &= ~(GPIO_CRL_MODE5 | GPIO_CRL_CNF5);
// 设置 PB5 为推挽输出模式,最大速度为 50MH
// GPIO_CRL_MODE5_0 为 00000000 00010000 00000000 00000000
// GPIO_CRL_MODE5_1 为 00000000 00100000 00000000 00000000
// GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 得到 00000000 00110000 00000000 00000000
GPIOB->CRL |= GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1;
// 点亮 PB5
// GPIO_ODR_ODR5 为 00000000 00000000 00000000 00010000
// ~GPIO_ODR_ODR5 得到 11111111 11111111 11111111 11101111
GPIOB->ODR &= ~GPIO_ODR_ODR5;
while (1)
{
}
}
作者:我命由我12345