客户在用华大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也就不奇怪了。
更多信息咨询请联系angel.qi:13827489351(微信与手机号码同步)
得出结论,我们在驱动或者其他程序运行的地方用到SystemCoreClock变量的地方 都会出现我们不想要的8Mhz时钟。(在main运行后 变更了系统时钟)所以,请在main调用类似ClkInit函数后,再次调用一下SystemInit或者SystemCoreClockUpdate来更新全局变量SystemCoreClock。这样比如systick等用到变量SystemCoreClock初始化的功能都会正确设置时基。 |