为什么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条回答
我会告诉你真名
1楼-- · 2019-07-16 05:24
Mrcharacter 发表于 2017-8-2 23:40
保留的内容和寄存器表上的内容并没有完全对应,您可以对照定义和寄存器表查看一下。

不好意思,我参与过芯片寄存器头文件的制作,如果你仔细看,是对应起来的,有些地址保留,这个与芯片设计者有关。
Mrcharacter
2楼-- · 2019-07-16 08:45
我会告诉你真名 发表于 2017-8-3 09:28
不好意思,我参与过芯片寄存器头文件的制作,如果你仔细看,是对应起来的,有些地址保留,这个与芯片设计者有关。

谢谢您的帮助
我会告诉你真名
3楼-- · 2019-07-16 09:29
Mrcharacter 发表于 2017-8-3 19:30
谢谢您的帮助

不客气,多交流共同进步嘛

一周热门 更多>