宏雁张 发表于 2018-10-12 11:01:38

请教各位GPIOx_IDR 的访问方式是半字还是字模式?


我的附件图片里面是STM32的技术手册,其中高16位保留,请教各位GPIOx_IDR 的访问方式是半字还是字模式?

stm1024 发表于 2018-10-12 14:38:57

toofree 发表于 2018-10-12 11:52
STM32的寄存器都是32位的,不是半字,也是不字,而是双字。
GPIOx_IDR同样是双字,只不过高16位是保留位。 ...

讨论一下。关于字和双字的定义问题。

以前我总觉得1字节8位,1字=2字节 双字=2个字。

后来看一个文章,说字和双字是相对于平台的,1个字就是平台通用寄存器的数据宽度,所以对stm32是32bit处理器,它的字是32bit的(一次处理4字节长度的数据)。半字自然就是16bit(2字节)

我现在都有点懵逼了。

stm1024 发表于 2018-10-12 11:18:45

本帖最后由 stm1024 于 2018-10-12 11:19 编辑

这个……打开看一下标准库的编写方式:
/**
* @briefReads the specified GPIO input data port.
* @paramGPIOx: where x can be (A..G) to select the GPIO peripheral.
* @retval GPIO input data port value.
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

return ((uint16_t)GPIOx->IDR);
}
这么看, 读取的时候应该是32位的,字方式。

butterflyspring 发表于 2018-10-12 11:38:05

他的寄存器是32位的,但是有效只有16位,你可以强制转换一下就好


typedef struct
{
__IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
__IO uint32_t OTYPER;   /*!< GPIO port output type register,      Address offset: 0x04      */
__IO uint32_t OSPEEDR;/*!< GPIO port output speed register,       Address offset: 0x08      */
__IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,Address offset: 0x0C      */
__IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
__IO uint32_t ODR;      /*!< GPIO port output data register,      Address offset: 0x14      */
__IO uint32_t BSRR;   /*!< GPIO port bit set/reset register,      Address offset: 0x18      */
__IO uint32_t LCKR;   /*!< GPIO port configuration lock register, Address offset: 0x1C      */
__IO uint32_t AFR;   /*!< GPIO alternate function registers,   Address offset: 0x20-0x24 */
} GPIO_TypeDef;

toofree 发表于 2018-10-12 11:52:51

STM32的寄存器都是32位的,不是半字,也是不字,而是双字。
GPIOx_IDR同样是双字,只不过高16位是保留位。

wudianjun2001 发表于 2018-10-12 12:04:12

32位的,当然是字模式,只不过高位保留没有具体定义而已

toofree 发表于 2018-10-12 18:11:15

本帖最后由 toofree 于 2018-10-15 17:33 编辑

stm1024 发表于 2018-10-12 14:38
讨论一下。关于字和双字的定义问题。

以前我总觉得1字节8位,1字=2字节 双字=2个字。

我也是不懂球的了,懵逼了。

反正我就认为BYTE、WORD、DWORD、QWORD,就是1、2、4、8的关系了。
英文一般不胡来,按字面理解就行了。

处理器位宽不同,是为了区分int型的,除8位机int是16位外,其它的16、32、64机的int型就分别对应各自的位宽度,表示最有效率的处理数据宽度。

feixiang20 发表于 2018-10-14 22:50:47

似乎GPIOx_IDR:这些寄存器位为只读 形式,并且只能在字模式下访问

宏雁张 发表于 2019-1-10 09:52:27

stm1024 发表于 2018-10-12 14:38
讨论一下。关于字和双字的定义问题。

以前我总觉得1字节8位,1字=2字节 双字=2个字。


你好

方便贴一下您看的那篇文章的地址吗?

谢谢

stm1024 发表于 2019-1-10 12:35:41

宏雁张 发表于 2019-1-10 09:52
你好

方便贴一下您看的那篇文章的地址吗?


图书馆看的,一下记不起来了
页: [1]
查看完整版本: 请教各位GPIOx_IDR 的访问方式是半字还是字模式?