打印
[活动专区]

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

[复制链接]
468|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、设计目的
在低功耗模式下正常运行以下功能:
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[usart1RxIndex++] = 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 */
  }
}
        四、最后下载验证即可。

代码,如下:
LPFrame.zip (2.42 MB)



使用特权

评论回复
沙发
问天少年| | 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的话还是很低的

使用特权

评论回复
5
怀揣少年梦|  楼主 | 2024-12-12 17:02 | 只看该作者
呐咯密密 发表于 2024-12-12 10:01
200ua的话还是很低的

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

使用特权

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

本版积分规则

个人签名:一切皆有可能

34

主题

413

帖子

2

粉丝