OpenEdv-开源电子网

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

stm32F407使用12MHz晶振,SysTick比实际快了1.5倍,求解

[复制链接]

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
发表于 2019-5-3 14:13:13 | 显示全部楼层 |阅读模式
1金钱
这里将HSE_VALUE改为12MHz,
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      (HSE_VALUE / 1000000)
#define PLL_N      336

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      7
/*******************************************************************************
* Function Name  : SysTick_Configuration
* Description    : Configures the SysTick for OS tick.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void  SysTick_Configuration(void)
{
    RCC_ClocksTypeDef  rcc_clocks;
    rt_uint32_t         cnts;

    RCC_GetClocksFreq(&rcc_clocks);

    cnts = (rt_uint32_t)rcc_clocks.HCLK_Frequency / RT_TICK_PER_SECOND;
    cnts = cnts / 8;

    SysTick_Config(cnts);
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
实际运行时,rt_thread_delay(RT_TICK_PER_SECOND);函数比实际快1.5倍,即实际延时只有三分之二秒,rt-thread-v3.1.0版本,stm32F407VET6,晶振是12MHz

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-4 00:58:20 | 显示全部楼层
是不是主频设置的有问题?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 08:42:24 | 显示全部楼层
正点原子 发表于 2019-5-4 00:58
是不是主频设置的有问题?

rcc_clocks.HCLK_Frequency = 168000000,搞不明白1.5倍这个关系从何而来
回复

使用道具 举报

2

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1092
金钱
1092
注册时间
2019-1-5
在线时间
256 小时
发表于 2019-5-4 09:02:28 | 显示全部楼层
个人建议你可以另开一个定时器,观察定时器时间是否准确,如果准确,那么可能是你的SysTick设置问题,如果不准确,那么要看主频设置了和检查你板子上的晶振是不是12M了,快1.5倍八成是你板子上的晶振不是12M....
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 09:29:37 | 显示全部楼层
正点原子 发表于 2019-5-4 00:58
是不是主频设置的有问题?

HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
如果使用的是HSI的话,好像刚好是1.5倍的关系,但是不知道在哪里设置的
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 10:18:39 | 显示全部楼层
s2333 发表于 2019-5-4 09:02
个人建议你可以另开一个定时器,观察定时器时间是否准确,如果准确,那么可能是你的SysTick设置问题,如果 ...

根据您的建议试了一下,定时器和rt_thread_delay一样都快1.5倍,使用之前的程序(在rt_thread_v2.1的版本上)时钟是准的,板子上的晶振12MHz可以确定没有问题,SysTick设置上,应该只用更改HSE_VALUE=12000000吧,原先是25000000,而且调试时SYSTEM_Frequency=168M,HCLK_Frequency=168M,PLCK1_Frequency=42M,PLCK2_Frequency=84M,都是正常的,感觉像是时钟源没选对,选成了内部时钟源HSI=16M,但是不知道在哪里设置
回复

使用道具 举报

2

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1092
金钱
1092
注册时间
2019-1-5
在线时间
256 小时
发表于 2019-5-4 10:57:10 | 显示全部楼层
李申瑞 发表于 2019-5-4 10:18
根据您的建议试了一下,定时器和rt_thread_delay一样都快1.5倍,使用之前的程序(在rt_thread_v2.1的版本 ...

static void SetSysClock(void) 函数中,
  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
这句启用HSE
下面的程序是等晶振起振....你可以看下这个函数时钟的启用
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 12:12:39 | 显示全部楼层
s2333 发表于 2019-5-4 10:57
static void SetSysClock(void) 函数中,
  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON); ...

经调试跟踪,这个函数是可以启动HSE的,且是成功的,现在懵逼了,完全没有思路了
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5551
金钱
5551
注册时间
2015-11-5
在线时间
711 小时
发表于 2019-5-4 13:31:42 | 显示全部楼层
我以前搞STM32F105的时候,焊了个8M的晶振上去,频率也是不正常的,因为官方默认的晶振是25M,需要改几个文件里的系数才行。
回复

使用道具 举报

2

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1092
金钱
1092
注册时间
2019-1-5
在线时间
256 小时
发表于 2019-5-4 13:42:32 | 显示全部楼层
李申瑞 发表于 2019-5-4 12:12
经调试跟踪,这个函数是可以启动HSE的,且是成功的,现在懵逼了,完全没有思路了

我也有点懵逼了...
你看看有这个初始化吗   uint32_t SystemCoreClock = 168000000;
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 16:42:48 | 显示全部楼层
逍遥叹乄 发表于 2019-5-4 13:31
我以前搞STM32F105的时候,焊了个8M的晶振上去,频率也是不正常的,因为官方默认的晶振是25M,需要改几个文 ...

你还记得要改哪几个文件的系数吗,底层程序看起来好吃力
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-3
在线时间
3 小时
 楼主| 发表于 2019-5-4 16:47:19 | 显示全部楼层
s2333 发表于 2019-5-4 13:42
我也有点懵逼了...
你看看有这个初始化吗   uint32_t SystemCoreClock = 168000000;

有的,而且调试时SYSTEM_Frequency=168M,HCLK_Frequency=168M,PLCK1_Frequency=42M,PLCK2_Frequency=84M,都是正常的
回复

使用道具 举报

2

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1092
金钱
1092
注册时间
2019-1-5
在线时间
256 小时
发表于 2019-5-6 08:48:29 | 显示全部楼层
李申瑞 发表于 2019-5-4 16:47
有的,而且调试时SYSTEM_Frequency=168M,HCLK_Frequency=168M,PLCK1_Frequency=42M,PLCK2_Frequency=84M, ...

感觉底层程序没问题呀   那你rt-thread系统内核时钟管理看过吗    RT_TICK_PER_SECOND这个值会调整系统节拍
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-5-7 11:17:51 | 显示全部楼层
我没记错的话需要修改两个地方,个人觉得是主时钟应该没问题,应该是你哪个参数还是8M的参数,使初始化SysTick定时器的值不对,你可以看看SysTick的Load寄存器的值是不是所需要的值。我估计是这里配置错了
回复

使用道具 举报

15

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2018-10-30
在线时间
60 小时
发表于 2019-5-9 17:50:13 | 显示全部楼层
可以百度STM32改变晶振后如何修改代码,按照搜索出来的教程排查。我曾那么做过
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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