OpenEdv-开源电子网

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

求助 STM32F4时钟初始化问题

[复制链接]

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
发表于 2019-11-19 09:08:47 | 显示全部楼层 |阅读模式
1金钱
主要是在stsytemInit函数里面,为了方便我重新把时钟配置函数自己写了一遍,下面是源码
  1. //RCC_PLLSource:PLL时钟源 RCC_PLLSource_HSE、RCC_PLLSource_HSI
  2. //PLLM:主 PLL和音频PLL输入时钟的分频系数 范围2-63
  3. //PLLN:倍频系数 范围2-510
  4. //        小心: 软件必须正确设置这些位,确保 VCO 输出频率介于 192 和 432 MHz 之间。
  5. //        VCO 输出频率 = VCO 输入频率 × PLLN 并且 192 <= PLLN <= 432
  6. //PLLP:主系统时钟的主 PLL (PLL) 分频系数 范围2、4、6、8
  7. //PLLQ:主 PLL (PLL) 分频系数,适用于 USB OTG FS 范围2-15
  8. //使用时确保晶振频率PLLM分频为1MHz即可
  9. void SysClock_Configuration(uint32_t RCC_PLLSource, uint32_t PLLM)
  10. {
  11.         __IO uint32_t HSEStatus = 0;
  12.        
  13.     RCC_DeInit();  

  14.         if(RCC_PLLSource_HSE == RCC_PLLSource){        //选择外部时钟
  15.                 RCC_HSEConfig(RCC_HSE_ON);                                           //打开外部时钟
  16.                 if(RCC_WaitForHSEStartUp() == SUCCESS){
  17.                         HSEStatus = 1;
  18.                 }
  19.                 else{
  20.                         RCC_HSEConfig(RCC_HSE_OFF);        //关闭外部时钟
  21.                         RCC_HSICmd(ENABLE);       
  22.                 }                       
  23.         }
  24.        
  25.         RCC_HCLKConfig(RCC_SYSCLK_Div1);                                  //HCLK(AHB)时钟为系统时钟1分频                       
  26.         RCC_PCLK1Config(RCC_HCLK_Div2);                                    //PCLK(APB1)时钟为HCLK时钟2分频
  27.         RCC_PCLK2Config(RCC_HCLK_Div1);                                    //PCLK(APB2)时钟为HCLK时钟1分频       

  28.         if(HSEStatus == 1) {                                                                        
  29.                 //PLL时钟配置,外部晶振为8MHz,系统配置为8/PLLM*PLLN/PLLP
  30.                 RCC_PLLConfig(RCC_PLLSource_HSE, PLLM, 336, 4, 7);   
  31.         }
  32.         else{
  33.                 //PLL时钟配置,内部晶振为16MHz,系统配置为16/16*336/4 =84MHz usb=336/7=48
  34.                 RCC_PLLConfig(RCC_PLLSource_HSI, 16, 336, 4, 7);   
  35.         }
  36.        
  37.         RCC_PLLCmd(ENABLE);                                         //开启PLL时钟,并等待PLL时钟准备好
  38.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  39.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                              //选择PLL时钟为系统时钟
  40.    
  41.         while(RCC_GetSYSCLKSource() != 0x08);                      //Wait till PLL is used as system clock source
  42.         RCC_ClockSecuritySystemCmd(ENABLE);                                                                //打开时钟安全系统
  43. }
复制代码
代码部分可以区分内部和外部晶振。
测试结果是内部时钟是ok的,使用没有问题。外部晶振为8M,当配置外部时钟倍频后的pll作为系统时钟时不对,不论是系统默认的systemInit还是我自己编写的,得到的频率都是不对的。

上图是仿真出来的结果,可以看到主频已经到了262500000,在外设上串口输出的波特率也是不对。请求大神帮助。
单片机型号是STM32401C,手册上说是84M,我也是按照84M那个目标去配置的。附上时钟树,
11111111.png

最佳答案

查看完整内容[请看2#楼]

F4库也有对应的函数 stm32f4xx.h 128行 #define HSE_VALUE ((uint32_t)8000000) system_stm32f4xx.c 371行 #define PLL_M 8
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-11-19 09:08:48 | 显示全部楼层
qq997758497 发表于 2019-11-21 12:19
谢谢回答,我使用的是F4哦

F4库也有对应的函数
stm32f4xx.h   128行  #define HSE_VALUE    ((uint32_t)8000000)

system_stm32f4xx.c  371行   #define PLL_M      8
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-11-19 09:11:15 | 显示全部楼层

仿真图补上

仿真图补上

回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-11-19 14:39:58 | 显示全部楼层
系统自带的函数直接用,最多修改部分配置参数而已,没必要自己重新造轮子
一分耕耘一分收获。
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-19 16:49:31 | 显示全部楼层
帮顶   
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-11-19 17:13:30 | 显示全部楼层
yklstudent 发表于 2019-11-19 14:39
系统自带的函数直接用,最多修改部分配置参数而已,没必要自己重新造轮子

系统里面的函数不行我才写的函数,结果是一样的
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6653
金钱
6653
注册时间
2015-8-25
在线时间
1034 小时
发表于 2019-11-20 12:18:32 | 显示全部楼层
系统里面的函数不行证明你的板子可能有问题
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-11-20 16:50:48 来自手机 | 显示全部楼层
szczyb1314 发表于 2019-11-20 12:18
系统里面的函数不行证明你的板子可能有问题

我的板子应该是没有问题的呀,首先是内部时钟没有问题的,其次电源 复位都没有问题 因为程序是可以正常运行的,不一样的地方就是外部晶体了,晶体是8M的频率
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6653
金钱
6653
注册时间
2015-8-25
在线时间
1034 小时
发表于 2019-11-20 20:41:52 | 显示全部楼层
qq997758497 发表于 2019-11-20 16:50
我的板子应该是没有问题的呀,首先是内部时钟没有问题的,其次电源 复位都没有问题 因为程序是可以正常运 ...

确认你的外部晶振是否正常起振了没?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-11-21 10:21:01 | 显示全部楼层
更换晶振了是吗,我用库文件,修改这两处就可以了

修改晶振代码 25M改为8M
stm32f10x.h---> #define HSE_VALUE    ((uint32_t)8000000) //注意条件编译宏
system_stm32f10x.c ---> 第976行
//RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
    //                         RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
                /* PLL2 configuration: PLL2CLK = (HSE / 4) * 8 = 16 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 2 = 8 MHz */
                                RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV4 | RCC_CFGR2_PLL2MUL8 |
                           RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV2);
回复

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2019-11-21 12:19:10 | 显示全部楼层
Scorpio95 发表于 2019-11-21 10:21
更换晶振了是吗,我用库文件,修改这两处就可以了

修改晶振代码 25M改为8M

谢谢回答,我使用的是F4哦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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