本帖最后由 强仔00001 于 2015-1-7 16:02 编辑
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 其实是四个时钟源,如下图所示(红色方框),PLL是由锁相环电路倍频得到PLL时钟。 如下图: ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI、HSE。理论倍频,一般不要输出频率最大不要超过84MHz,本人测试可以将内核时钟频率超到144M,建议大家不要超得太大,否则锁相环倍频的过程会失败的,而且超过84M可能出现运行不稳定的情况,建议大家还是最大输出到84M,如果大家的项目对单片机的处理速度要求较高的,可以超频。但不要超得太高。 STM32F401的时钟系统结构图 另外,STM32还可以选择一个时钟信号输出到MCO1脚(PA8)和MCO2脚(PC9)上,可以选择为PLL输出的1~5分频、HSI、HSE、或者系统时钟。 板子外部晶振的连接处默认是打断的,如下图画着红色方框的地方: 所以大家如果要用上外部高速晶体时,就要焊接上两个电容和两个0欧姆电阻。具体的位置如下图画着红色方框的地方,c33和c34的地方是焊接电容的: 这里需要提醒一下电容的选择,电容最好选择20pf到33pf,最好选择大一些的吧,以免在初始化时钟时外部晶振起不了振。这里我选择了电容是30pf,而那两个0欧姆的地方,我直接用焊锡连上了,大家懒的话就可以直接焊锡,因为这些电容,电阻的封装是0603的,这个比较难焊接,由于没有0603封装的电容,我这里就用了0805的来焊接。在晶振的地方,我焊接了圆孔的圆排母,这是为了以后方便更换晶振。下图就是我焊接好外部晶振的图: 下面我就开始来介绍用st公司的库函数来配置时钟吧,我是用外部晶振通过PLL模块把时钟倍频到自己所需的频率。然后通过PA8输出外部晶振的频率,PC9输出系统时钟频率的二分频来验证时钟设置是否正确。 }在这里有点需要提醒大家的是,如果你接上晶振时,需要修改一下头文件stm32f4xx.h里的HSE_VALUE的值,我这里的晶振接的是12M的,所以这个数值我改成了12000000,以此来告诉编译器我选的晶振是12M的。
下面就是时钟输出的配置: - void System_Clk_Output_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOC的时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择管脚号
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置管脚的速度
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置管脚位复用功能
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//设置管脚位推完输出
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化管脚
-
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_MCO);//打开GPIOC_Pin_9的MCO功能
- RCC_MCO2Config(RCC_MCO2Source_SYSCLK,RCC_MCO2Div_2);//设置GPIOC_Pin_9输出系统时钟频率的二分频
- }
- void HSE_Clk_Output_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA的时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择管脚号
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;// 设置管脚的速度为100M
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置管脚位复用功能
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//设置管脚位推完输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化管脚
-
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_MCO);//打开GPIOA_Pin_9的MCO功能
- RCC_MCO1Config(RCC_MCO1Source_HSE,RCC_MCO2Div_1);//设置GPIOA_Pin_8输出外部高速晶振HSE的频率
-
- }
复制代码以上这两个函数是配置PA8和PC9管脚为MCO模块。
在主函数中直接调用函数就可以了。 - int main()
- {
- //System_HSE_Init();
- Clock_Config();
- SystemCoreClockUpdate();
- System_Clk_Output_Init();
- HSE_Clk_Output_Init();
- while(1)
- {
-
- }
- }
复制代码以下就是我仿真时通过SystemCoreClockUpdate();(刷新系统时钟的函数),可以看到时钟已经设置为84M了 以下就是我用PA8输出HSE的频率和PC9输出系统时钟频率的二分频,用示波器观察频率如下图:
stm32f401Necleo的管脚分布图 这个图是系统时钟频率超频到120M,然后用PC9输出系统时钟频率的二分频,用示波器观察: 附上源代码: |