我是 STM32 微控制器的新手。我想知道如何在启用 RCC 外设时钟后正确实现 2 个时钟周期的延迟。
https://www.st.com/resource/en/reference_manual/rm0454-stm32g0x0-advanced-armbased-32bit-mcus-stmicroelectronics.pdf的第 5.2.16 节(第 134 页)
使能位具有同步机制,可为外设创建无故障时钟。设置使能位后,时钟激活前会有 2 个时钟周期的延迟,软件必须考虑到这一点。
我偶然发现了下面的解释,它看起来是正确的。
RCC 限制##### 评论部分。
此延迟取决于外设映射。如果外设映射到 AHB 上:在硬件寄存器上设置时钟使能位后,延迟为 2 个 AHB 时钟周期。如果外设映射到 APB 上:在硬件寄存器上设置时钟使能位后,延迟为 2 个 APB 时钟周期。
我看了几个例子。第一个例子中,读回了 RCC 外设时钟使能寄存器。
RCC->AHB1ENR |= (1 << RCC_AHB1ENR_GPIOAEN_Pos);
// do two dummy reads after enabling the peripheral clock, as per the errata
volatile uint32_t dummy;
dummy = RCC->AHB1ENR;
dummy = RCC->AHB1ENR;
第二个例子中,读回外设寄存器。
void clock_wait_bus_cycles(enum bus_type bus, uint32_t cycles)
{
volatile uint32_t unused __attribute__((unused));
if (bus == BUS_AHB) {
while (cycles--)
unused = STM32_DMA1_REGS->isr;
} else { /* APB */
while (cycles--)
unused = STM32_USART_BRR(STM32_USART1_BASE);
}
}
哪一个才是正确的方法?