一、单片机时钟特点:
1.系统都需要时钟--本质用于同步
2.高级单片机中存在不同频率的时钟---系统支持时钟分频、倍频,以及开关时钟的功能
二、STM32时钟树
STM32F103系列时钟最高可达72MHz。系统时钟包含内部时钟、外部时钟。
内部时钟是在芯片内部集成的,无需额外的硬件就可以使用,降低成本,但缺点是时钟精度要差一点。
外部时钟需要在芯片外部添加一个外部时钟电路,成本要高一点,精度会高一点,但会占据PCB面积。
低速时钟通常用于:RTC,看门狗,它们不需要很快速率。
高速时钟为系统提供时钟。
注:倍频只能产生倍频器中倍频数。
三、时钟源
Stm32的4个时钟源:
HSE:高速外部时钟,如4~16M Hz时钟源
HSI:高速内部时钟,如8M Hz时钟源
LSE:低速外部时钟,如32.768k Hz时钟源
LSI:低速内部时钟,如40K Hz时钟源
1)高速时钟:
我们可以使用HSE或者HSI高速时钟源作为系统时钟源。
如果由内部HSI作为时钟源,系统SYSCLK最高只能达到64MHz;
如果由外部HSE作为时钟源,系统SYSCLK最高只能达到72MHz。
2)低速时钟:
如果没有配置LSE,即OSC32_IN/OUT引脚悬空,则工具上LSE就配置成disable,这样就要用上LSI,它为RT、WATCHDOG提供时钟源。
3)外设中线之APB1&APB2
APB1的时钟频率限定最高频率为36Mhz, APB2的时钟最高频率可达72Mhz。
四、时钟配置源码
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
step1:时钟源的配置
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; //HSE作为系统时钟源
RCC_OscInitStruct.HSEState = RCC_HSE_ON; //打开HSE
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; // HSE的分频值,这里是1分频
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // HSI状态,默认是打开,但我们没有用它
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // PLL倍频器打开
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL对HSE倍频
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍倍频。8Mx9=72Mhz
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) // 正式设置上述配置让其生效
{
Error_Handler();
}
step2:各总线(时钟使用者)配置
/** Initializes the CPU, AHB and APB buses clocks */ //使用时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
//对HCLK,SYSCLK,PCLK1, PCLK2进行设置
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //时钟源72Mhz
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 1分频
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; //2分频
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //1分频
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) // 正式设置上述配置让其生效
{
Error_Handler();
}
}
[参考:百问网(www.100ask.net)]