在特定的 STM32 微控制器上,系统时钟由 PLL 驱动,其频率F
由以下公式给出:
F := (S/M * (N + K/8192)) / P
S
是 PLL 输入源频率(1 - 64000000
或 64 MHz)。
其他因素M
、N
、K
和P
是用户可以修改以校准频率的参数。从我正在使用的 SDK 中的位掩码来看,每个位掩码的值可以限制为最大M < 64
, N < 512
,K < 8192
和P < 128
.
不幸的是,我的目标固件不支持 FPU,所以浮点运算不可用。相反,我需要F
使用仅整数算术进行计算。
我试图重新排列给定的公式,考虑到 3 个目标:
- 展开并分配所有乘法因子
- 最小化每个分母中的因子数
- 最小化执行的分割总数
- 如果两个表达式具有相同的除数,则选择分母具有最小最大值的一个(在前面的段落中确定)
但是,我每次扩展和重新排列表达式的尝试都会产生比最初逐字表达的原始公式更大的错误。
为了测试公式的不同排列并比较错误,我编写了一个 Go 小程序,您可以在此处在线运行。
是否可以改进这个公式,以便在使用整数运算时将误差最小化?还有我上面列出的任何目标不正确或无用吗?