stm32——使用结构体描述寄存器映射

将地址信息放在一个头文件中方便管理,存放地址和偏移量

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外设基地址强制类型转换,形成了结构体指针,可以简单的理解为建立了结构体和实际内存中的一种映射关系,访问结构体成员,就相当于访问实际内存的一小块对应的地址

总的来说,就是用一个文件存储外设基地址以及偏移地址,用结构体描述寄存器映射,访问结构体成员就会对应访问相应的内存地址,结构体的内容是会占据内存空间的

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值