在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
FRDM_KL25Z 实验三 改变系统时钟的功耗测试
增加了UART0的输出和1路16位ADC0的采样,操作如下:
将uart0.c和uart0.h以及MKL_adc.c和MKLadc.h分别include和add到项目中,由于这两个模块都带有基本的功能,因此只需要在主函数中添加:
adcInit();
uart0Init(115200,0,0,8,1);
即可。查看这两个模块,adcInit()实现从PTE20口输入模拟信号,由UART0触发采样;UART0Init()函数直接实现PTA1,2口的输入和输出[但如果采用OpenSDA,则默认从虚拟串口出入],如果不用PC窗口读取数据,将PTA1,2口短路即可自动触发ADC采样;用虚拟窗口只能打开PC的模拟串口软件了。
1. 先说说16位ADC的效果,单次采样直接输出后3位一直蹦,4次平均后100左右蹦,8次后2位数蹦,16次平均则是在+-12个字之间也就输说24/65536的精度了,优于千分之一的精度,也就是说采样为12位时,误差在2个bit以内。
2. 系统时钟,想将系统时钟设定在标准的48MHz,此时UART0的输出设定在155200波特率,PC端口的接收也是这个数值,连接下载后一切正常。测试功耗为19.5mA;之后将系统时钟改为6MHz,测试功耗为14.5mA;呜呼才减少了5mA——真够抠门的,当然此次测试没有用LP模式。
3. 系统时钟对UART0波特率的影响。48MHz时,初始化UART0为115200:uart0Init(115200,0,0,8,1);当系统时钟降低到6MHz时,比标准的低了8倍,因此对应的波特率也需要改,也就是说初始化语句不变,还是uart0Init(115200,0,0,8,1) C端的接收速率需要降低8倍:115200/8=11400,结果却是如此,在14400下可以正常获得数据。
4. 系统时钟的改变是早先本站点网友的一个模块改的,如下:
void SysClockSet(void){
//使用外部8M时钟源
SIM->SCGC5 |= (uint32_t)0x0200UL;//开启时钟门
SIM->CLKDIV1 = (uint32_t)0x10010000UL; //内核/系统2分频;Flash和总线2分频
PORTA-> CR[18] &= (uint32_t)~0x01000700UL;
PORTA-> CR[19] &= (uint32_t)~0x01000700UL;
//Switch to FBE Mode
OSC0->CR = (uint8_t)0x89U;//外部参考使能;
MCG->C2 = (uint8_t)0x24U; //选择使用外部参考源;板上8Mhz有源晶振
MCG->C1 = (uint8_t)0x9AU; //FLL外部参考,256分频
MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
MCG->C5 = MCG_C5_PRDIV0(31);//括号的数值1~31均可,实际为晶振/()+1,本例8/(31+1)=0.25MHz
MCG->C6 = MCG_C6_VDIV0(0);//()为倍率,0=24;本例为0:0.25M*(24+0)=6MHz
SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(1));
SystemCoreClock = 6000000;
while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {};
while((MCG->S & 0x0CU) != 0x08U) {};
//现在已经进入了 FBE模式
MCG->C6 |= (uint8_t)0x40U;
while((MCG->S & 0x0CU) != 0x08U) {};
while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) {};
MCG->C1 = (uint8_t)0x1AU;
while((MCG->S & 0x0CU) != 0x0CU) {};
}
只需要改变12,13行括号的数值就可以实现超频或降频。
5. 测试小结,改变系统时钟可以有限降低功耗,算起来频率降低8倍,功耗才才下降了1/4。因此LP模式才是正选。照片如下:
|
-
48MHz下的电流
-
6MHz下的电流
|