OpenEdv-开源电子网

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

关于系统时钟的问题

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-25
在线时间
0 小时
发表于 2015-8-21 16:16:02 | 显示全部楼层 |阅读模式
5金钱
原子哥,你好!

我在做一个项目的时候用的是STM32F103CBT6这款芯片,程序直接移植的是原子的库函数历程程序,但是当我调用延迟函数时发现这样一个问题:当delay_ms(1000)时,实际单片机延迟10秒;当调用delay_ms(100)时,单片机实际延迟1
秒,所以每次需要延迟1秒钟时,只能这样写延迟函数delay_ms(100),相当于延迟扩大了10倍。
并且,在用通用定时器TIM3时,需要定时1秒即TIM_Init(9999,7199)时,实际定时为10秒。所以至此我怀疑是系统时钟我配置有问题,但是系统时钟我没有配置过,直接调用库函数,并且硬件 宏定义也是STM32F10X_MD,USE_STDPERIPH_DRIVER。
所以我想问下出现这样的问题我如何解决?谢谢!

最佳答案

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

可以使用原子哥的寄存器版本中的sys.c 文件重新初始化系统时钟,在main函数中调用Stm32_Clock_Init(u8 LL)即可
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
788
金钱
788
注册时间
2015-8-21
在线时间
128 小时
发表于 2015-8-21 16:16:03 | 显示全部楼层
可以使用原子哥的寄存器版本中的sys.c 文件重新初始化系统时钟,在main函数中调用Stm32_Clock_Init(u8 LL)即可
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-25
在线时间
0 小时
 楼主| 发表于 2015-8-21 16:16:03 | 显示全部楼层
回复【7楼】FireAllCP:
---------------------------------
不好意思问题已解决,问题出在外部HSE晶振焊接上了,我刚才看到外部晶振OSC_OUT(6脚)焊上了,但OSC_IN(5脚)没有和晶振焊牢靠,处于脱落状态,所以造成单片机能检测出外部晶振就绪,但无法检测出5脚没有焊接上。再次谢谢大家了。
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-25
在线时间
0 小时
 楼主| 发表于 2015-8-21 16:52:35 | 显示全部楼层
回复【2楼】—孤独¥的风:
---------------------------------
请问第一次使用STM32芯片时,系统时钟都需要先配置吗?
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-8-21 17:37:40 | 显示全部楼层
你这个应该是外部高速时钟未就绪,然后单片机使用内部8M时钟,和72M比起来,时钟就慢了9倍,所以你要检查时钟配置
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11550
金钱
11550
注册时间
2014-4-1
在线时间
1316 小时
发表于 2015-8-21 17:39:29 | 显示全部楼层
如果不想配置时钟,就找个对应型号的工程模板。
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
788
金钱
788
注册时间
2015-8-21
在线时间
128 小时
发表于 2015-8-21 17:48:37 | 显示全部楼层
回复【3楼】小朱:
---------------------------------
在启动文件中,在调用main函数之前执行了sysInit()函数,默认系统时钟为8M;如果想修改其中的参数即可。或者自己在重新初始化时钟在main函数中调用即可
回复

使用道具 举报

11

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-1-31
在线时间
7 小时
发表于 2015-8-21 20:22:25 | 显示全部楼层
你看下你的外部晶振是多大的,他进来后会一般是经过一个分频 和一个倍频    例如8M外部晶振,进来会先进行二分频,变成4M,之后再PLL进行16倍频变成72M 外部晶振是接到OSC_OUT口上的哦,如果未检出外部晶振,芯片就启动内部晶振,我没用过内部晶振,很多人说不准确。。。

具体设置看寄存器那个手册吧,应该有设置的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-21 22:16:30 | 显示全部楼层
回复【3楼】小朱:
---------------------------------
是每次(每个代码)都要设置。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-25
在线时间
0 小时
 楼主| 发表于 2015-8-24 09:29:48 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
谢谢大家的帮忙,我先按照大家的想法排除一下问题。
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-25
在线时间
0 小时
 楼主| 发表于 2015-8-24 12:14:04 | 显示全部楼层
回复【9楼】小朱:
---------------------------------
回复【7楼】FireAllCP:
---------------------------------
亲,出现上面的问题后我先在main函数里面重新配置时钟为:采用外部8MHz时钟源HSE,main函数中调用的配置函数如下所示:

void RCC_Configuration(void)
{
  /*将外设RCC寄存器重设为缺省值*/
  RCC_DeInit();
 
  /*设置外部高速晶振(HSE)*/
  RCC_HSEConfig(RCC_HSE_ON);   //RCC_HSE_ON——HSE晶振打开(ON)
 
  /*等待HSE起振*/
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
 
  if(HSEStartUpStatus == SUCCESS)        //SUCCESS:HSE晶振稳定且就绪
  {
    /*设置AHB时钟(HCLK)*/ 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //RCC_SYSCLK_Div1——AHB时钟= 系统时钟
 
    /* 设置高速AHB时钟(PCLK2)*/ 
    RCC_PCLK2Config(RCC_HCLK_Div1);   //RCC_HCLK_Div1——APB2时钟= HCLK
 
    /*设置低速AHB时钟(PCLK1)*/    
RCC_PCLK1Config(RCC_HCLK_Div2);   //RCC_HCLK_Div2——APB1时钟= HCLK / 2
 
    /*设置FLASH存储器延时时钟周期数*/
    FLASH_SetLatency(FLASH_Latency_2);    //FLASH_Latency_2  2延时周期
   
 /*选择FLASH预取指缓存的模式*/  
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       // 预取指缓存使能
 
    /*设置PLL时钟源及倍频系数*/ 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     
// LL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9
   
  /*使能PLL */
    RCC_PLLCmd(ENABLE); 
 
    /*检查指定的RCC标志位(PLL准备好标志)设置与否*/   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)      
       {
       }
 
    /*设置系统时钟(SYSCLK)*/ 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 
//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟
 
    /* LL返回用作系统时钟的时钟源*/
    while(RCC_GetSYSCLKSource() != 0x08)        //0x08:PLL作为系统时钟
       { 
       }
     }


并且我在调试中通过查看RCC_WaitForHSEStartUp()的返回值为1(EEROR==0;SUCCESS==1)说明外部晶振就绪了,同时我检查我焊接的外部晶振确实为8M,但还是出现同样的问题(本页顶部的问题),请给点指导?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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