请选择 进入手机版 | 继续访问电脑版

芯虎论坛

 找回密码
 立即注册
查看: 491|回复: 0

华大F460和4A0 systick使用注意

[复制链接]

20

主题

31

帖子

342

积分

虎背熊腰

Rank: 3Rank: 3

积分
342
发表于 2021-8-10 13:34:30 | 显示全部楼层 |阅读模式


客户在用华大MCU systick做延时,表示系统延时不准确,差距很大。

看一下systick的initial函数 SysTick_Init:


发现输入到SysTick_Config中的SystemCoreClock,客户打印或者debug发现SystemCoreClock为8M,实际客户使用200Mhz运行。

那么这个systick timer的计数时基就不对了,所以看一下SystemCoreClock是哪里配置的。
发现是在系统刚启动start.s调用的SystemInit内再调用SystemCoreClockUpdate函数中根据实际系统时钟设置情况赋值。


而实际程序中我们往往需要使用到PLL把MCU系统时钟变更到更高的频率上,比如200Mhz。
通常我们会在main函数内加一个ClkInit类似函数,在ClkInit中设置PLL 提高系统时钟。
那么startup_hc32f46x.s文件中在main函数执行之前,会调用SystemInit:


而SystemCoreClock就在SystemInit内设置,所以也就是说.s文件在我们main函数设置系统clk之前就已经根据MCU刚刚启动时的时钟配置把SystemCoreClock赋值了。
而MCU刚启动的时候,都时默认内部8M RC振荡器,SystemCoreClock为8Mhz也就不奇怪了。

得出结论,我们在驱动或者其他程序运行的地方用到SystemCoreClock变量的地方 都会出现我们不想要的8Mhz时钟。(在main运行后 变更了系统时钟)

所以,请在main调用类似ClkInit函数后,再次调用一下SystemInit或者SystemCoreClockUpdate来更新全局变量SystemCoreClock。
这样比如systick等用到变量SystemCoreClock初始化的功能都会正确设置时基。

这里我建议使用SystemCoreClockUpdate来更新全局变量SystemCoreClock。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|芯虎论坛 ( 辽ICP备18019618号 )

GMT+8, 2021-9-27 20:27 , Processed in 0.107531 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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