再调stm32产品低功耗

再调stm32产品低功耗


最近入职了一个公司,没想到又是接到调低功耗的任务!

一、调试步骤步骤

拿到公司的板子,第一个事情是熟悉公司的硬件电路图,把板子上的芯片捋清楚,查查它们的静态工作电流,大概率会找到偷功耗的小偷,同时把这些信息整理成一个文档,表面工作尤其重要(功耗没调下来,文档先输出,显得你工作做事有逻辑!)

第二个事情:做最小系统板,开始吹芯片,把板子上原有的芯片,用热风枪吹下来(功耗也会接着下来),观察功耗,如果芯片进入了低功耗模式,大概率是能够达几十微安或者两、三百微安;

那么,芯片都进入了低功耗模式了,外围芯片都吹下来了,只剩最小系统板,剩下的功耗从哪几个地方产生,这就是考验你耐心(运气)的时候了。

Stm32进入低功耗模式,无论是sleep/standby/stop,都是10ua以下的,这个一般是依据产品设计的应用场景,选择低功耗模式使用哪个,在这里就不拓展

如果你在网上查询过,你也可以很快判断出漏电的原因大部分是io的设置,io漏电原理是因为io连接的外围器件与芯片io内部形成了回路。
按照一般设置方法,就是在芯片进入低功耗模式前,对所有的io进行设置

void sys_standby(void)
{  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	
	PWR_WakeUpPinCmd(ENABLE);
	//PWR_EnterSTANDBYMode();
	sys_low_power_io_init();
	PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
	sys_normal_io_init();
}

其中包含使用io和非使用io
使用io为了思路更清晰,分使用模块,逐个IO去设置

void sys_low_power_io_init(void)
{
    //所有IO初始化
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
	
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    GPIO_Init(GPIOG, &GPIO_InitStructure);

    // 蓝牙
    // BLE_INT 上拉         PA0
    // BLE_WAKE  悬空       PA1
    // TD2                  PA2
    // RD2                   PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);	
	PAout(2)=1;
	PAout(3)=1;
		
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   // 晶振
    // PC14、PC15
    // OSC_IN、OSC_OUT
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    // W25X40
    // NSS有上拉:R44(已拆除),其他悬空
    // NSS:PA4
    // SCK:PA5
    // MISO:PA6
    // MOSI:PA7
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //RS485
    // rw1_485悬空:PA8 下拉电阻R50
    // RD1:PA10
    // TD1:PA9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //LM75BD 上拉已去除 各个io悬空
    // SDA PB7
    // SCL PB6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //SW烧录口
    //SWDIO     PA13
    //SWCLK     PA14
    //		GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关闭JTAG
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

其中io设置原则模拟输入/开漏输出高电平/其他都可以,唯一要保持的原则是不要让io和外围电路形成回路

二、调试方法

或许你已经参照了我的流程对io设置了一遍,但是电流发现还是没降下来

我在这里分享两个硬件调试方法

2.1 用镊子短路板子上的每一个电阻,找到短路后让整机电流异常的电阻,去除;
这个方法是用来判断外围电路没清楚干净导致的漏电情况

2.2 用杜邦线,一头接gnd/3.3V,直接在芯片的io上点,找到可以让整机电流降低的io,注意别点到芯片上的vcc/gnd
这个方法我尝试用过,但是没成功找到对应io(非IO漏电),但是也写下来,保留分享用途

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_翩翩少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值