在特定的STM32微控制器上,系统时钟由PLL驱动,其频率由以下公式给出:F
F := (S/M * (N + K/8192)) / P
S是 PLL 输入源频率(或 64 MHz)。1 - 64000000
其他因素、、和是用户可以修改以校准频率的参数。根据我使用的 SDK 中的位掩码判断,每个位掩码的值可以限制为 、 、 和 的最大值。MNKPM < 64N < 512K < 8192P < 128
不幸的是,我的目标固件不支持FPU,因此浮点算术已经出来了。相反,我需要使用纯整数算术进行计算。F
我试图重新排列给定的公式,并牢记3个目标:
扩展和分布所有乘法因子
最小化每个分母中的因子数
最大限度地减少执行的除法总数
如果两个表达式具有相同数量的除法,请选择其分母具有最小最大值的表达式(在前面的段落中标识)
但是,我每次尝试扩展和重新排列表达式都会产生比原始公式更大的错误,因为它最初是逐字逐句表示的。
为了测试公式的不同排列和比较错误,我写了一个小的Go程序,你可以在这里在线运行。
是否可以改进此公式,以便在使用整数算术时将误差降至最低?另外,我上面列出的任何目标是否不正确或无用?
慕勒3428872
波斯汪
相关分类