跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. ME0-demo_PowerDown_PollingWeakup

ME0-demo_PowerDown_PollingWeakup

已定时 已固定 已锁定 已移动 YTM32B1M系列
demo
2 帖子 2 发布者 233 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • ytm0267Y 离线
    ytm0267Y 离线
    ytm0267
    写于 最后由 ytm0267 编辑
    #1
    1. 背景
    • powerdown模式下polling唤醒
    1. 需求
    • 100ms周期唤醒,由 powerdown mode---active 状态,Active保持200us;
    • active 状态下打开10个IO口,4路AD ,用来做唤醒判断;
    • ADC可以唤醒(powerdown模式下不能直接使用ADC唤醒,可以使用acmp模块间接ADC唤醒);
    • 云途ME0 ev板测试睡眠电流大小;
    • SDK: 1.3.1 , gcc
    1. 解决方案描述
    • 步骤1:使用lptmr定时100ms定时自动唤醒(此唤醒是WKU模块的lptmr硬件中断唤醒),保证唤醒时间保持200us,并测量开发板的powerdown模式整板功耗;
      1c6e2dd8-3532-4121-95af-568f8427c87d-image.png
    • 步骤2:定义restart_init函数,在starup.s中的ram初始化之前添加汇编代码通过判断进入restart_init函数,若restart_init没有唤醒条件,则直接休眠,若有唤醒条件则去唤醒,之后再运行主程序;
      100bb68e-f12e-4587-bd10-35114fd11a26-image.png
    • 判断REGFILE->DR[0]的原因是此寄存器在powerdown模式下存储的数据不会丢失;
      7d28f620-8c81-41e4-ba7e-5194f8869dd0-image.png
    • 步骤3:在restart_init函数中实现打开10个IO及采4路ADC的值(10个IO,9个输入状态,检测输入值可以做手动唤醒,1个输出用作翻转;4路AD全部使用的是ADC0的通道,所以只开了ADC0的时钟);
    • 唤醒逻辑:进休眠前配置REGFILE->DR[0]=0x55, lptmr硬件中断唤醒后通过判断(防止非休眠导致的reset进入restart_init,因此判断REGFILE->DR[0]是否为0x55)进入restart_init函数,此时处于半唤醒状态(即过200us后继续进休眠,程序不会顺序向下执行到main函数处),在restart_init函数中可以判断IO口状态及ADC采样值,若满足全唤醒条件则可以配置REGFILE->DR[1]=0x55进行全唤醒操作(即程序不再进入休眠,而是顺序向下执行到main函数处);
      74dcef42-726f-4969-93a5-f81b1e166d6a-image.png
    • 步骤4:测试restart_init函数运行所需要的时间,保证唤醒能保持200us;
    • 步骤5:测量平均休眠功耗;
    1. 示例说明
    • 步骤1配置lptmr 100ms唤醒,整板功耗测试powerdown大概是97ua左右,此时休眠下enable SIRC:
      c90ab75b-0952-4675-bac8-7a2d290213c1-image.png
      72b1e653-c889-4686-9e3f-52318eb317a8-image.png
    • 步骤4测试程序唤醒后能保持够200us,因此程序加了延时,使之100ms唤醒后保持200us在进入休眠;
      3bebe52d-2f8b-4f0c-871c-062f1c7ab3b1-image.png
    • 步骤5测试数据:polling时间为200us,功耗为138ua
      82e9b757-5d25-4439-9f07-0aa2ed0e8cb6-image.png
    1. 工程代码
    • 代码中可以看到增加的有可选代码,Acmp的唤醒方案,可以通过宏定义打开,ACMP目前比较的是ACMP_ch0(正端,也是adc_ch0的采样值,两者是同一个通道)和内部dac(负端,配置的是(128/256)*vref(4096)),当正端值低于负端值触发中断进行唤醒;
      13d25e2c-b738-43b2-8716-1be7fe6d740b-image.png
    • 变量的定义要放到retention_ram区域,避开重启后的ram初始化,注意lptmr和acmp的唤醒配置;
      1bb0b7c2-d5d4-473a-8cfb-feeec3914c11-image.png
    • 程序中会不停查询demo板上SW3的状态,按下后即进入休眠状态;
      ed070a73-86aa-42c8-961f-b0feae4a37cd-image.png
    • 综上所述:此demo程序通过按下SW3进入休眠状态,lptmr每100ms进行半唤醒,可以通过按下SW2或者提高adc_ch1采样值(旋动AN1/RP1变阻器)进入全唤醒;若开启acmp唤醒,则需要调节adc_ch0的采样值(旋动AN2/RP2变阻器)使之小于 vref(4096)/2 即可直接进行全唤醒;
    • 功耗测量:将电流表接在demo板J8两端,注意断开debug口;
      ME0_Powerdown_Polling_wakeup.zip
    1 条回复 最后回复
    2
    • YTCQ_shejiwangY 离线
      YTCQ_shejiwangY 离线
      YTCQ_shejiwang YunTu
      写于 最后由 编辑
      #2

      从PD模式下唤醒,引起复位,对应RSSR寄存器的值,是没有的是吗?

      image.png
      实测也是没有影响的:

      image.png

      1 条回复 最后回复
      1

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YCT离线License申请流程

      帮助没办法联网的电脑使用YCT

    • YT CONFIG TOOL调查问卷

      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

    • demo
      12
      can
      9
      lin stack
      6
      yt-link
      5
      vscode
      3
      adc模块
      2
      i2c
      2
      uuid
      2
      Online Users
      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门