ARM - STM32 使用11.0592MHz晶振 (1)
- UID
- 1029342
- 性别
- 男
|
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)));
- }
|
|
|
|
|
|