我使用 STM32 系列微 Controller ,更具体地说是 STM32F7
系列。目前我正在研究通用计时器的使用。
关于双缓冲寄存器。
微 Controller 有时会使用双缓冲寄存器。这样,软件就可以对寄存器进行写入和读取,而不会造成麻烦。下图说明:
buffered register: active register:
-------------- --------------
| REGX_BUF | <-------> | REGX |
-------------- --------------
| |
| |
SOFTWARE HARDWARE
The software interacts Updates to and from the
only with the buffered active register take place
register. at specific moments (when it
is 'safe').
synonyms: synonyms:
- buffered register - active register
- preload register
- shadow register (?)
上图中REGX_BUF
和REGX
都有几个术语。
- 通常寄存器
REGX
被称为“事件寄存器”。 - 寄存器
REGX_BUF
有时也称为“缓冲寄存器”。其他术语是“预加载寄存器”和“影子寄存器 (?)”。
解释了困惑。
不幸的是,“影子寄存器”一词令人困惑。根据我从互联网上的几个来源阅读的内容,它指的是 REGX_BUF
。但在 STM32F746 微 Controller 的引用手册 RM0385 和 STM32F767 微 Controller 的 RM0410 中,我偶然发现了对“影子寄存器”这个术语的完全相反的解释。它不会引用 REGX_BUF
,而是引用 REGX
。
这是引用手册中的图片:
RM0385 -> chapter 23 General-purpose timers -> 23.3.2 Counter modes -> Fig 199
或
RM0410 -> Chapter 26 General-purpose timers -> 26.3.2 Counter modes -> Fig 244
这个数字让我很困惑。是我对“影子寄存器”一词的理解有误,还是意法半导体在编写本引用手册时犯了错误?
最佳答案
问题在于术语“影子寄存器”没有特定的和架构独立的含义。
例如,ARM 架构有一组通用寄存器,您可以写入和读取 (R0 - R12)。但是,如果进入中断处理程序上下文,R8 - R12 会切换到“影子寄存器”。这意味着您仍然可以像在普通程序中一样对它们进行寻址,但是您访问的寄存器与您在普通程序中使用的 R8 - R12 完全不同。它们是专用的中断处理资源,因此您不必像往常一样处理保存和恢复寄存器。
一些 PIC 微 Controller 允许您对引脚 I/O 的同一地址进行写入和读取,但实际上,您写入的缓冲区与读取的缓冲区不同,因为写入引脚不一定会改变它们的立即声明。此配置允许架构在等待更改引脚状态时缓冲您的写入请求。这些额外的缓冲区有时也称为影子寄存器,看起来与您的示例相似。使用您的示例中给出的术语,我想这将被称为“预加载寄存器”。
通常,该术语用于指代您可以以相同方式处理的多个硬件资源。其中哪个是“真实”寄存器,哪个是“影子”寄存器在架构和供应商之间并不一致,最终也可能不是很重要。
关于microcontroller - STMicro 是否错误地解释了术语 "shadow register"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41812800/