stm32f4调用内部时钟(完整代码)

最近做毕业设计,突然发现自己的外部时钟不准确了,更换了晶振,也更换了芯片,都没得到解决,一怒之下打算用stm32内部时钟,本来以为很麻烦,其实修改起来很简单,把方法给大家分享!亲自测试有效!

首先找到自己的时钟配置文件(.c文件)

点进去,找到下面这几行代码

stm32f4调用内部时钟(完整代码)_第1张图片 

在它们后面粘贴如下代码:

void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)	
{
  __IO uint32_t HSIStartUpStatus = 0;
	
	// 把RCC外设初始化成复位状态
  RCC_DeInit();
  
  //使能HSI, HSI=16M
	RCC_HSICmd(ENABLE);
	
  // 等待 HSI 就绪
	HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
	
	// 只有 HSI就绪之后则继续往下执行
  if (HSIStartUpStatus == RCC_CR_HSIRDY)
  {
    // 调压器电压输出级别配置为1,以便在器件为最大频率
		// 工作时使性能和功耗实现平衡
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;
		
		// HCLK = SYSCLK / 1
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		
		// PCLK2 = HCLK / 2
		RCC_PCLK2Config(RCC_HCLK_Div2);
		
		// PCLK1 = HCLK / 4
		RCC_PCLK1Config(RCC_HCLK_Div4);
		
    // 如果要超频就得在这里下手啦
		// 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,
		//  设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q
		RCC_PLLConfig(RCC_PLLSource_HSI, m, n, p, q);
		
		// 使能PLL
		RCC_PLLCmd(ENABLE);
  
	  // 等待 PLL稳定
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }   

/*-----------------------------------------------------*/
    //开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
//    PWR->CR |= PWR_CR_ODEN;
//    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
//    {
//    }
//    PWR->CR |= PWR_CR_ODSWEN;
//    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
//    {
//    }      
    // 配置FLASH预取指,指令缓存,数据缓存和等待状态
    FLASH->ACR = FLASH_ACR_PRFTEN 
		            | FLASH_ACR_ICEN 
		            |FLASH_ACR_DCEN 
		            |FLASH_ACR_LATENCY_5WS;
/*-----------------------------------------------------*/
		
		// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { // HSI启动出错处理
    while (1)
    {
    }
  }
}

再找到时钟配置对应的 .h 文件 

在里面添加一句进行声明:

void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)	;

 然后在main文件里面如下位置加上配置的数值,这个数值正好是168MHZ,和stm32407的主频相同

int main(void)
{ 
  HSI_SetSysClock(16, 336, 2, 7); 
}

然后我们就完成了调用stm32内部时钟的任务,后面不管是点灯还是生成PWM波都验证了确实是168MHZ 的频率

ps:很多人说内部时钟会有影响,但是我目前没有发现,外部晶振有问题的小伙伴可以放心使用内部时钟~~

 

你可能感兴趣的:(stm32,单片机)