|
【NXP Rapid IoT评测】给CPU (K64)降频省点电
[复制链接]
本帖最后由 cruelfox 于 2019-1-19 17:42 编辑
这个 Rapid-IoT kit 真是“电老虎”,其中最主要用电大户是 K64 MCU, 因为我发现从在线开发环境下载来的工程,竟然将CPU频率设定在最高支持的 120MHz. 从 clock_config.h 中这个宏定义可以体现:
不过,改变这个宏并不能改变实际 CPU 的频率,因为在配置硬件时钟的代码里面,它只是用来给一个全局变量赋值:
实际起配置作用的是上面那些代码,其使用的参数在另外的地方定义了。
为了简单的 IoT 应用,就将 K64 运行在 120MHz 太浪费电池了。于是我想到改变时钟配置,给 CPU 降频。读手册,K64 的时钟分配和我最熟悉的那些 MCU 截然不同,手册的风格也不一样。费了些时间读,仍然没弄明白要配那些寄存器。这个图还算比较清楚的:
但是 MCG 部分的描述就让我一头雾水了
除了PLL, 还有FLL又是啥?按照现在的代码分析,应该是 PLL 输出作为基本时钟的。进入PLL的时钟预先经过12分频,再由PLL得到30倍频率,是120MHz, 那么原始时钟应该为48MHz——这和我想的外部12MHz晶振频率不一样。要直接用外部晶振的 12MHz 作为基本时钟,我不会设,没有时间去细究了。那么改变PLL的系数吧来得容易,可是PLL倍频限制最低为24倍,比30倍降一点点;输入PLL的频率最小2MHz, 也就是 PLL 最低输出就是48MHz. 想要系统时钟更低,只好使用后面的分频器,比如除以4,得到12MHz.
最后确定要改的是这里:在 clock_config.c 中定义的结构常量
第一个红圈里是 PLL 的 PRDIV 和 VDIV 值,我将它改到使 PLL 输出 48MHz. 第二个红圈是负责分频的,这个值会写到 SIM 的 CLKDIV1 寄存器。于是我将几个分频系数都变为 4, 就使频率处于 12MHz 了。
改动后重新编译,果然电流下降了几十个mA.
下面向大家介绍下如果不自己本地编译怎么改频率:用二进制编辑工具直接改在线生成的 .bin 文件。
1. 搜索二进制字节 02 60 0B 06 00 03 00 00 00 00 00 44 01
这对应我上面红圈标的两个地方,将 0B 06 改为 17 00, 将 44 01 改为 33 33
2. 上面改动使 CPU, 总线频率都变成了 12MHz. 但是 FreeRTOS 还以为CPU是120MHz, 因为 SystemCoreClock 的值还没有改。再次搜索二进制字节 "04 00 20 00 0E 27 07", 后面的数 0x07270E00 就是十进制 120000000.
将它改成 0x00B71B00, 就对应实际频率了。
有需要的朋友可以尝试一下,看能将电池续航时间延长多少。
|
|