野火STM32学习(10)
时间:2023-05-03 20:07:00
时钟——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时钟振荡器打开失败后运行的代码 */ } }
()