0
点赞
收藏
分享

微信扫一扫

嵌入式C语言的寄存器地址映射


对于微处理器,一切的底层配置,最终都是配置寄存器

库函数的本质就是对寄存器的封装

映射文件:

stm32f10x.h

根据Datasheet,STM32F1系列的GPIO共有7个寄存器,对应的结构体定义如下:

/** 
* @brief General Purpose I/O
*/

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;

嵌入式C语言的寄存器地址映射_c语言

如下图所示为Datasheet中的Memory Mapping

嵌入式C语言的寄存器地址映射_数据_02

下图为上图中的一小部分,是GPIO的基地址

嵌入式C语言的寄存器地址映射_数据_03

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

嵌入式C语言的寄存器地址映射_STM32_04

嵌入式C语言的寄存器地址映射_数据_05

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

嵌入式C语言的寄存器地址映射_#define_06

嵌入式C语言的寄存器地址映射_#define_07

#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)

嵌入式C语言的寄存器地址映射_c语言_08 嵌入式C语言的寄存器地址映射_寄存器_09

 嵌入式C语言的寄存器地址映射_数据_10

强制类型换为GPIO_Typedef类型的结构体

地址强制换为结构体指针类型

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

嵌入式C语言的寄存器地址映射_STM32_11

嵌入式C语言的寄存器地址映射_数据_12

从GPIOA这个地址开始,4字节32位数据是CRL,后面4字节32位数据是CRH,后面....

因此,当我们用GPIOA->CRL时,其本质上就是在访问对应地址的寄存器

base就是给你偏移用的一个东西

嵌入式C语言的寄存器地址映射_数据_13

嵌入式C语言的寄存器地址映射_#define_14

嵌入式C语言的寄存器地址映射_寄存器_15


举报

相关推荐

0 条评论