在线时间0 小时
UID411979
ST金币0
蝴蝶豆0
注册时间2013-1-11
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
折腾低功耗已经第四天了,可以说筋疲力尽,没想到这个低功耗竟然卡住了我,看到好多人都可以做到11u我却问题颇多。无奈来此求助。
首先说我遇到的问题。我用主函数来测试功耗,不加其他额外的函数。但是出现了奇葩的问题,无论我怎么改,用asm(“halt”)打算进入停机模式,还是用asm("wfi")进入等待模式,功耗不变,我开始怀疑我的测试方法,最初我是用手持万用表测试的,表上的显示精度可以达到uA,之后我又拿了个源表(吉时利2410)我以为这次没问题了,这次又出了个奇葩的问题,当我用源表供电的时候VCAP竟然没电压,这什么情况,我用示波器看了下,好吧,竟然是斜波,就是方波给电容充电的感觉,可手册上写的应该1.8v。我换上电源供电,1.8v左右,没问题,我又不明白了。原本的问题还没解决,新的问题又来了。我放弃了源表。继续用我的电源供电,用手持万用表测试,想着精度差点就差点吧。可是当我用如下程序(1)测试的时候竟然只有200u,这算上全速了吧。感觉有问题,又换了个程序(2),打算测下什么都关闭,进入到停机状态的电流。结果400多u,我的表出问题了?还是硬件电流出问题了呢。硬件电路我是买的芯片和tssop转接板自己焊的最小系统,没有任何外设。用stlink和stvd都能下载进去程序,并且测试能控制端口,在stlink里面也可以仿真,寄存器的值也都对。我到底哪里没考虑全面。之前对单片机只是简单接触,第一次用st的片子。我觉得我好想要放弃了,原本不应该是问题的问题竟然困扰了我这么多天。希望能有朋友有经验的多帮忙,小弟谢谢啦!
程序(1)
unsigned long int count=0;
void main()
{
CLK_ICKR|=0X01;//HSI使能
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//预分频8分频得到16M频率
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//cpu分频系数为1
CLK_PCKENR1&=0X40;
CLK_PCKENR2&=0X73;//关闭外设时钟
PA_DDR|=0X0E;
PA_CR1|=0x0E;
PA_ODR&=~0x0E;
PB_DDR|=0X30;
PB_CR1|=0x30;
PB_ODR&=~0X30;
PC_DDR|=0XF8;
PC_CR1|=0xf8;
PC_ODR&=~0xF8;
PD_DDR|=0X7c;//设为输出
PD_CR1|=0x7c;//设为推挽
PD_ODR&=~0x7c;//设为低电平
WWDG_CR&=0X80;//关闭窗口关门狗
CPU_CFG_GCR&=0XFE;//关闭swim
while(1)
{
asm("nop");
}
}
程序2
unsigned long int count=0;
void main()
{
CLK_ICKR|=0X01;//HSI使能
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//预分频8分频得到16M频率
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//cpu分频系数为1
CLK_PCKENR1&=0X40;
CLK_PCKENR2&=0X73;//关闭外设时钟
CLK_ICKR|=0X08;//打开低速时钟信号
while(!(CLK_ICKR&0X10));//等待LSI准备
CLK_SWCR|=0X02;//切换使能
CLK_SWR=0XD2;//设置目标时钟为LSI,需使能LSI_EN选项字节
while(CLK_SWCR&0X01!=0);//切换忙,等待切换完成
CLK_SWCR&=~0X08;//清除切换标志
CLK_ICKR&=~0X01;//关闭HSI
PA_DDR|=0X0E;
PA_CR1|=0x0E;
PA_ODR&=~0x0E;
PB_DDR|=0X30;
PB_CR1|=0x30;
PB_ODR&=~0X30;
PC_DDR|=0XF8;
PC_CR1|=0xf8;
PC_ODR&=~0xF8;
PD_DDR|=0X7c;//设为输出
PD_CR1|=0x7c;//设为推挽
PD_ODR&=~0x7c;//设为低电平
WWDG_CR&=0X80;//关闭窗口关门狗
CPU_CFG_GCR&=0XFE;//关闭swim
FLASH_CR1&=~0X08;//flash在停机状态掉电
while(1)
{
asm("halt");
}
}
|
|