打印
[资源分享]

AC7801x功耗测试

[复制链接]
931|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AC, IO, ni, pi
本帖最后由 JasonLee27 于 2020-6-10 20:23 编辑

硬件:AC7801x通用开发板 ,万用表
软件:keil 5.23

之前用mini板测试过AC7811的休眠功耗,因为AC7801x特意让硬件预留了IC的功耗测试接口,所以这里直接用AC7801x通用开发板来测试功耗。
打开AC7801x通用板的原理图,可以看到MCU_VDD的电源处预留了测试点,芯片默认焊接R111,我们把他去掉,然后把TP32,TP33的焊锡去掉,JP1插上排针(方便烧录)。



这里直接使用应用笔记里面的stop_wakeup_sample。
  • /**
  • * main
  • *
  • * @param[in]  none
  • * @return none
  • *
  • * @brief  main function
  • *
  • */  
  • int main(void)  
  • {  
  •       
  •     static uint8_t key1_down = 0;  
  •     uint32_t periphSleepAckStatus = 0;  
  •     uint32_t wakeupStatus = 0;  
  •    // static uint8_t key2_down = 0;  
  •     InitDelay();  
  •     InitDebug();  
  •     KEY_Init();    /* init key gpio */  
  •     LED_Init();    /* init led gpio */  
  •     printf("\r\nAC7801: stop_wakeup demo\r\n");  
  •       
  •     SPM_EnableModuleWakeup(SPM_MODULE_GPIO, ENABLE);  
  •     while(1)  
  •     {  
  •         if (GPIO_LEVEL_LOW == GPIO_GetPinLevel(GPIO_KEY1))  
  •         {  
  •             if (key1_down == 0) ///<  
  •             {  
  •                 mdelay(10); ///<Ïû¶¶  
  •                 if (GPIO_LEVEL_LOW == GPIO_GetPinLevel(GPIO_KEY1))  
  •                 {  
  •                     key1_down = 1;  
  •                     LED1_TOGGLE;  
  •                     SysStop();      ///<go to sleep  
  •                     periphSleepAckStatus = READ_MEM32(0x4000800C);  
  •                     wakeupStatus = READ_MEM32(0x4000801C);  
  •                     printf("system wakeup SleepAckStatus=0x%08x wakeupStatus=0x%08x \r\n", periphSleepAckStatus, wakeupStatus);  
  •                 }  
  •             }  
  •         }  
  •         else  
  •         {  
  •             key1_down = 0;  
  •         }  
  •     }  
  • }  


烧好程序,断开JP1,接入万用表,按下Key6,程序进入休眠,测得此时功耗在0.5mA

这功耗显然高了,结合之前的经验,我们继续关掉LVD以及避免IO漏电
增加如下三条代码,前两条关闭LVD,后一条设置stop模式下挂起所有IO,即所有IO失效,便于我们直接测试芯片的功耗。

  •                   MODIFY_REG32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_EN_DPWRLVD_Msk, SPM_PWR_MGR_CFG0_EN_DPWRLVD_Pos, DISABLE);  
  •                   MODIFY_REG32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_EN_LVD_Msk, SPM_PWR_MGR_CFG0_EN_LVD_Pos, DISABLE);  // disable/enable lvd  
  •                   MODIFY_REG32(SPM->PWR_MGR_CFG0, SPM_PWR_MGR_CFG0_EN_IO_SUS_Msk, SPM_PWR_MGR_CFG0_EN_IO_SUS_Pos, ENABLE); //suspend IO  
  •                   SysStop();      ///<go to sleep



设置好之后编译烧录,发现功耗完全没有下去,仿真看了下,发现是被GPIO唤醒,看来如果suspend IO,在进stop之后会自动触发GPIO中断,且从寄存器描述看,GPIO唤醒是默认使能,这里我们先禁止GPIO唤醒。我这里就直接不使能GPIO中断了。
  • void KEY_Init(void)  
  • {  
  •     /* init gpio as input mode */  
  •     GPIO_SetDir(GPIO_KEY1, GPIO_IN);  
  •     GPIO_SetDir(GPIO_KEY2, GPIO_IN);  
  •       
  •    // GPIO_EnableExternalInterrupt(GPIO_KEY1, EXTI_TRIGGER_FALLING);  
  •    // GPIO_EnableExternalInterrupt(GPIO_KEY2, EXTI_TRIGGER_FALLING);  
  •       
  •    // GPIO_SetCallback(GPIO_PIN6, GPIO_Handler);  
  •     GPIO_SetCallback(GPIO_PIN11, GPIO_Handler);      
  • }  

再次测试,这次进入休眠,且功耗降低到6uA。

不过这个功耗有点偏理想了,毕竟是禁用了所有IO,纯测试芯片内部功耗的情况,实际应用下IO肯定要使用的。






stop_wakeup_sample.rar (643.24 KB)


使用特权

评论回复

相关帖子

沙发
marginer| | 2020-6-10 18:56 | 只看该作者
很低很好很强大

使用特权

评论回复
板凳
marginer| | 2020-6-10 19:00 | 只看该作者
你还没学会代码排版

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

10

粉丝