为什么stm32宏定义的结构体成员是16位的?
大家都知道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;
小编可以再看看STM32的数据手册关于USART这一章中的寄存器定义,因为STM32是32位单片机,所以ST公司设计这款单片机时,所有的寄存器会填充为32位,但是有的寄存器根本用不到32位这么多,比如正如小编所提到的,这些寄存器只占用了低16位,高16位被强制舍弃,即使你写了32的数据上去,人家也会自动剔除高16位,将你写的数据的低16位赋值到寄存器的低16位,程序中的结构体之所以这样写,其实就是为了和硬件结构相对应,你也可以自行写成32位是没有问题的。望小编采纳!祝小编早日掌握STM32!
同问
可能仅仅是为了看结构体的时候可以很清晰的明白有哪几个寄存器,位宽,有哪些没被使用而被保留了。
补充内容 (2017-8-2 14:00):
另外有些寄存器的高16位用不到,手册上可能会建议请保持默认值。如果用32位去操作的话,会容易不小心修改高位内容。
这是因为芯片设计的时候确定了寄存器的地址,Reserved那些地址没有用到,这样定义结构体用户就不会去操作那些保留的地址,希望可以帮到你
指针指向的地址作为一个结构体
回帖是美德,赚分是传统
学习了 虽然学过32 但理解很浅显 仅限使用
你看USART->DR寄存器有效的只有9位,可是还是设置了16位的数据类型,感觉不像是为了保护,再说我们大多数时候都是用的ST库,ST库已经对寄存器有保护机制了,设成32位的也没有什么问题吧。会不会有特别的什么原因呢?
保留的内容和寄存器表上的内容并没有完全对应,您可以对照定义和寄存器表查看一下。
指针指向的地址上的内容作为一个结构体,这个我自然是理解的,要不然也不会有这个问题。
大家似乎对这个结构体在程序存储器上占用的空间并不感兴趣啊,有没有懂编译原理的大神来指点一下呢?
回头一想,哪来的9位的数据类型,真是愚蠢!
似乎就是为了16位对应!
不好意思,我参与过芯片寄存器头文件的制作,如果你仔细看,是对应起来的,有些地址保留,这个与芯片设计者有关。
谢谢您的帮助
不客气,多交流共同进步嘛