帮我写一个判断stm32芯片等待PLL作为系统时钟成功的代码
时间: 2024-01-14 14:05:03 浏览: 79
以下是一个简单的代码示例:
```
// 等待PLL作为系统时钟成功
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {
// 等待PLL稳定
if ((RCC->CR & RCC_CR_PLLRDY) == RCC_CR_PLLRDY) {
// 将PLL作为系统时钟
RCC->CFGR |= RCC_CFGR_SW_PLL;
}
}
```
解释:
1. `RCC`是STM32中的时钟控制寄存器,可以用来控制系统时钟源和频率等。
2. `RCC_CFGR_SWS`是系统时钟选择位,表示当前系统时钟源。
3. `RCC_CFGR_SW_PLL`是将PLL作为系统时钟源的掩码。
4. `RCC_CR_PLLRDY`是PLL稳定位,表示PLL已经稳定并可以使用。
5. 代码中的while循环会一直等待,直到PLL成为系统时钟源。
6. 在循环中,首先检查当前系统时钟源是否为PLL,如果不是,就继续等待。
7. 如果当前PLL已经稳定,就将其作为系统时钟源。
8. 最后,等待PLL稳定和系统时钟源切换需要一定的时间,因此可能需要在等待过程中添加适当的延迟。
相关问题
帮我配置STM32芯片系统时钟为168MHZ代码
以下是配置STM32芯片系统时钟为168MHZ的代码:
```c
#include "stm32f4xx.h"
int main(void)
{
//使能HSE时钟
RCC->CR |= RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSERDY) == 0); //等待HSE时钟稳定
//配置PLL时钟
RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; //PLL时钟源选择HSE
RCC->PLLCFGR |= (8 << RCC_PLLCFGR_PLLM_Pos); //PLL输入时钟分频系数为8
RCC->PLLCFGR |= (168 << RCC_PLLCFGR_PLLN_Pos); //PLL倍频系数为168
RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLP_Msk | RCC_PLLCFGR_PLLP_1); //PLL输出时钟分频系数为2
RCC->PLLCFGR |= RCC_PLLCFGR_PLLQ_3; //PLL时钟输出FCLK_Q分频系数为7
//使能PLL时钟
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0); //等待PLL时钟稳定
//配置FLASH读取延迟和预取指数
FLASH->ACR |= FLASH_ACR_LATENCY_5WS;
FLASH->ACR |= FLASH_ACR_PRFTEN;
//配置系统时钟为PLL时钟
RCC->CFGR |= RCC_CFGR_SW_PLL;
while((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL); //等待系统时钟切换完成
//配置AHB时钟为168MHZ
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
//配置APB1时钟为42MHZ
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
//配置APB2时钟为84MHZ
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
//其他配置
SystemCoreClockUpdate(); //更新系统时钟变量SystemCoreClock
//其他初始化代码
while(1);
}
```
上述代码中,首先使能HSE时钟,并等待其稳定;然后配置PLL时钟,包括选择PLL时钟源、输入时钟分频、倍频系数、输出时钟分频和时钟输出FCLK_Q分频等;接着使能PLL时钟,并等待其稳定;然后配置FLASH读取延迟和预取指数;再将系统时钟切换为PLL时钟,并等待切换完成;最后根据168MHZ时钟频率配置AHB、APB1和APB2时钟分频系数,并更新系统时钟变量SystemCoreClock。
需要注意的是,上述代码只适用于STM32F4系列芯片,其他系列芯片的时钟配置可能有所不同。另外,如果需要使用外部晶体振荡器作为时钟源,需要将上述代码中的RCC_PLLCFGR_PLLSRC_HSE改为RCC_PLLCFGR_PLLSRC_HSE_PREDIV。
帮我配置STM32芯片系统时钟为168MHZ代码,先使能HSI
RCC->CR |= RCC_CR_HSION; // 使能HSI
while((RCC->CR & RCC_CR_HSIRDY) == 0); // 等待HSI稳定
RCC->CR &= ~RCC_CR_PLLON; // 关闭PLL
while((RCC->CR & RCC_CR_PLLRDY) != 0); // 等待PLL关闭
RCC->PLLCFGR = (RCC->PLLCFGR & ~RCC_PLLCFGR_PLLM) | (8 << RCC_PLLCFGR_PLLM_Pos); // 设置PLL输入分频为8
RCC->PLLCFGR = (RCC->PLLCFGR & ~RCC_PLLCFGR_PLLN) | (168 << RCC_PLLCFGR_PLLN_Pos); // 设置PLL倍频为168
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLP; // 设置PLL输出分频为2
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLSRC; // 设置PLL输入时钟源为HSI
RCC->CR |= RCC_CR_PLLON; // 使能PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0); // 等待PLL稳定
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // 设置AHB时钟分频为1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; // 设置APB2时钟分频为2
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; // 设置APB1时钟分频为4
RCC->CFGR |= RCC_CFGR_SW_PLL; // 选择PLL作为系统时钟源
while((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL); // 等待PLL作为系统时钟源稳定
SystemCoreClock = 168000000; // 更新系统时钟频率
阅读全文