将地址信息放在一个头文件中方便管理,存放地址和偏移量
STM32的外设寄存器的组织形式是
基于基地址+寄存器偏移地址
比如,在RCC的基地址基础上,偏移0x00得到RCC_CR寄存器,偏移0x04得到RCC_PLLCFGR寄存器...这与C语言的结构体成员很像,因此可以用结构体成员来描述寄存器的映射
以GPIO寄存器映射来说明这一关系
1.GPIO寄存器的映射关系
以下同理
2 寄存器间的偏移关系
注意:GPIO端口模式寄存器MODER有32位,也就是占据4个字节,因此必须偏移4个字节,也就是32位才能到达下一个寄存器
3 在代码中用结构体定义寄存器,记录偏移地址
/*GPIO寄存器列表*/
typedef struct
{
_IO unit32_t MODER; //GPIO模式寄存器 地址偏移:0x00
_IO unit32_t OTYPER; //GPIO输出类型寄存器,地址偏移:0x04
_IO unit32_t OSPEEDR; //GPIO输出速度寄存器 地址偏移:0x08
_IO unit32_t PUPDR; //GPIO上拉/下拉寄存器 地址偏移:0x0C;
_IO unit32_t IDR; //GPIO输入数据寄存器,地址偏移:0x10;
_IO unit32_t ODR; //GPIO输出数据寄存器,地址偏移:0x14
_IO unit16_t BSRRL; //GPIO置位/复位寄存器(低16位) 地址偏移:0x18
_IO unit16_t BSRRH; //GPIO置位/复位寄存器(低16位) 地址偏移:0x1A
_IO unit32_t LCKR; //GPIO配置锁定寄存器,地址偏移0x1C
_IO unit32_t AFR[2]; //GPIO复用功能配置寄存器,地址偏移0x20-0x24
} GPIO_TypeDef
//16进制的A=10,C=12
注意变量类型要与偏移大小对应上,比如MODER寄存器占用4个字节,则偏移到下一个位置要加上04,OTYPER也占据4个字节,因此,偏移到下一个位置同样加04,32位的BSRR寄存器被拆成了2个16位的寄存器,BSRRL和BSRRH
/*GPIO外设基地址*/
#define GPIOA_BASE (D3AHB1PERIPH_BASE+0x0000U);
#define GPIOB_BASE (D3AHB1PERIPH_BASE+0x0400U);
#define GPIOC_BASE (D3AHB1PERIPH_BASE+0x0800U);
#define GPIOD_BASE (D3AHB1PERIPH_BASE+0x0C00U);
#define GPIOE_BASE (D3AHB1PERIPH_BASE+0x1000U);
#define GPIOF_BASE (D3AHB1PERIPH_BASE+0x1400U);
#define GPIOG_BASE (D3AHB1PERIPH_BASE+0x1800U);
#define GPIOH_BASE (D3AHB1PERIPH_BASE+0x1C00U);
#define GPIOI_BASE (D3AHB1PERIPH_BASE+0x2000U);
#define GPIOJ_BASE (D3AHB1PERIPH_BASE+0x2400U);
#define GPIOK_BASE (D3AHB1PERIPH_BASE+0x2800U);
/*定义GPIOA-K结构体指针
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
//将A的基地址强制转换为结构体的形式,这样就将GPIO的基地址组织起来了
#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)
#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)
#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)
这里将GPIO外设基地址强制类型转换,形成了结构体指针,可以简单的理解为建立了结构体和实际内存中的一种映射关系,访问结构体成员,就相当于访问实际内存的一小块对应的地址
总的来说,就是用一个文件存储外设基地址以及偏移地址,用结构体描述寄存器映射,访问结构体成员就会对应访问相应的内存地址,结构体的内容是会占据内存空间的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)