对于微处理器,一切的底层配置,最终都是配置寄存器
库函数的本质就是对寄存器的封装
映射文件:
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;
如下图所示为Datasheet中的Memory Mapping
下图为上图中的一小部分,是GPIO的基地址
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#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_Typedef类型的结构体
把地址强制转换为结构体指针类型
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
从GPIOA这个地址开始,4字节32位数据是CRL,后面4字节32位数据是CRH,后面....
因此,当我们用GPIOA->CRL时,其本质上就是在访问对应地址的寄存器
base就是给你偏移用的一个东西
版权声明:本文为CSDN博主「CodeForCoffee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24118527/article/details/122717133
暂无评论