繁体   English   中英

STM32F100xx DR 寄存器

[英]STM32F100xx DR Register

该寄存器可用作 UART 的读取或写入数据。 我看到了一些关于这个寄存器的表达,

第一个;

RxBuffer[0] =(uint16_t)(huart2.Instance->DR & (uint16_t)0x01FF); 

& (uint16_t)0x01FF在此代码中是什么意思?

其次,这个寄存器如何理解读或写的区别?

最后,我看到了一些其他的表达方式,

huart2.Instance->DR
UART2->DR
UARTX->DR 

所有这些表达都被用来指代UART2,它们之间有什么区别吗?

& (uint16_t)0x01FF在此代码中是什么意思?

您的USART_DR文档:

在此处输入图像描述

表明它有 9 个定义位[8:0] ,尽管重置值只定义了 8 位——这显然是一个错误,并且与同一手册的其他地方(宽度和重置值)相矛盾: 在此处输入图像描述

掩码 0x1FF 确保在假定的 16 位RxBuffer[0]中仅使用这 9 位,并且[15:9]位全为零。 通常,您会通过 USART/UART 接收 8 位数据,但 STM32 USART 支持 7、8 和 9 位帧。

9 位帧通常用于实现单主/多从总线协议,其中第 9 (MSB) 位指示前面的 8 位是否应解释为地址数据

可能没有必要屏蔽高阶位,因为它们在任何情况下都将为零,但是手册将它们指定为“保留”,因此屏蔽它们可能是非常谨慎的,因为它没有具体说明您可能的价值阅读它们,只是你不应该_修改它们。

其次,这个寄存器如何理解读或写的区别。

有两个独立的物理寄存器——RxDR 是只读的,TxDR 是只写的 由于 R/W 信号选择适当的物理寄存器,因此两个寄存器可以具有相同的地址。 从 USART 框图中可以清楚地看出这一点: 在此处输入图像描述 硬件寄存器不需要像memory那样工作。

最后,我看到了一些其他的表达方式,

 huart2.Instance->DR UART2->DR UARTX->DR

所有这些表达都被用来指代UART2,它们之间有什么区别吗?

可能不是——检查代码会告诉你这一点。 没有看到代码就不能肯定地说。 这取决于huart2.InstanceUART2UARTX是如何定义和/或分配的。 huart2.Instance显然是一个指向 UART 实例的变量,并且可能在某个时候直接或间接分配给 UART 地址。 UART2UARTX必须在某处定义 - 它们可能是常量或宏,可能已分配给在USART2中定义的 USART2(USART 能够在同步(位时钟)和异步模式下运行)。 我想象UARTX在代码中定义为特定 UART 的别名,以简化对不同物理 UART 的代码修改。

  1. 在这种情况下,按位与操作用于将写入 DR 寄存器的 16 位无符号 integer 的高 7 位设置为零,同时保持低 9 位不变。 在此特定实例中,UART 可能用于 9 位通信,或者第 9 位用于奇偶校验或多处理器寻址。 高 7 位可能被描述为“必须写为零”。 您应该在微控制器的参考手册中找到所有这些内容。

  2. 微控制器总线包含表明地址访问是读还是写的电子信号。

  3. 三者是等价的,区别在于指向UART外设结构体的指针从何而来。 在第一个 huart2 中是一个结构化变量,它包含指向外围结构的 Instance 指针。 另外两个有指向外围结构的 UART2 和 UARTX 变量。

如果您想了解如何使用 DR 寄存器,您应该获取微控制器的参考手册并阅读与您的外围设备对应的 UART 或 USART 章节。 也可能有应用笔记更详细地解释外设的操作并给出示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM