为什么stm32宏定义的结构体成员是16位的?

2019-07-14 19:22发布

本帖最后由 Mrcharacter 于 2017-8-1 23:25 编辑

大家都知道STM32的库里的寄存器是用结构体来对应的,比如
定义USART1_BASE对应USART的外设地址
#define USART1_BASE           (APB2PERIPH_BASE + 0x3800)
然后强制转换为USART_TypeDef*类型
#define USART1              ((USART_TypeDef *) USART1_BASE)
这样这个指针指向的地址就可以作为一个结构体来使用,结构体成员地址对应寄存器地址,修改结构体成员就是修改寄存器。定义在下面,但是我疑惑的是为什么要把结构体成员定义为16位的,这样还要定义一个无意义的RESERVEDx来占位。为什么不直接定义为32位的呢?比如定义为__IO uint32_t SR;__IO uint32_t DR;...亲测强制转换为32位的可以使用。
顺便问一下这些定义的RESERVEDx会不会被优化掉?会不会占程序存储器空间?
typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USART_TypeDef;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
Shadow2020
1楼-- · 2019-07-14 21:08
同问
he07413
2楼-- · 2019-07-14 21:50
 精彩回答 2  元偷偷看……
我会告诉你真名
3楼-- · 2019-07-15 01:33
这是因为芯片设计的时候确定了寄存器的地址,Reserved那些地址没有用到,这样定义结构体用户就不会去操作那些保留的地址,希望可以帮到你

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

即刻出发2017
4楼-- · 2019-07-15 05:00
指针指向的地址作为一个结构体

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

monsoonjhm
5楼-- · 2019-07-15 06:58
回帖是美德,赚分是传统
进击的生菜
6楼-- · 2019-07-15 11:07
学习了  虽然学过32  但理解很浅显  仅限使用

一周热门 更多>