本帖最后由 小宏121 于 2024-12-27 16:46 编辑
雅特力的AT-START-L021开发板拿到手是这样的,打算测试一下这MCU的低功耗是否和手册描述的一样
板子上供电有两种电压,分别是1.8V和3.3V,通过排针JP2选择
测试时把功耗分析仪接到JP2的2号脚就可以了
根据MCU AT32L021手册描述,在1.71V的时候功耗能达到8.54uA,就选择1.8V来测试
下面就开始测试
1、从雅特力官网下载资料
AT32L021的资料网址:https://www.arterytek.com/cn/product/AT32L021.jsp#Resource
我选择用Keil MDK来调试代码,所以下载好pack和官方例程就够了
2、测试官方的例程
这里我选择串口1低功耗唤醒的例程,路径如下
AT32L021_Firmware_Library_V2.0.6_ZH\project\at_start_l021\examples\pwc\deepsleep_usart1
deepsleep_usart1例程的内容:上电后LED会点亮,延时300ms熄灭LED再给串口1发送字符串、从外置时钟源切换到内置高速时钟源、减少内置LDO电压为1.0V后就进入低功耗模式的深度睡眠模式,之后如果串口1的RX有数据到来就触发唤醒,然后LED亮起、提高内置LDO电压为1.2V,恢复为外置时钟源后再打印字符串。
int main(void)
{
__IO uint32_t index = 0;
__IO uint32_t systick_index = 0;
/* enable pwc clock */
crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
/* congfig the system clock */
system_clock_config();
/* init at start board */
at32_board_init();
/* turn on the led light */
at32_led_on(LED2);
at32_led_on(LED3);
at32_led_on(LED4);
delay_ms(300);
/* config usart1 */
usart1_config(2400);
usart1_wakeup_config();
printf("exit deepsleep mode by usart1 rdbf interrupt \r\n");
while(1)
{
at32_led_off(LED2);
printf("now enter deepsleep mode \r\n");
/* make sure that no usart receiver is ongoing */
while(usart_flag_get(USART1, USART_OCCUPY_FLAG) == SET)
{
}
/* select system clock source as hick before ldo set */
crm_sysclk_switch(CRM_SCLK_HICK);
/* wait till hick is used as system clock source */
while(crm_sysclk_switch_status_get() != CRM_SCLK_HICK)
{
}
/* reduce ldo before enter deepsleep mode */
pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V0);
while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET)
{
}
/* congfig the voltage regulator mode.only used with deep sleep mode */
pwc_voltage_regulate_set(PWC_REGULATOR_LOW_POWER);
/* enter deep sleep mode */
pwc_deep_sleep_mode_enter(PWC_DEEP_SLEEP_ENTER_WFI);
/* turn on the led light */
at32_led_on(LED2);
/* resume ldo before system clock source enhance */
pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V2);
/* wake up from deep sleep mode, congfig the system clock */
system_clock_recover();
/* wake up from sleep mode */
printf("\r\nnow exit deepsleep mode by usart1 rdbf interrupt \r\n");
printf("usart1_rdne_data = 0x%x\r\n", usart1_index);
delay_ms(300);
}
}
该例程实测进入低功耗时的功耗如图,电流是258uA,远远大于手册中描述的8.54uA
于是我查看手册
MCU进入低功耗深度睡眠模式时,手册描述了LDO、PLL、内部和外部时钟源都会关闭,但是GPIO的模式保持进入深度睡眠模式之前不变,
而且258uA远大于运行模式时和睡眠模式PLL开启时的电流,所以可以确定MCU已经进入低功耗深度睡眠模式了,那么只剩下GPIO配置的原因导致功耗偏高。
运行模式时的电流
睡眠模式PLL开启时的电流
3、修改官方例程
在进入深度睡眠模式之前,把GPIO配置为模拟输入可以最省电,这里我直接把GPIO和串口配置的代码都屏蔽了
重新烧录,1.8V供电测试,测试功耗已经和手册描述的8.54uA十分接近
至此,测评结束。
|