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

电器工程 微控制器 stm32 嵌入式
2022-01-28 00:14:34

如果这个问题已经得到解答,请原谅我,但我无法在此页面或更广泛的 Internet 上找到答案。

我是一位经验丰富的开发人员,对低级编程有相当的了解,但对嵌入式开发相对较新。我一直在使用 ST-NUCLEO144 板自学嵌入式系统开发,该板具有 STM32F746ZG MCU。对我来说似乎不明显的一个问题是,为什么寄存器中逻辑相关的位字段可能位于不同的位置。

一个例子是USART_CR1STM32746ZG 上的寄存器。和位字段共同控制 USART TX/RX 中的字长M0M1组合的 2 位值0b00指定 8 位,0b01指定 9 位等。这一切都非常简单,除了M0位 12 和M1位28……这是为什么呢?

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

显然,用位掩码克服这一点非常简单,但我只是好奇。

2个回答

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

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

例如,这里是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)的向后兼容性。

所以他们试图保持一些向后兼容性,这导致新的寄存器位被添加到意想不到的地方。

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

你是对的

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

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

话虽如此,但在某些情况下,位位置故意保持相距很远。特别是对于那些可能导致系统最终处于不希望状态的非故意写入(由于错误的位置/掩码,或为了安全而加扰)不可修改的关键位。