野火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时钟振荡器开启失败后运行的代码 */
	}
}

()

上一篇:Hi-MD


下一篇:LSHADE-SPACMA:混合CMA-ES半参数自适应LSHADE