原创 STM32如何使用内部HSI作为PLL的系统时钟源

2013-7-30 12:17 10599 20 24 分类: MCU/ 嵌入式

首先,必须屏弊掉库函数部分,因为此部分在启动文件中,先于main函数启动。

void SystemInit (void)
{
#if 0
  /*!< RCC system reset(for debug purpose) */
  /*!< Set HSION bit 复位值是83H   内部8M*/    
  RCC->CR |= (uint32_t)0x00000001;  
  /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
  RCC->CFGR &= (uint32_t)0xF8FF0000; 
  /*!< Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  /*!< Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
  /*!< Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
  /*!< Disable all interrupts */
  RCC->CIR = 0x00000000;
   
  /*!< Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /*!< Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();
#endif
}

 

屏蔽上面函数后,配置时钟源:

void RCC_Configuration(void)
{
  RCC_DeInit();
 
  RCC_HSICmd(ENABLE);
 
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  {
 
  } 
 
  if(1)
  { 
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  
   FLASH_SetLatency(FLASH_Latency_2);
  
   RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB时钟为系统时钟SYSCLK
  
   RCC_PCLK2Config(RCC_HCLK_Div1);  //APB1时钟为HCLK/2,其中HCLK为AHB时钟
  
   RCC_PCLK1Config(RCC_HCLK_Div2);  //APB2时钟为HCLK
  
   //设置 PLL 时钟源及倍频系数
  
   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);
  
   //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
  
   RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
  
   //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
  
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
   {
  
   }
   //设置系统时钟(SYSCLK) 设置PLL为系统时钟源  
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   //等待PLL成功用作于系统时钟的时钟源
     
   // 0x00:HSI 作为系统时钟
  
   // 0x04:HSE作为系统时钟
  
   // 0x08:PLL作为系统时钟
  
   while(RCC_GetSYSCLKSource() != 0x08)
   {
  
   }
  
   }
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
        RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
  
//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);
  
//   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}

然后在主函数调用就OK了。

文章评论4条评论)

登录后参与讨论

用户377235 2015-7-21 16:37

在有强抖动的地方有用,晶振不抗摔

用户1510704 2013-12-26 14:47

我测试过,的确能用!顶起!

用户562915 2013-10-2 09:26

没什么优势,只是省了一个外部晶振罢了

zhangtaibin209_962839323 2013-9-29 08:52

STM32 用内部HSI 做为系统时钟,有什么优势么
相关推荐阅读
用户562915 2013-10-02 09:33
android学习:android:padding和android:layout_margin区别
android:padding / android:layout_margin区别: android:padding 是指该view里面的内容与view边界的距离,例如TextView里...
用户562915 2013-10-02 09:32
android学习:android:gravity和android:layout_Gravity的区别
android:gravity / android:layout_Gravity区别: android:gravity 是设置该view里面的内容相对于该view的位置...
用户562915 2013-10-02 09:28
Android特效 五种Toast详解
 Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。 1.默认效果: ...
用户562915 2013-08-11 14:25
STM32(Cortex-M3)中的优先级概念
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可...
用户562915 2013-07-29 10:43
keil 未调用函数出现警告的去除办法
按下图设置,Warning->Disable Warning Number为16, 同时,Misc Control输入相关字符数字     ...
我要评论
4
20
关闭 站长推荐上一条 /2 下一条