STM32学习之路--初始化系统时钟


在 STM32F429 中,有 个最重要的时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。 

LSI 是低速内部时钟, RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。

LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。 这个主要是 RTC 的时钟源。 

HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~26MHz。 

HSI 是高速内部时钟, RC 振荡器, 频率为 16MHz。 可以直接作为系统时钟或者用作 PLL输入。

 

如果外部晶振选择 25MHz。同时我们设置相应的分频器 M=25,倍频器倍频系数 N=360,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:

PLL=25MHz * N/ (M*P)=25MHz* 360 /(25*2) = 180MHz 。

如果我们选择 HSE 为 PLL 时钟源,同时 SYSCLK 时钟源为 PLL,那么 SYSCLK 时钟为 180MHz。 

 

 



 

1. 在“Template_0”文件夹下建立“Drivers”文件夹,用于存放驱动代码

 

2. 在“Drivers”文件夹下新建“M429_SysTick.h”和"M429_SysTick.c" ,将"M429_SysTick.c"文件添加到“Drivers”分组中

 

 3. 打开“Options for Target ‘Target 1’” => C/C++,添加“..\Drivers”为包含目录

 

4. SystickInit函数定义:

 1 int M429_SystickInit(uint32_t plln,uint32_t pllm,uint32_t pllp,uint32_t pllq)
 2 {
 3     HAL_StatusTypeDef ret = HAL_OK;
 4     RCC_OscInitTypeDef RCC_OscInitStructure; 
 5     RCC_ClkInitTypeDef RCC_ClkInitStructure;
 6     
 7     __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
 8     
 9     //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作
10     //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,
11     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
12     
13     RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
14     RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
15     RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
16     RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
17     RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
18     RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  
19     RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
20     RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
21     ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
22     
23     if(ret!=HAL_OK) while(1);
24     
25     ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
26     if(ret!=HAL_OK) while(1);
27     
28     //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
29     RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
30     RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
31     RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
32     RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
33     RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
34     ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
35         
36     if(ret!=HAL_OK) while(1);
37     
38     return ret;
39 }

 

5. 使用 HAL 库配置 STM32F429 时钟系统的一般步骤:

5.1 使能 PWR 时钟

1 __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

之所以要使能 PWR 时钟,是因为后面的步骤中“设置调节器输出电压级别”以及“开启 Over-Driver 功能”都是电源控制相关配置,所以必须开启 PWR 时钟 。

5.2 设置调压器输出电压级别

1 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1

调压器输出电压级别 VOS,它是由 PWR->CR 的位 15:14 来确定的:

 

 

如果希望系统时钟为180M,则需要设置电压级别1,且开启 Over-Driver 功能。

5.3 初始化RCC振荡器

 1     RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
 2     RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
 3     RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
 4     RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
 5     RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
 6     RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  
 7     RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
 8     RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
 9     ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
10     
11     if(ret!=HAL_OK) while(1);

5.4 选择开启 Over-Driver 功能。

1     ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
2     if(ret!=HAL_OK) while(1);

5.5 初始化CPU,AHB和APB总线时钟。

1     //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
2     RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
3     RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
4     RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
5     RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
6     RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
7     ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
8         
9     if(ret!=HAL_OK) while(1);

 









免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM