这与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次。它是不必要的缓慢,并可能导致副作用,绝对没有收获。所以这是不好的代码。
也检查如何从固件访问硬件寄存器?