OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9750|回复: 4

STM32默认时钟源 以及配置HSE时钟源疑问

[复制链接]

16

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2011-3-30
在线时间
5 小时
发表于 2013-4-6 02:29:51 | 显示全部楼层 |阅读模式
1. 在理3.5库,如果不配置,默认是72M,没有找出默认SYSCLK始终源是什么?
(如果是外置HSE,不同的晶振会影响SYSCLK,感觉应该是内部的;如果是内部的HSI,精度觉得不高,左右两难啊。。。)

2. 板子的外置HSE晶振是8M,如果改成其他的值,例如4M,是否需要修改库里面的:

#if !defined  HSE_VALUE
 #ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 #else 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */   ---改车4000000?
 #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

总觉得改.h文件后面有无数的隐患了?

3. 如果改成外置晶振作为SYSCLK,是不是只要改某处的宏就可以了?

谢谢。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

55

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2018-3-12
在线时间
53 小时
发表于 2018-9-15 18:15:48 | 显示全部楼层
Admin 发表于 2013-4-6 11:01
问题很好。。。
解决的办法,其实也很利于学习。。。

首先,STM32的时钟配置在RCC相关寄存器,尤其是系统 ...

就是说系统初始化的时钟,默认为使用外部的8M作为主频,而不是内部的HSI吗?
回复 支持 1 反对 0

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-4-6 11:01:35 | 显示全部楼层
问题很好。。。
解决的办法,其实也很利于学习。。。

首先,STM32的时钟配置在RCC相关寄存器,尤其是系统时钟的话,在RCC->CFGR寄存器。

所以你可以这样来做:
在串口实验里面,初始化串口之后。
打印:
printf("CFGR=%x\n",RCC->CFGR);
然后对照CFGR寄存器位来看看。。。
这样加深了学习。。。

所以我们默认是用的PLL作为系统时钟,PLL选择HSE作为时钟源。HSE不分频。也就是外部是8M,PLL倍频系数是9,所以是8X9=72
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

16

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2011-3-30
在线时间
5 小时
 楼主| 发表于 2013-4-6 13:01:01 | 显示全部楼层
回复【2楼】Admin:

问题很好。。。
解决的办法,其实也很利于学习。。。
首先,STM32的时钟配置在RCC相关寄存器,尤其是系统时钟的话,在RCC->CFGR寄存器。
所以你可以这样来做:
在串口实验里面,初始化串口之后。
打印:
printf("CFGR=%x\n",RCC->CFGR);
然后对照CFGR寄存器位来看看。。。
这样加深了学习。。。
所以我们默认是用的PLL作为系统时钟,PLL选择HSE作为时钟源。HSE不分频。也就是外部是8M,PLL倍频系数是9,所以是8X9=72

---------------------------------




所以跟这个的作用是一样的:

 void RCC_PLL_Configuration(void) //HSE作为PLL时钟,PLL作为SYSCLK
{
   RCC_DeInit(); /*将外设RCC寄存器重设为缺省值 */
   RCC_HSEConfig(RCC_HSE_ON);   /*设置外部高速晶振(HSE) HSE晶振打开(ON)*/

   if(RCC_WaitForHSEStartUp() == SUCCESS) {  /*等待HSE起振,  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_9);/*设置PLL时钟源及倍频系数*/   
   RCC_PLLCmd(ENABLE);   /*使能PLL */
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的RCC标志位(PLL准备好标志)设置与否*/
   
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  /*设置系统时钟(SYSCLK) */ 
   while(RCC_GetSYSCLKSource() != 0x08);     /*0x08:PLL作为系统时钟 */    
 }
}


呵呵,在SystemInit()里面是直接对寄存器操作的,另外对flash的那两句设置是在  SetSysClock();里面设置的,去对寄存器的值真心麻烦。

另外改外置晶振的值现在想想意义不大,竟然官方配置好8M,没必要自己找麻烦 呵呵
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-4-6 14:11:55 | 显示全部楼层
回复【3楼】tyqhaha:
---------------------------------
这段代码只是让你了解配置过程。加深理解。。。
光只看库的几个函数,心里会不踏实的。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表