#每日话题# #技术资源#
MCU的低功耗应用已经在各行各业有广泛的应用了,低功耗也是MCU的一项非常重要的指标,然而很多工程师在开发MCU低功耗应用的时候,是不是经常会遇到这些情况,有的是无论如何也降不下去功耗,有的是研发样机阶段可以降低功耗,但是量产阶段会出现部分产品功耗不一致现象,等等。如果大家遇到这些情况千万不要怕,只要我们认真做到以下几步,一切就迎刃而解了。 1. 关闭外设时钟 先说最直观的,也是工程师都比较注意的方面,就是关闭MCU的外设时钟,对于现在市面上出现的大多数的MCU,其外设模块都对应着一个时钟开关。只需要打开这个外设的时钟,就可以正常的使用这个外设了,当然,此外设也就会产生相应的功耗。反之,如果想要让这个外设不产生功耗,只需关闭它的时钟即可。
2. 时钟不要倍频 除了外设模块功率消耗之外,还有一个功耗大户需要注意一下,这就是PLL模块。PLL主要是用来对原始的时钟信号进行倍频操作,从而提高系统的整体时钟,相应的,其功耗也会被提上去。所以在进入低功耗之前,需要关闭PLL模块,从而尽可能的降低MCU的功耗,等到MCU唤醒之后再把时钟切换回去。
3. 将所有GPIO配置为模拟输入 只关闭外设时钟还不能够保证外设不再有耗电,如果GPIO没有做好处理的话,它就会在暗地里偷走功耗,而你却浑然不知。MCU在低功耗模式下,GPIO只有配置为模拟输入的状态,才能将其把功耗降至最低。具体的实现步骤是: - 将所有外设时钟打开
- 将所有GPIO配置为模拟输入模式
- 关闭所有外设时钟
如果忽略了第一步,那么有可能有些GPIO不能进入到模拟输入状态,所以,在将所有GPIO配置为模拟输入模式之前,一定要先将所有外设时钟打开。相关实现代码如下所示: GPIO_InitTypeDef GPIO_InitStructure;
RCC->AHBENR = 0xFFFFFFFF;//开启所有外设
RCC->APB2ENR = 0xFFFFFFFF; //开启所有外设
RCC->APB1ENR = 0xFFFFFFFF; //开启所有外设
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//设置烧录口为IO
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE); //设置低速时钟口为IO
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//设置所有IO口为模拟输入
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_2MHz;
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);
RCC->AHBENR = 0; //关闭所有外设
RCC->APB2ENR = 0; //关闭所有外设
RCC->APB1ENR = 0; //关闭所有外设
4. 断开调试器连接 还有比较特殊的原因就是自己在测试功耗的时候MCU还连接着调试器。有可能MCU的调试器引脚会经过调试器产生相当一部分电流,这个时候无论工程师如何努 力,也无法调到自己满意的功耗。所以在测低功耗的时候,一定不要连接调试器,更不能边调试边测电流。
以上就是我们在调试MCU的低功耗时,把可能会影响功耗的因素都规避掉的方法,供大家参考使用,欢迎大家一起探讨交流。
|