
[英][USART - STM32F4xx]: How to wait until character arrives on Status Register (USART_SR)?
[英]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.Instance
、 UART2
和UARTX
是如何定义和/或分配的。 huart2.Instance
显然是一个指向 UART 实例的变量,并且可能在某个时候直接或间接分配给 UART 地址。 UART2
和UARTX
必须在某处定义 - 它们可能是常量或宏,可能已分配给在USART2
中定义的 USART2(USART 能够在同步(位时钟)和异步模式下运行)。 我想象UARTX
在代码中定义为特定 UART 的别名,以简化对不同物理 UART 的代码修改。
在这种情况下,按位与操作用于将写入 DR 寄存器的 16 位无符号 integer 的高 7 位设置为零,同时保持低 9 位不变。 在此特定实例中,UART 可能用于 9 位通信,或者第 9 位用于奇偶校验或多处理器寻址。 高 7 位可能被描述为“必须写为零”。 您应该在微控制器的参考手册中找到所有这些内容。
微控制器总线包含表明地址访问是读还是写的电子信号。
三者是等价的,区别在于指向UART外设结构体的指针从何而来。 在第一个 huart2 中是一个结构化变量,它包含指向外围结构的 Instance 指针。 另外两个有指向外围结构的 UART2 和 UARTX 变量。
如果您想了解如何使用 DR 寄存器,您应该获取微控制器的参考手册并阅读与您的外围设备对应的 UART 或 USART 章节。 也可能有应用笔记更详细地解释外设的操作并给出示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.