用GPIO作为八位数据的并口,之前是连续的GPIO口,比如说GPIOE的高八位或者低八位作为数据的并口,我可以这么写GPIOE->BSRR = 0XFF000000 | (data<<8),这样就可以把八位数据一次性赋值给对应的I/O。
但是现在把硬件上的GPIO分开了,也就是说PE0对应data数据的第0位,PG15对应data数据的第一位等等。那么现在就不能直接一下把八位数据分别给GPIO,需要一位一位的处理,这就出现了BSRR的寄存器用法。
官方手册是这么说的:
位 31:16 BRy: 端口 x 复位位 y (Port x reset bit y) (y = 0..15)
这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
0:不会对相应的 ODRx 位执行任何操作
1:对相应的 ODRx 位进行复位
注意: 如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高
位 15:0 BSy: 端口 x 置位位 y (Port x set bit y) (y= 0..15)
这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
0:不会对相应的 ODRx 位执行任何操作
1:对相应的 ODRx 位进行置位
第一个问题:这些位为只写形式,只能在字、半字或字节模式下访问?
起初我是这么理解的,配置BSRR寄存器必须只能是字、半字或字节的形式,其他的不行。然后我在网上查关于这个信息发现,所谓的访问模式是寄存器本身的属性与怎么配置没有关系!这里涉及到寄存器内存地址是否对齐的知识。那么到底我们给寄存器配置的是字节还是字或者半字呢,我认为应该和编译器有关系,如果强制转换成u8那应该是字节,u16,u32应该和编译器有关系。那么默认到底是什么呢,这个也不太清楚。。