野火STM32学习(10)
作者:互联网
时钟——STM32F407ZGTX
/* system_stm32f4xx.c 中关于时钟配置(setsysclock)的代码---寄存器版 */
static void bsp_SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* HSE 时钟使能 */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* 等待 HSE 时钟就绪后跳出循环或超时*/
do
{
/* HSE 时钟就绪标志存储到 HSEStatus */
HSEStatus = RCC->CR & RCC_CR_HSERDY;
/* 计数器++ */
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
/* 添加标志位 */
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
//使能电源接口时钟
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
//调压器输出电压级别选择1
PWR->CR |= PWR_CR_VOS;
/* 系统时钟不分频 / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
/* APB2 2分频 / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
/* APB1 4分频 / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
/* 配置PLL的/M xN /P /Q */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
/* 使能PLL */
RCC->CR |= RCC_CR_PLLON;
/* 等待PLL配置完成 */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* 配置闪存预取、指令缓存、数据缓存和等待状态 */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
/* 选择PLL作为Syste时钟 */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* 等待PLL用作系统时钟完成 */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}
}
else
{
/* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
/* 自写时钟配置的代码---调用固件库 */
void bsp_SetSysClock(uint32_t PLLM)
{
/* 复位 RCC 寄存器 */
RCC_DeInit();
/* 使能 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 判断 HSE 是否就绪 */
ErrorStatus HSE_ErrorStatus = ERROR;
HSE_ErrorStatus = RCC_WaitForHSEStartUp();
/* 就绪 */
if(HSE_ErrorStatus == SUCCESS)
{
/* 使能电源接口时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* 设置电压输出模式为 mode_1 */
PWR_MainRegulatorModeConfig(PWR_Regulator_Voltage_Scale1);
/* 设置系统时钟分频系数 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB
RCC_PCLK1Config(RCC_HCLK_Div4);//APB1
RCC_PCLK2Config(RCC_HCLK_Div2);//APB2
/* 设置 PLL 分/倍频系数 */
RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, 336, 2, 7);
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
/* 等待 PLL 开启完成 */
}
/* 配置闪存预取 */
FLASH_PrefetchBufferCmd(ENABLE);
/* 指令缓存 */
FLASH_InstructionCacheCmd(ENABLE);
/* 数据缓存 */
FLASH_DataCacheCmd(ENABLE);
/* 等待状态 */
FLASH_SetLatency(FLASH_Latency_5);
/* 选择 PLL 作为 SYSTEM 的时钟 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)
{
/* 等待 PLL 用作系统时钟完成 */
}
}
/* 超时 */
else
{
/* HSE时钟振荡器开启失败后运行的代码 */
}
}
()
标签:10,野火,HSE,CFGR,时钟,STM32,CR,PLL,RCC 来源: https://blog.csdn.net/wu_wen_/article/details/122267150