怀揣少年梦 发表于 2024-12-9 23:13

【AT-START-L021测评】06 基于AT32L021 低功耗框架设计

一、设计目的
在低功耗模式下正常运行以下功能:
1、能够在正常进行LED翻转;

2、能够正常以115200波特率接收串口数据;并进行数据处理

3、能够适用物联网进行周期性收发数据的低功耗场景,并且能够进行设备状态的正常显示。

二、设计思路
1、设计基础
1)基于AT32L021的深度休眠模式下,SRAM和寄存器的内容是保持的,并且IO口的状态与运行模式保持一样状态,从以上特性可以获取以下信息:
——进出低功耗模式,不需要重新配置相关外设或者IO参数
——关于电源的配置可以在初始化里面进行操作,不需要每次进行操作;


2)AT32L021系统从深度睡眠模式退出时,默认选择HICK RC 振荡器开启并在稳定后被选为系统时钟,那么可以只配置LEXT外部晶振,高速晶振选择HICK,并进行分频。


2、思路
1)使用内置ERTC对于系统周期性唤醒,并点亮LED;为了加强秒的精度,不使用内置晶振;
2)配置内置HICK为系统时钟,为了进一步降低功耗,就选择16Mhz作为是系统时钟频率,另外一方面,16Mhz唤醒的时间也不会短。
3)设置内置LDO为低功耗模式。

三、代码编写
1、按照上述思路,配置LEXT和系统时钟
1)使能LEXT


2)设置系统时钟源为HICK 48,并设置分频值为4;


2、使能ERTC,启用内部唤醒,并开启中断


3、使能串口,并开启中断


4、编写串口唤醒代码
void usart1_wakeup_config(void)
{
exint_init_type exint_init_struct;

/* keep usart work when deepsleep */
usart_deep_sleep_mode_enable(USART1, TRUE);

/* low power wakeup method is receive data buffer full */
usart_low_power_wakeup_set(USART1, USART_WAKEUP_METHOD_RDBF);

usart_interrupt_enable(USART1, USART_LPWUF_INT, TRUE);

/* config the exint line of the usart1 */
exint_init_struct.line_select   = EXINT_LINE_25;
exint_init_struct.line_enable   = TRUE;
exint_init_struct.line_mode   = EXINT_LINE_INTERRUPT;
exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
exint_init(&exint_init_struct);
}

5、编写ERTC中断和串口中断处理函数
ERTC中断和串口处理函数
void ERTC_IRQHandler(void)
{
/* add user code begin ERTC_IRQ 0 */
if(ertc_interrupt_flag_get(ERTC_WATF_FLAG) != RESET)
{
    /* clear ertc alarm flag */
    ertc_flag_clear(ERTC_WATF_FLAG);
                wakeUpFalg = ERTC_WAKE_UP;
                g_exitLowPower = 1;
    /* toggle led */
}
if(exint_interrupt_flag_get(EXINT_LINE_20) != RESET)
{
    /* clear exint line flag */
    exint_flag_clear(EXINT_LINE_20);
}
/* add user code end ERTC_IRQ 0 */
/* add user code begin ERTC_IRQ 1 */

/* add user code end ERTC_IRQ 1 */
}void USART1_IRQHandler(void)
{
/* add user code begin USART1_IRQ 0 */
if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
{
    /* clear rdbf flag */
    usart1RxBuf = usart_data_receive(USART1);
                g_exitLowPower = 1;

}

if(usart_interrupt_flag_get(USART1, USART_LPWUF_FLAG) != RESET)
{
    usart_flag_clear(USART1, USART_LPWUF_FLAG);
}

if(exint_interrupt_flag_get(EXINT_LINE_25) != RESET)
{
    exint_flag_clear(EXINT_LINE_25);
}
/* add user code end USART1_IRQ 0 */
/* add user code begin USART1_IRQ 1 */

/* add user code end USART1_IRQ 1 */
}

6、编写主函数
int main(void)
{
/* add user code begin 1 */
pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V2);
/* add user code end 1 */

/* system clock config. */
wk_system_clock_config();

/* config periph clock. */
wk_periph_clock_config();

/* nvic config. */
wk_nvic_config();

/* timebase config. */
wk_timebase_init();

/* usart1 already supports printf. */
/* init usart1 function. */
wk_usart1_init();

/* init ertc function. */
wk_ertc_init();

/* init gpio function. */
wk_gpio_config();

/* add user code begin 2 */

        gpio_bits_set(GPIOB,GPIO_PINS_11);
        wk_delay_ms(5000);
/* add user code end 2 */

while(1)
{
    /* add user code begin 3 */
    if (g_enterLowPower) {
                        g_enterLowPower = 0;
                        enter_lower_power_mode();
                }
               
                if (g_exitLowPower) {
                        g_exitLowPower = 0;
                        exit_lower_power_mode();
                        /*这里放置相关处理函数,处理完就进入低功耗模式*/
                        g_enterLowPower = 1;
                }

                gpio_bits_toggle(GPIOB,GPIO_PINS_11);
    /* add user code end 3 */
}
}         四、最后下载验证即可。
代码,如下:




问天少年 发表于 2024-12-10 18:41

运行这两个功能的情况下功耗多少

怀揣少年梦 发表于 2024-12-11 09:12

问天少年 发表于 2024-12-10 18:41
运行这两个功能的情况下功耗多少

没有实测,没有相应的监测平均电流的仪器。使用万用表看到的数据,在200uA左右跳动

呐咯密密 发表于 2024-12-12 10:01

怀揣少年梦 发表于 2024-12-11 09:12
没有实测,没有相应的监测平均电流的仪器。使用万用表看到的数据,在200uA左右跳动 ...

200ua的话还是很低的

怀揣少年梦 发表于 2024-12-12 17:02

呐咯密密 发表于 2024-12-12 10:01
200ua的话还是很低的

整体来看,功耗做的还是挺不错的

可怜的小弗朗士 发表于 2024-12-18 14:09

这个唤醒只用初始化时钟就行了吗
页: [1]
查看完整版本: 【AT-START-L021测评】06 基于AT32L021 低功耗框架设计