[资源分享] MINI板低功耗测试(附例程)

[复制链接]
 楼主| JasonLee27 发表于 2019-10-18 14:35 | 显示全部楼层 |阅读模式
硬件平台: AC781x MINI开发板,外用表,电源,ATC-LINK仿真器
软件平台:keil 5.23

一,准备步骤,搭建电流测试环境:
WeChat Image_20191018135803.jpg
因为我没办法直接测量到进入MCU的电流,所以只能测整个板子的功耗,这里要注意,因为MINI板上有一个电源指示灯,在进入休眠后也是会亮的,所以我把它下掉了,因为没有其他外围了,所以基本可以认为这个电流就是MCU的功耗了。
从原理图上找到VCC和GND,用电源直接供电。
WeChat Screenshot_20191018134548.png

好,初步的环境就搭建完成了。

二,编写测试代码,测试功耗
新建一个空的AC7811 keil工程,新建一个main文件。写如下代码:
  1. #include "ac78xx.h"

  2. int main(void)
  3. {
  4.     InitDelay();
  5.    
  6.     mdelay(10000);
  7.     SysStop();
  8.     while(1);
  9. }
这应该是一个最简单的进入休眠的代码了,这里初始化延时函数,并执行10s的延时,是为了预留部分时间可以更新程序,因为m3内核在休眠下是无法连接仿真器的。这个一定要注意,如果程序上电就休眠的话,那你的板子就GG了,就必须要从ISP模式启动才可以重新烧录了。

程序运行后,测试得到电流为80uA左右:
WeChat Image_20191018140602.jpg
显然与数据手册描述还有很大差距,查阅参考手册,发现还有个LVD功能是默认开启的,在stop模式下也并不会自动关闭,所以我们手动将其关闭:

  1. #include "ac78xx.h"

  2. int main(void)
  3. {
  4.     InitDelay();
  5.    
  6.     mdelay(10000);
  7.     WriteBitsValue(0x40008000, 4, 1, 0);
  8.     SysStop();
  9.     while(1);
  10. }
此时再测试功耗为47uA:
WeChat Image_20191018141243.jpg

