打印
[STM32F4]

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

[复制链接]
5511|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
乱世流年|  楼主 | 2016-12-21 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

外部接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倍,不太理解了。

另外打印出来的时钟配置如下:
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]

有谁有好使的F407VGT6 外接25MHz晶振的工程吗?借鉴一下,谢谢。
沙发
mmuuss586| | 2016-12-21 14:52 | 只看该作者
正常的话,改PLLM就可以了;

另外你说,现在快了16倍,你现在主频是多少啊,你反算过去,能达到这么高主频吗?

使用特权

评论回复
板凳
乱世流年|  楼主 | 2016-12-21 15:06 | 只看该作者
mmuuss586 发表于 2016-12-21 14:52
正常的话,改PLLM就可以了;

另外你说,现在快了16倍,你现在主频是多少啊,你反算过去,能达到这么高主频 ...

我现在读出来的频率是168MHZ,刚才算了下,systick使用21MHz,快16倍,算出来是336MHz,我比较疑惑,按理来说我改完这两处应该就没有问题了。

使用特权

评论回复
地板
乱世流年|  楼主 | 2016-12-21 17:06 | 只看该作者
mmuuss586 发表于 2016-12-21 14:52
正常的话,改PLLM就可以了;

另外你说,现在快了16倍,你现在主频是多少啊,你反算过去,能达到这么高主频 ...

我试着使用原来官方自带的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);  
    }

现在就弄不明白了,我拿RCC_GetClocksFreq(&rcc_clocks);                //获取各个时钟频率
读出的频率都是对的
HCLK=168000000[2016-12-21 04:20:59.445]
SYSCLK=168000000[2016-12-21 04:20:59.464]
PCLK1=42000000[2016-12-21 04:20:59.464]
PCLK2=84000000[2016-12-21 04:20:59.464]

使用特权

评论回复
5
mmuuss586| | 2016-12-21 17:43 | 只看该作者
你这几个改的也没问题啊;

你输出一路PWM,验证下PWM输出频率是不是对;

延时程序看了下也没问题;

剩下就不知道你0.5延时那段程序怎么写的了

使用特权

评论回复
6
乱世流年|  楼主 | 2016-12-21 20:33 | 只看该作者
mmuuss586 发表于 2016-12-21 17:43
你这几个改的也没问题啊;

你输出一路PWM,验证下PWM输出频率是不是对;

是这样的,我的延时函数就是delay_ms(500)和Delay(500)这两种,分别对应原子的例程和后面官方的模式。另外还有一点让我奇怪的是我运行原子F407 UCOSIII的移植例程,然后使用delay_ms(500)打印浮点数,结果串口输出基本上是500ms,跑操作系统的时候延时是对的,这就让我很纳闷了。

使用特权

评论回复
7
dongnanxibei| | 2016-12-21 20:33 | 只看该作者
这个可以用cubeMX配置时钟,可以清楚的看到整个流程是怎么回事,更容易计算。

使用特权

评论回复
8
huaiqiao| | 2016-12-21 21:46 | 只看该作者
ST对f4有个Excel的时钟配置工具干嘛不用?

使用特权

评论回复
9
zchong| | 2016-12-21 21:55 | 只看该作者
sytick是24bit,溢出了

使用特权

评论回复
10
乱世流年|  楼主 | 2016-12-21 21:56 | 只看该作者
huaiqiao 发表于 2016-12-21 21:46
ST对f4有个Excel的时钟配置工具干嘛不用?

我只想配置时钟不想其他外设都使用可以吗?这个问题纠结了一整天,我拿这个软件试试看吧,谢谢了。

使用特权

评论回复
11
乱世流年|  楼主 | 2016-12-21 21:57 | 只看该作者
dongnanxibei 发表于 2016-12-21 20:33
这个可以用cubeMX配置时钟,可以清楚的看到整个流程是怎么回事,更容易计算。 ...

好的,我试试看,谢谢啊。

