|

楼主 |
发表于 2021-10-6 14:24:22
|
显示全部楼层
/*
**************************************************************************************************************************************
* 函 数 名: SystemClock_Config
* 功能说明: 初始化系统时钟
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 400000000 (CPU Clock)
* HCLK(Hz) = 200000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 160
* PLL_P = 2
* PLL_Q = 4
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* 形 参: 无
* 返 回 值: 无
**************************************************************************************************************************************
*/
void SystemClock_Config(void) /*系统时钟配置 */
{
uint16_t retry=0; /*晶振为25M,推荐值:plln=160,pllm=5,pllp=2,pllq=4. */
uint32_t PLLM = 5; /*PLL1分频系数初始化 */
uint32_t PLLN = 160; /*PLL1倍频系数初始化 */
uint32_t PLLP = 2; /*PLL1外设时钟初始化给内核 */
uint32_t PLLR = 2; /*PLL1实际没有用到 */
uint32_t PLLQ = 4; /*PLL1分频给FMC使用 */
PWR->CR3 &= ~PWR_CR3_SCUEN; /*SCUEN=0,锁定LDOEN和BYPASS位的设置 */
PWR->D3CR |= PWR_D3CR_VOS; /*VOS=3,Scale1,1.15~1.26V内核电压, */
while((PWR->D3CR&PWR_D3CR_VOSRDY)==0){}; /*等待电压稳定 */
RCC->CR |=RCC_CR_HSEON; /*HSEON=1,开启HSE */
while(((RCC->CR&RCC_CR_HSERDY)==0)&&(retry<0X7FFF)) /*等待HSE RDY */
{
retry++; /*计算HSE稳定时间 */
}
if(retry!=0X7FFF)
{
RCC->PLLCKSELR |= RCC_PLLCKSELR_PLLSRC_HSE; /*PLLSRC[1:0]=10,选择HSE作为PLL的输入时钟源 */
RCC->PLLCKSELR |= PLLM<<RCC_PLLCKSELR_DIVM1_Pos; /*DIVM1[5:0]=pllm,设置PLL1的预分频系数 */
RCC->PLL1DIVR |= (PLLN-1)<<RCC_PLL1DIVR_N1_Pos; /*DIVN1[8:0]=plln-1,设置PLL1的倍频系数,设置值需减1 */
RCC->PLL1DIVR |= (PLLP-1)<<RCC_PLL1DIVR_P1_Pos; /*DIVP1[6:0]=pllp-1,设置PLL1的p分频系数,设置值需减1 */
RCC->PLL1DIVR |= (PLLQ-1)<<RCC_PLL1DIVR_Q1_Pos; /*DIVQ1[6:0]=pllq-1,设置PLL1的q分频系数,设置值需减1 */
RCC->PLL1DIVR |= (PLLR-1)<<RCC_PLL1DIVR_R1_Pos; /*DIVR1[6:0]=pllr-1,设置PLL1的r分频系数,设置值需减1, */
RCC->PLLCFGR |= RCC_PLLCFGR_PLL1FRACEN ; /*PLL1小数锁存使能 */
RCC->PLLCFGR |= RCC_PLLCFGR_PLL1RGE_2; /*PLL1RGE[1:0]=2,PLL1输入频率在4~8Mhz之间(25/5=5Mhz) */
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLL1VCOSEL; /*PLL1VCOSEL=0,PLL1宽的VCO范围,192~836Mhz */
RCC->PLLCFGR |= RCC_PLLCFGR_DIVP1EN; /*DIVP1EN=1,使能pll1_p_ck */
RCC->PLLCFGR |= RCC_PLLCFGR_DIVQ1EN; /*DIVQ1EN=1,使能pll1_q_ck */
RCC->PLLCFGR |= RCC_PLLCFGR_DIVR1EN; /*DIVR1EN=1,使能pll1_r_ck */
RCC->CR |= RCC_CR_PLL1ON; /*PLL1ON=1,使能PLL1 */
while((RCC->CR&RCC_CR_PLL1RDY)==0); /*PLL1RDY=1,等待PLL1准备好 */
RCC->CFGR |= RCC_CFGR_SW_PLL1<<0; /*SW[2:0]=3,系统时钟(sys_clk)选择来自pll1_p_ck,即400Mhz*/
RCC->D1CFGR &=~RCC_D1CFGR_D1CPRE; /*D1CPRE[2:0]=0,sys_d1cpre_ck=sys_clk/1=400Mhz, */
RCC->D1CFGR |= RCC_D1CFGR_HPRE_DIV2; /*HREF[3:0]=8,AHB1/2/3/4=sys_d1cpre_ck/2=200Mhz, */
while(1)
{
retry=(RCC->CFGR&RCC_CFGR_SWS)>>3; /*获取SWS[2:0]的状态,判断是否切换成功 */
if(retry==RCC_CFGR_SW_PLL1)break; /*成功将系统时钟源切换为pll1_p_ck */
}
FLASH->ACR &=~FLASH_ACR_LATENCY; /*寄存器清零 */
FLASH->ACR |= FLASH_ACR_LATENCY_4WS; /*LATENCY[2:0]=4个等待周期(@VOS1 Level,maxclock=210Mhz)*/
FLASH->ACR |= FLASH_ACR_WRHIGHFREQ_3; /*WRHIGHFREQ[1:0]=2,flash访问频率<385Mhz */
RCC->D1CFGR |= RCC_D1CFGR_D1PPRE_2; /*D1PPRE[2:0]=4,rcc_pclk3=hclk3/2=100Mhz,APB3=100Mhz */
RCC->D2CFGR |= RCC_D2CFGR_D2PPRE1_2; /*D2PPRE1[2:0]=4,rcc_pclk1=hclk1/2=100Mhz,APB1=100Mhz */
RCC->D2CFGR |= RCC_D2CFGR_D2PPRE2_2; /*D2PPRE2[2:0]=4,rcc_pclk2=hclk1/2=100Mhz,即APB2=100Mhz*/
RCC->D3CFGR |= RCC_D3CFGR_D3PPRE_2; /*D3PPRE[2:0]=4,rcc_pclk4=hclk4/2=100Mhz,即APB4=100Mhz */
/*使用IO的高速模式,要使能IO补偿 */
RCC->CR |= RCC_CR_CSION ; /*使能CSI clock */
RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN; /*使能SYSCFG clock */
SYSCFG->CCCSR |= SYSCFG_CCCSR_EN; /*EN=1,使能IO补偿单元 */
/*AXI SRAM的时钟自动使能,而D2域的SRAM要单独使能 */
RCC->AHB2ENR |= RCC_AHB2ENR_D2SRAM1EN; /*D2域的SRAM1使能 */
RCC->AHB2ENR |= RCC_AHB2ENR_D2SRAM2EN; /*D2域的SRAM1使能 */
RCC->AHB2ENR |= RCC_AHB2ENR_D2SRAM3EN; /*D2域的SRAM1使能 */
}
}
这是完整的时钟初始化程序,供电是DC-DC 12V到5V给核心板供电,有一款同样是0.8m V版核心板是刚换代时候买的测试没有任何问题,新买的核心板是九月买的,发现有这问题 |
|