当前位置:   article > 正文

stm32——使用结构体描述寄存器映射_stm32中如何用结构体将寄存器装置在一起

stm32中如何用结构体将寄存器装置在一起

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

STM32的外设寄存器的组织形式是

基于基地址+寄存器偏移地址

 比如,在RCC的基地址基础上,偏移0x00得到RCC_CR寄存器,偏移0x04得到RCC_PLLCFGR寄存器...这与C语言的结构体成员很像,因此可以用结构体成员来描述寄存器的映射

以GPIO寄存器映射来说明这一关系

1.GPIO寄存器的映射关系

 

 以下同理

 

2 寄存器间的偏移关系

注意:GPIO端口模式寄存器MODER有32位,也就是占据4个字节,因此必须偏移4个字节,也就是32位才能到达下一个寄存器

 

 

 3 在代码中用结构体定义寄存器,记录偏移地址

  1. /*GPIO寄存器列表*/
  2. typedef struct
  3. {
  4. _IO unit32_t MODER; //GPIO模式寄存器 地址偏移:0x00
  5. _IO unit32_t OTYPER; //GPIO输出类型寄存器,地址偏移:0x04
  6. _IO unit32_t OSPEEDR; //GPIO输出速度寄存器 地址偏移:0x08
  7. _IO unit32_t PUPDR; //GPIO上拉/下拉寄存器 地址偏移:0x0C;
  8. _IO unit32_t IDR; //GPIO输入数据寄存器,地址偏移:0x10;
  9. _IO unit32_t ODR; //GPIO输出数据寄存器,地址偏移:0x14
  10. _IO unit16_t BSRRL; //GPIO置位/复位寄存器(低16位) 地址偏移:0x18
  11. _IO unit16_t BSRRH; //GPIO置位/复位寄存器(低16位) 地址偏移:0x1A
  12. _IO unit32_t LCKR; //GPIO配置锁定寄存器,地址偏移0x1C
  13. _IO unit32_t AFR[2]; //GPIO复用功能配置寄存器,地址偏移0x20-0x24
  14. } GPIO_TypeDef
  15. //16进制的A=10,C=12

注意变量类型要与偏移大小对应上,比如MODER寄存器占用4个字节,则偏移到下一个位置要加上04,OTYPER也占据4个字节,因此,偏移到下一个位置同样加04,32位的BSRR寄存器被拆成了2个16位的寄存器,BSRRL和BSRRH

  1. /*GPIO外设基地址*/
  2. #define GPIOA_BASE (D3AHB1PERIPH_BASE+0x0000U);
  3. #define GPIOB_BASE (D3AHB1PERIPH_BASE+0x0400U);
  4. #define GPIOC_BASE (D3AHB1PERIPH_BASE+0x0800U);
  5. #define GPIOD_BASE (D3AHB1PERIPH_BASE+0x0C00U);
  6. #define GPIOE_BASE (D3AHB1PERIPH_BASE+0x1000U);
  7. #define GPIOF_BASE (D3AHB1PERIPH_BASE+0x1400U);
  8. #define GPIOG_BASE (D3AHB1PERIPH_BASE+0x1800U);
  9. #define GPIOH_BASE (D3AHB1PERIPH_BASE+0x1C00U);
  10. #define GPIOI_BASE (D3AHB1PERIPH_BASE+0x2000U);
  11. #define GPIOJ_BASE (D3AHB1PERIPH_BASE+0x2400U);
  12. #define GPIOK_BASE (D3AHB1PERIPH_BASE+0x2800U);
  1. /*定义GPIOA-K结构体指针
  2. #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
  3. //将A的基地址强制转换为结构体的形式,这样就将GPIO的基地址组织起来了
  4. #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
  5. #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
  6. #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
  7. #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
  8. #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
  9. #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
  10. #define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)
  11. #define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/56845
推荐阅读
相关标签
  

闽ICP备14008679号