为什么MCU寄存器中与逻辑相关的位字段通常位于不同的位置?


9

如果这个问题已经被回答,请原谅我,但是无论是在此页面还是在更广泛的Internet上我都找不到答案。

我是一位经验丰富的开发人员,在底层编程方面拥有丰富的知识,但是对于嵌入式开发而言却相对较新。我一直在自学使用ST-NUCLEO144板进行嵌入式系统开发,该板具有STM32F746ZG MCU。在我看来似乎不是显而易见的一个问题是,为什么寄存器中与逻辑相关的位字段可能位于不同的位置。

一个例子是USART_CR1STM32746ZG上的寄存器。的M0M1位字段一起控制USART TX / RX的字长,的组合的2比特值0b00指定8位,0b01指定9个比特,等等,这是所有相当简单的,不同之处在于M0在第12位和M1在比特28 ...为什么呢?

是否出于遗留设计的原因,例如将新功能插入到先前保留的空间中?是出于与芯片设计相关的原因而我没有考虑,还是出于更大的目的而没有看到?

显然,使用位屏蔽可以克服这个问题,但是我很好奇。


1
特别是在UART的情况下,它是非常古老的技术,因此原因几乎总是向后兼容。UART寄存器位字段经常使用cr脚的名称(导致名称空间冲突)的原因相同。
隆丁

Answers:


13

是否出于遗留设计的原因,例如将新功能插入到先前保留的空间中?

在这种特定情况下(和我见过的类似情况),是的,它可以帮助保持与较旧设备的向后兼容性,并最大程度地减少了已为这些较旧设备编写的(可能经过良好测试和验证/认证)代码的任何更改。因此,如果已经使用了原始寄存器位的相邻位,则新特性和功能(需要新的寄存器位进行控制和配置)必须使用非连续位。

例如,这是USART_CR1旧STM32F1xx系列的寄存器。


STM32F1xx寄存器USART_CR1位的用法

图1. STM32F10xxx USART_CR1寄存器的用法

图片来源:STM32F10xxx系列参考手册RM0008,第27.6.4节


较旧的USART(只有2个字长选项)仅需一个 M即可配置两个选项之间的USART字长,即12位。请注意,位11和13也如何使用,因此不可用于将来的“扩展” 。

如您所说,在较新的STM32F7(例如,还有STM32F4)上,USART现在具有3个字长选项(7、8和9位),因此需要另一个配置位-第12位为M0M1现在为第28位(如上所示,以前保留在STM32F1寄存器映射中)。


STM32F74xxx寄存器USART_CR1位的用法

图2. STM32F74xxx USART_CR1寄存器的用法

图像源:STM32F75xxx和STM32F74xxx系列参考手册RM0385,第31.8.1节


他们不能把新的 M1不移动已经用于其他功能的寄存器位的情况下将位放入寄存器位11或13,并因此消除了与使用它们的现有代码(例如STM32F1)的向后兼容性。

因此,他们试图保持一些向后兼容性,从而导致新的寄存器位被添加到意外的位置。

另一个示例是维护从8250到16550的独立UART的寄存器映射,并在寄存器映射的其他位置添加新的寄存器。


1
非常感谢您抽出宝贵时间指出这一点。也许我应该在问之前先检查一下旧的F系列参考资料。我认为这个故事可能还有更多。
ajxs

1
@ajxs-不客气。我只能从自己的经验谈起(那些旧的UARTS是另一个很好的例子)。总是有可能其他人会有其他相关经验,并且如果问题已经有了可接受的答案,他们可能会因为花时间写答案而推迟。因此,您总是可以“不接受”我的答案,等待(说)一天,让其他人从不同的角度回答,看看您是否觉得他们比我的答案更好?如果不是,那么您总是可以重新接受我的:-)我只是不想让您失去其他潜在的答案观点。
SamGibson

2
看来合理,我接受您的建议!感谢您如此礼貌地提出建议。如果明天没有更好的答案,我会接受你的。再次感谢。
ajxs

5

你是对的

“ ..由于遗留设计原因,例如将新功能插入到先前保留的空间中。”

据我所知,在大多数情况下,位位置本身几乎没有设计影响(在芯片实现中是指)。设计人员通常尝试利用可用的一切。在某些情况下,例如当您尝试扩展宽度等时。

也就是说,在某些情况下,有意将位位置分开。专门针对那些至关重要的位,并且这些位不能通过无意的写操作(由于错误的位置/掩码或为了安全起见而修改)而导致系统最终处于不希望的状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.