OpenEdv-开源电子网

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

STM32F407VGT6 外接25MHZ晶振,使用原子F4 systick延时例程,实际延时快16倍,求解!!

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
发表于 2016-12-21 10:14:46 | 显示全部楼层 |阅读模式
外部接25MHz晶振,已经将程序进行如下修改:1)修改HSE_VALUE的值

将 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

修改为#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */

2)修改PLL_M的值

将 #define PLL_M 8修改为#define PLL_M 25

结果我在进行仿真测试时发现延时500ms时延时了8s,延时2500ms时延时了40s,我想问例程里面的怎么进行修改,按理来说我采用HCLK/8=21MHz为SYSTICK的时钟,然后在21MHz时钟下,延时1s对应计数21*1000*1000下,没问题啊,但实际却是16倍,不太理解了。



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

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-21 10:21:24 | 显示全部楼层
系统时钟配置问题,打印出HCLK,APB1,APB2等的时钟频率。看一下这些都是否正常
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 10:29:51 | 显示全部楼层
zuozhongkai 发表于 2016-12-21 10:21
系统时钟配置问题,打印出HCLK,APB1,APB2等的时钟频率。看一下这些都是否正常

版主,是直接打印吗?这块不太熟悉怎么找
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 10:45:34 | 显示全部楼层
zuozhongkai 发表于 2016-12-21 10:21
系统时钟配置问题,打印出HCLK,APB1,APB2等的时钟频率。看一下这些都是否正常

E:\
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 10:47:05 | 显示全部楼层
zuozhongkai 发表于 2016-12-21 10:21
系统时钟配置问题,打印出HCLK,APB1,APB2等的时钟频率。看一下这些都是否正常

HCLK=168000000[2016-12-21 10:44:03.446]
SYSCLK=168000000[2016-12-21 10:44:03.446]
PCLK1=42000000[2016-12-21 10:44:03.446]
PCLK2=84000000[2016-12-21 10:44:03.446]
版主,我打印出来的是这些,和systemf4xx.h里面一样的啊
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-21 10:54:28 | 显示全部楼层
christin 发表于 2016-12-21 10:47
HCLK=168000000[2016-12-21 10:44:03.446]
SYSCLK=168000000[2016-12-21 10:44:03.446]
PCLK1=42000000 ...

那就有可能是滴答定时器配置的问题。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 11:16:22 | 显示全部楼层
zuozhongkai 发表于 2016-12-21 10:54
那就有可能是滴答定时器配置的问题。

我用的是原子F407的delay例程,按说应该没有问题啊

void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS                                                 //如果需要支持OS.
        u32 reload;
#endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//SYSTICK使用外部时钟源         
        fac_us=SYSCLK/8;                                                //不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS                                                 //如果需要支持OS.
        reload=SYSCLK/8;                                                //每秒钟的计数次数 单位为K          
        reload*=1000000/delay_ostickspersec;        //根据delay_ostickspersec设定溢出时间
                                                                                        //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右       
        fac_ms=1000/delay_ostickspersec;                //代表OS可以延时的最少单位          
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
        SysTick->LOAD=reload;                                         //每1/OS_TICKS_PER_SEC秒中断一次       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
        fac_ms=(u16)fac_us*1000;                                //非OS下,代表每个ms需要的systick时钟数   
#endif
}       

初始化时输入168                               
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 11:37:26 | 显示全部楼层
zuozhongkai 发表于 2016-12-21 10:54
那就有可能是滴答定时器配置的问题。

我想问下,要是我使用原子的例程,外接25MHz的晶振,除了修改上面的那两处,systick初始化函数里面还需要怎么修改吗?
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 14:07:05 | 显示全部楼层
原子哥,我找了网上的各种解决方案,以上的该修改的都修改了,可是结果还是快16倍,问题是不是出在systick的配置上了??
回复 支持 反对

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2016-12-21 15:04:01 | 显示全部楼层
一直用的原子的延时函数,不过移植还是直接修改都没有问题,仿真时的频率是MDK里可以设置的吧,你直接下到板子里试试
或者换一个8M的晶振看看是不是正常,理论上换晶振只用修改你帖子里修改的那两个地方
实在不行你用CUBEMX做一个初始化,那里面配置出来的你再把延时函数移植进去
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 15:46:16 | 显示全部楼层
abdfgh 发表于 2016-12-21 15:04
一直用的原子的延时函数,不过移植还是直接修改都没有问题,仿真时的频率是MDK里可以设置的吧,你直接下到板子 ...

我就是连着板子进行在线仿真的啊,然后发现我延时500ms测出来的时间是8s,我刚才重新建了一次工程,直接使用的是官方的库文件,就是那两个默认是25MHz的文件,在线仿真发现还是8s,这我就不能理解了。
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-21 20:34:45 | 显示全部楼层
abdfgh 发表于 2016-12-21 15:04
一直用的原子的延时函数,不过移植还是直接修改都没有问题,仿真时的频率是MDK里可以设置的吧,你直接下到板子 ...

我试着使用原来官方自带的systick测试了一下,发现还是想延时0.5s却延时8s
static __IO uint32_t TimingDelay;

void TimingDelay_Decrement()  
{  
        if(TimingDelay!=0x00)  
    {  
                TimingDelay--;  
    }  
}  
  
void Delay(__IO uint32_t ntime)  
{  
        TimingDelay=ntime;  
        while(TimingDelay!=0);  
}  

void SysTick_Handler(void)
{
        TimingDelay_Decrement();
}


然后初始化里面写入
if(SysTick_Config(SystemCoreClock / 1000))  
    {  
         while(1);  
    }

另外还有一点让我奇怪的是我运行原子F407 UCOSIII的移植例程,然后使用delay_ms(500)打印浮点数,结果串口输出基本上是500ms,跑操作系统的时候延时是对的,这就让我很纳闷了。
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-4-2
在线时间
22 小时
 楼主| 发表于 2016-12-22 09:18:29 | 显示全部楼层
感谢大家,是我自己搞糊涂了,早上起来又想了一下,发现这些问题很矛盾,然后我就使用串口实际打印,500ms打印一次,时间是正常的,因此导致我觉得出错的问题在于我以为进入MDK仿真后的时间就是我真实跑起来的时间,其实不然,MDK对F4的支持度还是不够,也导致我过于相信软件仿真,实在是大意。在此也感谢大家热心的解答,谢谢你们!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 04:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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