本帖最后由 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)
|