再查阅手册,有测试一些其他方法(关闭一些默认开始的时钟等),但都没有降低到一个预期值,这个时候想到以前用瑞萨芯片的时候也碰到过类似问题,就是IO口漏电,为了解决IO口漏电,我将所有IO全部设置为输出模式(经验上来讲好像IO在输入模式下内部本身就会漏电,至于为什么我就不清楚了),并根据外围电路,设置为相应的电平。

  1. #include "ac78xx.h"
  2. #include "ac78xx_gpio.h"

  3. /* makesure n < 16 */
  4. #define PAout(n)   BIT_ADDR(GPIOA_ODR_ADDR, n)
  5. #define PAin(n)    BIT_ADDR(GPIOA_IDR_ADDR, n)

  6. #define PBout(n)   BIT_ADDR(GPIOB_ODR_ADDR, n)
  7. #define PBin(n)    BIT_ADDR(GPIOB_IDR_ADDR, n)

  8. #define PCout(n)   BIT_ADDR(GPIOC_ODR_ADDR, n)
  9. #define PCin(n)    BIT_ADDR(GPIOC_IDR_ADDR, n)

  10. #define PDout(n)   BIT_ADDR(GPIOD_ODR_ADDR, n)
  11. #define PDin(n)    BIT_ADDR(GPIOD_IDR_ADDR, n)

  12. #define PEout(n)   BIT_ADDR(GPIOE_ODR_ADDR, n)
  13. #define PEin(n)    BIT_ADDR(GPIOE_IDR_ADDR, n)
  14. /**
  15. * port_Init
  16. *
  17. * @param[in]  none
  18. * [url=home.php?mod=space&uid=266161]@return[/url] 0
  19. *
  20. * [url=home.php?mod=space&uid=247401]@brief[/url] init all port
  21. */
  22. void port_Init(void)
  23. {
  24.    
  25.     GPIO_SetDir(GPIO_PA0, 1);
  26.     PAout(0) = 1;   
  27.     GPIO_SetDir(GPIO_PA1, 1);
  28.     GPIO_SetDir(GPIO_PA2, 1);  
  29.     GPIO_SetDir(GPIO_PA3, 1);   
  30.     GPIO_SetDir(GPIO_PA4, 1);
  31.     GPIO_SetDir(GPIO_PA5, 1);
  32.     GPIO_SetDir(GPIO_PA6, 1);
  33.     GPIO_SetDir(GPIO_PA7, 1);
  34.     GPIO_SetDir(GPIO_PA8, 1);  
  35.     GPIO_SetDir(GPIO_PA9, 1);
  36.     GPIO_SetDir(GPIO_PA10, 1);   
  37.     GPIO_SetDir(GPIO_PA11, 1);
  38.     GPIO_SetDir(GPIO_PA12, 1);  
  39.     GPIO_SetDir(GPIO_PA13, 1);     
  40.     GPIO_SetDir(GPIO_PA14, 1);
  41.     GPIO_SetDir(GPIO_PA15, 1);
  42.    
  43.     GPIO_SetDir(GPIO_PB0, 1);   
  44.     GPIO_SetDir(GPIO_PB1, 1);  
  45.     GPIO_SetDir(GPIO_PB2, 1);
  46.     PBout(2) = 1;
  47.     GPIO_SetDir(GPIO_PB3, 1);
  48.     GPIO_SetDir(GPIO_PB4, 1);
  49.     GPIO_SetDir(GPIO_PB5, 1);  
  50.     GPIO_SetDir(GPIO_PB6, 1);
  51.     GPIO_SetDir(GPIO_PB7, 1);   
  52.     GPIO_SetDir(GPIO_PB8, 1);
  53.     GPIO_SetDir(GPIO_PB9, 1);
  54.     GPIO_SetDir(GPIO_PB10, 1);
  55.     GPIO_SetDir(GPIO_PB11, 1);
  56.     GPIO_SetDir(GPIO_PB12, 1);
  57.     GPIO_SetDir(GPIO_PB13, 1);
  58.     GPIO_SetDir(GPIO_PB14, 1);
  59.     GPIO_SetDir(GPIO_PB15, 1);
  60.    
  61.     GPIO_SetDir(GPIO_PC0, 1);   
  62.     GPIO_SetDir(GPIO_PC1, 1);  
  63.     GPIO_SetDir(GPIO_PC2, 1);
  64.     GPIO_SetDir(GPIO_PC3, 1);
  65.     GPIO_SetDir(GPIO_PC4, 1);
  66.     GPIO_SetDir(GPIO_PC5, 1);  
  67.     GPIO_SetDir(GPIO_PC6, 1);
  68.     GPIO_SetDir(GPIO_PC7, 1);
  69.     PCout(7) = 0;
  70.     GPIO_SetDir(GPIO_PC8, 1);
  71.     GPIO_SetDir(GPIO_PC9, 1);
  72.     PCout(9) = 1;
  73.     GPIO_SetDir(GPIO_PC10, 1);
  74.     GPIO_SetDir(GPIO_PC11, 1);
  75.     GPIO_SetDir(GPIO_PC12, 1);
  76.     GPIO_SetDir(GPIO_PC13, 1);
  77.     GPIO_SetDir(GPIO_PC14, 1);
  78.     GPIO_SetDir(GPIO_PC15, 1);
  79.    
  80.     GPIO_SetDir(GPIO_PD0, 1);   
  81.     GPIO_SetDir(GPIO_PD1, 1);
  82.     PDout(1) = 1;
  83.     GPIO_SetDir(GPIO_PD2, 1);
  84.     PDout(2) = 1;
  85. }
  86. int main(void)
  87. {
  88.     InitDelay();
  89.    
  90.     mdelay(10000);
  91.     WriteBitsValue(0x40008000, 4, 1, 0);
  92.     port_Init();
  93.     SysStop();
  94.     while(1);
  95. }
整个代码改完后如上。再次测试,电流降到8uA。
WeChat Image_20191018143228.jpg
至此,与手册描述的还是有些差距,不过我测到这里也就降不下去了,曾经和内部同事沟通,好像测试方法不一样,他们是直接把电流表串在进入MCU的电源上。那就不知道是不是还有别的地方耗电了。
 楼主| JasonLee27 发表于 2019-10-18 15:05 | 显示全部楼层
好像工程没贴,就算了,上面的就是全部代码了。剩下的就加了m3 core,gpio驱动还有startup了。
gx_huang 发表于 2019-10-18 15:17 | 显示全部楼层
低功耗的硬件检查,看来我还是有一套的,如果数据手册是1uA,实测8uA,肯定还有鬼。
hayden0 发表于 2019-10-22 09:22 | 显示全部楼层
不错,有空我也试试挑战一下低功耗
AutochipsMCU 发表于 2019-10-22 09:55 | 显示全部楼层
gx_huang 发表于 2019-10-18 15:17
低功耗的硬件检查,看来我还是有一套的,如果数据手册是1uA,实测8uA,肯定还有鬼。 ...

强烈推荐楼主把鬼抓出来
 楼主| JasonLee27 发表于 2019-10-22 15:19 | 显示全部楼层
AutochipsMCU 发表于 2019-10-22 09:55
强烈推荐楼主把鬼抓出来

毕竟测试方法不专业,而且芯片验证肯定是有往小了测的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部