c语言 - 为什么STM32 "endwhile"使用tmpreg变量,而不是直接在寄存器中设置位?



这与STM32 pre-HAL "Standard Peripheral Library"…

为什么在以下代码中使用tmpreg(取自ADC函数)?

/* Get the old register value */
tmpreg = ADCx->CR1;

/* Clear the Analog watchdog channel select bits */
tmpreg &= CR1_AWDCH_RESET;

/* Set the Analog watchdog channel */
tmpreg |= ADC_Channel;

/* Store the new register value */
ADCx->CR1 = tmpreg;

为什么不这样做呢?每种方法的优点/缺点是什么?

/* Clear the Analog watchdog channel select bits */
ADCx->CR1 &= CR1_AWDCH_RESET;

/* Set the Analog watchdog channel */
ADCx->CR1 |= ADC_Channel;

谢谢。

使用SPL作为开发自己驱动程序的参考。

您的第一个示例将1写入外围寄存器。2.

它们可能都有效,但它们并不相同。当对寄存器进行一次写操作时,两个更改将自动地同时进行。而选择2则意味着你将改变其中一个选择以及它的所有副作用,然后你将改变另一个选择。它们的顺序可能很重要。

反复向同一个硬件寄存器写入是草率、危险和缓慢的。由于所有硬件寄存器必须是volatile合格的,编译器不能优化对同一寄存器的连续写入。这意味着代码将变得不必要地缓慢,并且可能有副作用,例如第一次写入清除标志等,改变代码的含义。

在您的第一个示例中,所有对tmpreg的写入都将得到优化,并且不会向实际寄存器写入任何内容。当一切都设置好后,寄存器只会在一条指令中被写入一次。这是很好的做法。

在第二个示例中,通过读-修改-写连续访问寄存器2次。它是不必要的缓慢,并可能导致副作用,绝对没有收获。所以这是不好的代码。

也检查如何从固件访问硬件寄存器?

相关内容

  • 没有找到相关文章

最新更新