为什么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条回答
Mrcharacter
1楼-- · 2019-07-15 13:34
 精彩回答 2  元偷偷看……
Mrcharacter
2楼-- · 2019-07-15 13:36
我会告诉你真名 发表于 2017-8-2 13:30
这是因为芯片设计的时候确定了寄存器的地址,Reserved那些地址没有用到,这样定义结构体用户就不会去操作那些保留的地址,希望可以帮到你

保留的内容和寄存器表上的内容并没有完全对应,您可以对照定义和寄存器表查看一下。
Mrcharacter
3楼-- · 2019-07-15 16:43
即刻出发2017 发表于 2017-8-2 15:51
指针指向的地址作为一个结构体

指针指向的地址上的内容作为一个结构体,这个我自然是理解的,要不然也不会有这个问题。
Mrcharacter
4楼-- · 2019-07-15 20:18
大家似乎对这个结构体在程序存储器上占用的空间并不感兴趣啊,有没有懂编译原理的大神来指点一下呢?
Mrcharacter
5楼-- · 2019-07-15 23:30
Mrcharacter 发表于 2017-8-2 23:39
你看USART->DR寄存器有效的只有9位,可是还是设置了16位的数据类型,感觉不像是为了保护,再说我们大多数时候都是用的ST库,ST库已经对寄存器有保护机制了,设成32位的也没有什么问题吧。会不会有特别的什么原因呢?

回头一想,哪来的9位的数据类型,真是愚蠢!!!
Mrcharacter
6楼-- · 2019-07-16 02:49
 精彩回答 2  元偷偷看……

一周热门 更多>