首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM - STM32 使用11.0592MHz晶振 (1)

ARM - STM32 使用11.0592MHz晶振 (1)

这里探究了以下stm32 外部时钟的用法。
这里用的是stm32f103rbt6,usart2,外部晶振11.0592Mhz。
先看时钟树吧


这是上图的配置:
[cpp] view plaincopy

  • void RCC_Init(void)  
  • {  
  •     ErrorStatus      HSEStartUpStatus;  
  •     RCC_DeInit();     
  •     RCC_HSEConfig(RCC_HSE_ON);   //设置外部高速晶振(HSE)
  •     HSEStartUpStatus = RCC_WaitForHSEStartUp();     //等待HSE起振
  •     if(HSEStartUpStatus == SUCCESS)     //SUCCESS:HSE晶振稳定且就绪
  •     {  
  •         RCC_HCLKConfig(RCC_SYSCLK_Div1);  //设置AHB时钟(HCLK),RCC_SYSCLK_Div1——AHB时钟 = 系统时钟
  •         RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2),RCC_HCLK_Div1——APB2时钟 = HCLK
  •         RCC_PCLK1Config(RCC_HCLK_Div2);  //设置低速AHB时钟(PCLK1),RCC_HCLK_Div2——APB1时钟 = HCLK / 2
  •         FLASH_SetLatency(FLASH_Latency_2);    //设置FLASH存储器延时时钟周期数,FLASH_Latency_2  2延时周期
  •         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   // 选择FLASH预取指缓存的模式,预取指缓存使能  
  •         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_2);      
  •             // 设置PLL时钟源及倍频系数,PLL的输入时钟 = HSE时钟频率;RCC_PLLMul_2——PLL输入时钟x 2
  •         RCC_PLLCmd(ENABLE);//使能PLL   
  •         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//检查指定的RCC标志位(PLL准备好标志)设置与否   

  •         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);   
  •             //设置系统时钟(SYSCLK),RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟,11.0592x2
  •         while(RCC_GetSYSCLKSource() != 0x08);     //PLL返回用作系统时钟的时钟源,0x08:PLL作为系统时钟      
  •     }  
  •     RCC_GetClocksFreq(&RCC_ClocksStatus);  
  • }  



这里的配置和上面的时钟树意义对应,下面读取时钟的函数可以得到各种时钟的值了。可以验证一下,你自己推算的对不对了。
[cpp] view plaincopy

  • RCC_GetClocksFreq(&RCC_ClocksStatus);  
  • if (usartxbase == USART1_BASE)  
  • {  
  •   apbclock = RCC_ClocksStatus.PCLK2_Frequency;  
  • }  
  • else
  • {  
  •   apbclock = RCC_ClocksStatus.PCLK1_Frequency;  
  • }  

  • /* Determine the integer part */
  • if ((USARTx->CR1 & CR1_OVER8_Set) != 0)  
  • {  
  •   /* Integer part computing in case Oversampling mode is 8 Samples */
  •   integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));      
  • }  
继承事业,薪火相传
返回列表