使用特权

评论回复
12
乱世流年|  楼主 | 2016-12-21 22:15 | 只看该作者
zchong 发表于 2016-12-21 21:55
sytick是24bit,溢出了

那意思是我配置systick为21MHz过大了?我刚才测试延时5ms,也是跑了大约80多ms,接近16倍。

使用特权

评论回复
13
hcszheng| | 2016-12-22 07:53 | 只看该作者
楼主解决了吗。

使用特权

评论回复
14
乱世流年|  楼主 | 2016-12-22 08:53 | 只看该作者

还没有呢,昨天晚上使用cubemx配置,然后对hal库的使用不熟,没弄出来,现在还在查。

使用特权

评论回复
15
zchong| | 2016-12-22 09:16 | 只看该作者
乱世流年 发表于 2016-12-21 22:15
那意思是我配置systick为21MHz过大了?我刚才测试延时5ms,也是跑了大约80多ms,接近16倍。 ...

21*1000*1000=‭0x‭1406F40

超出24bit范围了,写进去的最高位没啦‬

使用特权

评论回复
16
乱世流年|  楼主 | 2016-12-22 09:18 | 只看该作者
乱世流年 发表于 2016-12-22 08:53
还没有呢,昨天晚上使用cubemx配置,然后对hal库的使用不熟,没弄出来,现在还在查。 ...

感谢大家,是我自己搞糊涂了,早上起来又想了一下,发现这些问题很矛盾,然后我就使用串口实际打印,500ms打印一次,时间是正常的,因此导致我觉得出错的问题在于我以为进入MDK仿真后的时间就是我真实跑起来的时间,其实不然,MDK对F4的支持度还是不够,也导致我过于相信软件仿真,实在是大意。在此也感谢大家热心的解答,谢谢你们!

使用特权

评论回复
17
乱世流年|  楼主 | 2016-12-22 09:28 | 只看该作者
zchong 发表于 2016-12-22 09:16
21*1000*1000=‭0x‭1406F40

超出24bit范围了,写进去的最高位没啦‬

不是这么算的吧,正常来说,我使用21MHz作为systick的时钟,写入的值应该是nms<0xffffff*8*1000/sysclk(21*1000*1000)
原子里面都写了“对168M条件下,nms<=798ms ”  应该是没溢出,另外我在跑ucosiii的时候也是正常的。

使用特权

评论回复
18
zchong| | 2016-12-22 09:41 | 只看该作者
乱世流年 发表于 2016-12-22 09:28
不是这么算的吧,正常来说,我使用21MHz作为systick的时钟,写入的值应该是nms ...

1、sytick就是一个24bit的计时器;
2、如果你输入是21M,那么最大计时长度就是0xFFFFFF/21000000 = 798.9ms;
3、基于以上前提,你想直接输出1s的中断是不可能的,因为最大只能到798.9ms;
4、小于798.9ms的中断是可以直接实现的。

使用特权

评论回复
19
huaiqiao| | 2016-12-22 16:38 | 只看该作者
乱世流年 发表于 2016-12-21 21:56
我只想配置时钟不想其他外设都使用可以吗?这个问题纠结了一整天,我拿这个软件试试看吧,谢谢了。 ...

可以的,那个官方的excel只是配置时钟,然后生成system_stm32xxxx.c。你只需要将原来的system_stm32xxxx.c替换为新的system_stm32xxxx.c就可以了。
但是前提是你用的是office 不是WPS。我试过WPS不行的哦。

STM32F40x _ 41 x微控制器的时钟配置工具----DM00039457_zh.pdf (1.04 MB)


STM32F40x _ 41 x微控制器的时钟配置工具-----stsw-stm32091.zip (659.23 KB)

使用特权

评论回复
20
天南星雨| | 2016-12-22 16:58 | 只看该作者
楼主编译器的编译等级是多少,有可能编译器将你的延迟做了优化处理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

309

帖子

3

粉丝