STMicro 是不是错误地解释了“影子寄存器”一词?

Posted

技术标签:

【中文标题】STMicro 是不是错误地解释了“影子寄存器”一词?【英文标题】:Does STMicro wrongly interpret the term "shadow register"?STMicro 是否错误地解释了“影子寄存器”一词? 【发布时间】:2017-06-08 08:14:48 【问题描述】:

我使用 STM32 系列微控制器,更具体地说是 STM32F7 系列。目前我正在研究通用计时器的使用。

关于双缓冲寄存器。

微控制器有时会使用双缓冲寄存器。这样,软件就可以对寄存器进行写入和读取,而不会造成麻烦。下图说明:

              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_BUFREGX 都有几个术语。

通常注册REGX被称为“活动注册”。 寄存器REGX_BUF 有时称为“缓冲寄存器”。其他术语是“预加载寄存器”和“影子寄存器 (?)”。

解释了混乱。

不幸的是,“影子寄存器”一词令人困惑。从我在互联网上的几个来源阅读的内容来看,它指的是REGX_BUF。但在 STM32F746 微控制器的参考手册 RM0385 和 STM32F767 微控制器的 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

这个数字让我很困惑。是我对“影子寄存器”一词的理解有误,还是意法半导体在编写本参考手册时犯了错误?

【问题讨论】:

到底是什么问题? “X 的影子寄存器”是指“影子”或复制“X”值的寄存器。这张图准确地表明,影子寄存器跟随“自动预加载”的值,有一点时间延迟 从我在几个来源中看到的,“影子寄存器”是“预加载寄存器”的同义词:这是与软件交互的寄存器。 --- “活动寄存器”是与硬件交互的寄存器。 STMicro 手册中的图将术语“影子寄存器”解释为“预加载寄存器”的同义词,而是“活动寄存器”的同义词。所以我很困惑。 electronics.stackexchange.com/questions/86032/… 我知道,我已经阅读了这个问题。正是这个问题将术语“影子寄存器”等同于“预加载寄存器”。所以这与 STMicro 手册的做法相反。 【参考方案1】:

问题在于术语“影子寄存器”没有特定的和架构独立的含义。

例如,ARM 架构有一组通用寄存器,您可以写入和读取 (R0 - R12)。但是,如果进入中断处理程序上下文,R8 - R12 就会切换到“影子寄存器”。这意味着您仍然可以像在普通程序中一样对它们进行寻址,但是您访问的寄存器与您在普通程序中使用的 R8 - R12 完全不同。它们是专用的中断处理资源,因此您不必像往常一样处理保存和恢复寄存器。

一些 PIC 微控制器允许您对引脚 I/O 写入和读取同一地址,但实际上,您写入的缓冲区与读取的缓冲区不同,因为写入引脚不一定会改变它们的立即声明。此配置允许架构在等待更改引脚状态时缓冲您的写入请求。这些额外的缓冲区有时也称为影子寄存器,看起来与您的示例相似。使用您的示例中给出的术语,我想这将被称为“预加载寄存器”。

通常,该术语用于指代您可以以相同方式处理的多个硬件资源。其中哪个是“真实”寄存器,哪个是“影子”寄存器在架构和供应商之间并不一致,最终也可能不是很重要。

【讨论】:

非常感谢。这个答案澄清了这个问题:-)【参考方案2】:

实际上 ST 定义了它的标准:(General Timer Cookbook 的第 14 页)

活动寄存器实例(也称为影子寄存器实例):它的内容是 定时器外设逻辑用于生成定时器通道输出波形。 预加载寄存器实例:这是软件访问的寄存器实例 当相关寄存器的预加载功能启用时。

原始文档为 ST AN4776 Application note - 可以找到here

【讨论】:

【参考方案3】:

我已经总结了以上所有的问题和答案: 微控制器有时会使用双缓冲寄存器。这样,软件就可以对寄存器进行写入和读取,而不会造成麻烦。下图说明:

             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 (?)

在某些手册中,“影子寄存器”是“预加载寄存器”的同义词:这是与软件交互的寄存器。 --- “活动寄存器”是与硬件交互的寄存器。 STMicro 手册中的图将术语“影子寄存器”解释为“预加载寄存器”的同义词,而是“活动寄存器”的同义词。 但是,ST 定义了它的标准:(General Timer Cookbook 第 14 页)

    活动寄存器实例(也称为影子寄存器实例):其内容被定时器外设逻辑用于生成定时器通道输出波形。 预加载寄存器实例:这是当相关寄存器的预加载功能启用时软件访问的寄存器实例。

所以,问题在于术语“影子寄存器”没有特定的和架构独立的含义。通常,该术语用于指代可以以相同方式寻址的多个硬件资源。其中哪个是“真实”寄存器,哪个是“影子”寄存器在架构和供应商之间并不一致,最终也可能不是很重要。

【讨论】:

您好,Narcissus,感谢您的回答。由于我不是微控制器架构方面的专家,因此我不太了解此答案中添加的独特之处。也许如果您在顶部突出显示了独特的方面。例如“我认为将以前的答案整合成更易于理解的东西会很有用。”或者“我认为以前的答案错过了一个有价值的观点。”

以上是关于STMicro 是不是错误地解释了“影子寄存器”一词?的主要内容,如果未能解决你的问题,请参考以下文章

STM32TIM定时器的影子寄存器

影子寄存器,输入捕获和输出比较。

STM32定时器的预装载寄存器与影子寄存器之间的关系

stm32修改PWM频率的同时,占空比不变

使用golang时浏览器错误地解释了xml标签(我认为)

Pandas 计算 ewm 是不是错误?