打印
[蓝牙芯片]

CH592睡眠电流偏大

[复制链接]
2395|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  使用CH592EVT\EVT\EXAM\BLE\HID_Consumer例程 测试电流。
  HAL\include\CONFIG.h里面修改:
  #define DCDC_ENABLE                         TRUE
  #define HAL_SLEEP                           TRUE

  APP\hidconsumer.c 修改:
  line: 206         uint8_t initial_advertising_enable = FALSE;
  line:425          uint8_t initial_advertising_enable = FALSE;

  ch592评估板(不带LCD显示屏的这款),去掉LED D1。
  最后测试电流在10.7uA。
  
  请问,这个电流是否还可以减小?看起来是偏大了,规格书P33里面, 应该在3uA左右。

使用特权

评论回复
沙发
JayWell| | 2023-11-3 14:34 | 只看该作者
手册里的电流都是实际测试的,可以用PM例程+沁恒官方评估板最小系统进行测试。
多了几个uA,可能是板子上LDO的开销;也可能是某些GPIO没有固定电平导致漏电;某些引脚焊接不好,也可能导致有小几个uA的偏差;还有注意一下测试手法,万用表要串联进电源电路进行测试,测试板上不要有多余的接线,包括USB线也要断开,只留V33和GND进行供电。参考一下这个博客排查问题呢。
https://www.cnblogs.com/JayWellsBlog/p/17441110.html
下图是HID_Consumer的实测电流,休眠期间底电流在3uA以下没问题。

91663654493ad436cf.png (258.54 KB )

91663654493ad436cf.png

使用特权

评论回复
板凳
Sam131208|  楼主 | 2023-11-6 15:51 | 只看该作者
JayWell 发表于 2023-11-3 14:34
手册里的电流都是实际测试的,可以用PM例程+沁恒官方评估板最小系统进行测试。
多了几个uA,可能是板子上LD ...

   用PM的例程测试,拆了LDO后,电流符合规格书了。
   另外有个问题, 使用  PB的GPIO_Pin_22做按键,GPIOB_ReadITFlagPort(),或者 GPIOB_ClearITFlagBit()有bug? 有时候编译报错,再次编译又通过。 而且中断不正常。
   改用PA的GPIO_Pin_5 中按键中断后,中断似乎正常了,但是,电流又开始不正常了。
   搜索了论坛里面,发现CH579M有以下问题,是否CH592也有同样问题?:

   注意事项:
   对于下降沿或者低电平唤醒,在进入休眠时候必须保证 对应的IO是高电平,否则电流会比较大,mA级
   对于上升沿或者高电平唤醒,在进入休眠时候必须保证 对应的IO是低电平,否则电流会比较大,mA级

使用特权

评论回复
地板
caigang13| | 2023-11-6 21:49 | 只看该作者
相关IO怎么配置和处理的?

使用特权

评论回复
5
2539752622| | 2023-11-7 10:27 | 只看该作者
可以直接清除PB8,因为PB22/PB23清除标志右移14位,GPIO.h是有标注的。使用PB例程测试就是有配置了GPIO唤醒的,默认使用PA5。因此建议直接使用PM例程,将IDLE/HALT/SHUTDOWN的if语句屏蔽即可,然后直接测试电流。注意引脚默认配置的是输入上拉,去掉小灯,去掉ldo。


使用特权

评论回复
6
Sam131208|  楼主 | 2023-11-9 17:36 | 只看该作者
caigang13 发表于 2023-11-6 21:49
相关IO怎么配置和处理的?

  CH592EVT\EVT\EXAM\BLE\HID_Consumer 这个例程, 在打开睡眠选项后,所有IO都是拉高输入。
  PA5 按照PM例程里面设置了中断。
  PA5按下后并释放后,有时候电流正常,< 3uA, 有时候280+uA, 有时候又是1.6ma,没有规律。

使用特权

评论回复
7
Sam131208|  楼主 | 2023-11-9 17:45 | 只看该作者
2539752622 发表于 2023-11-7 10:27
可以直接清除PB8,因为PB22/PB23清除标志右移14位,GPIO.h是有标注的。使用PB例程测试就是有配置了GPIO唤醒 ...

  PB22/PB23的使用,规格书里面没有介绍R16_PB_INT_IF, 哪里可以看到更详细的信息?
  通常来说,使用评估板/开发板的按键更方便。WCH是否应该完善一些规格书的资料, 它看起来不像一个老旧保守的技术公司,喜欢把资料隐藏起来。

使用特权

评论回复
8
chenjun89| | 2023-11-9 23:21 | 只看该作者
相关的外设和IO配置还没有关闭

使用特权

评论回复
9
Sam131208|  楼主 | 2023-11-10 09:33 | 只看该作者
chenjun89 发表于 2023-11-9 23:21
相关的外设和IO配置还没有关闭

   如果你是技术支持人员,或者热心帮助的热侠之人,请多指教,详细说多点。
   以下是CH592EVT\EVT\EXAM\BLE\HID_Consumer例程的修改:
   HAL\include\CONFIG.h里面修改:
  #define DCDC_ENABLE                         TRUE
  #define HAL_SLEEP                           TRUE

  APP\hidconsumer.c 修改:
  line: 206         uint8_t initial_advertising_enable = FALSE;
  line:425          uint8_t initial_advertising_enable = FALSE;

  APP\hidconsumer_main.c 修改(在DEBUG初始化后面增加中断初始化):
#ifdef DEBUG
    GPIOA_SetBits(bTXD1);
    GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
#endif
#if 1
    /* 配置唤醒源为 GPIO - PA5 */
    GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒
    PFIC_EnableIRQ(GPIO_A_IRQn);
    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
#endif

   在main()函数外增加中断处理:
   __INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5);
}
     

     以上是修改CH592EVT\EVT\EXAM\BLE\HID_Consumer例程, 然后开始测试,多短接几次PA5,就可以看到电流维持在1.3mA.
     如果你既非技术支持人员,也非热心帮助的热侠之人,请到别处去逛逛。

使用特权

评论回复
10
2539752622| | 2023-11-10 11:26 | 只看该作者
①在基于consumer例程,将蓝牙、TMOS任务关闭,仅保留gpio中断唤醒,这时候可以正常进入睡眠。但是如果GPIO中断唤醒后没有执行任何操作,则可能出现一种情况:GPIO(PA5)进行下降沿触发进入中断,但是没有任何操作,并且也没有接下来的任何功能需要执行,则芯片会直接进入lowpower函数并进入睡眠(协议栈管理的),但是此时可能PA5还插在了GND上,此时的芯片就会以低电平的状态进入睡眠,并且进入的idle模式的睡眠,此时的功耗是ma级别的。一直到下一个触发唤醒。如果是基于consumer例程,那么会在2min之后的rtc校准的tmos到来的时候,芯片被唤醒,被再次进入sleep模式的睡眠(3ua左右)。
针对你当前的功能描述,可以这样操作:在进行GPIO唤醒的时候,判断你的任务是否有执行结束并置标志,如果没有执行结束,则通过在lowpower函数中查询未结束标志,并立马return出去,这样就不会再进行睡眠,一直到你的任务执行已经结束,则不再return并正常进入睡眠。
实际使用的时候,一般是有实际的任务功能需要执行,比如进入gpio中断服务函数,后面会有tmos查询,则会有协议栈管理好睡眠的。
②如果是不需要使用蓝牙或者tmos,则自行管理调用睡眠函数即可,不需要在蓝牙中进行调用管理。
③中断的使能配置,在EVT中就有,是有手动右移14位的。即上方截图,可查看。

使用特权

评论回复
11
weifeng90| | 2023-11-11 10:30 | 只看该作者
那是因为要得到最低的功耗,还要配置没有用的外设和IO。

使用特权

评论回复
12
Sam131208|  楼主 | 2023-11-13 11:13 | 只看该作者
2539752622 发表于 2023-11-10 11:26
①在基于consumer例程,将蓝牙、TMOS任务关闭,仅保留gpio中断唤醒,这时候可以正常进入睡眠。但是如果GPIO ...

   谢谢你的回复。

  
但是此时可能PA5还插在了GND上,此时的芯片就会以低电平的状态进入睡眠,并且进入的idle模式的睡眠,此时的功耗是ma级别的


   lowpower函数是否可以修改?
   我的按键扫描处理,在检测到中断后,利用tmos_start_task()开启定时扫描处理,不会等待按键释放。从你的描述看,tmos_start_task()定时溢出后,电流应该会下降到3uA,实际测试并没有。此时有两种情况:
1.    唤醒后,lowpower()还是会进入idle模式。
2.    tmos_start_task()没有唤醒芯片?

使用特权

评论回复
13
2539752622| | 2023-11-13 17:31 | 只看该作者
lowpower函数可以手动修改。
在出现按键唤醒后,再次进入睡眠,该问题的解释是上面之前描述的。
其本质的原因是进入了idle模式。
则我们需要确保不进入idle即可。
因此你可以先直接使用consumer例程进行测试。默认的例程在进入中断后,然后会有蓝牙广播/TMOS任务等,可以确保协议栈是被唤醒后执行完了任务才进入睡眠的。
如果是需要直接进入低功耗的状态,则可以进行在lowpower函数中置标志来管理。
针对上面的描述如果还存在疑问,可以发送邮件至邮箱lpc@wch.cn,沟通会更加方便一点。

使用特权

评论回复
14
yangxiaor520| | 2023-11-14 08:20 | 只看该作者
要达到这个功耗,还需要对没有用的外设和IO进行配置。

使用特权

评论回复
15
Sam131208|  楼主 | 2023-11-14 11:23 | 只看该作者
本帖最后由 Sam131208 于 2023-11-14 11:26 编辑
2539752622 发表于 2023-11-13 17:31
lowpower函数可以手动修改。
在出现按键唤醒后,再次进入睡眠,该问题的解释是上面之前描述的。
其本质的原 ...

    我分析了CH59x_LowPower()函数,愣是不知道怎么修改。里面没有idel的入口,无法增加限制或宽松的进入条件。 另外,进入睡眠的条件是RTCTigFlag=false, 不是很 清晰这个条件的设置有什么影响。
    从CH59x_LowPower()函数分析看,不清楚为何会导致进入idle模式的。按键扫描定时器定时为20ms, 显然不会返回2, 那么就是RTCTigFlag 限制了进入睡眠了。
    这个问题,只能WCH的团队修改了。    另外,让人无法理解的是,为何会在中断口电平为GND的时候,就让程序进入idle模式。

使用特权

评论回复
16
2539752622| | 2023-11-14 11:41 | 只看该作者
修改参考:

1.png (370.46 KB )

1.png

使用特权

评论回复
17
Sam131208|  楼主 | 2023-11-14 16:14 | 只看该作者
本帖最后由 Sam131208 于 2023-11-14 16:16 编辑

   这样返回意义何在?
   我看到,睡眠入口应该在后面的这里:
    // LOW POWER-sleep模式
    if(!RTCTigFlag)
    {
        LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM24K | RB_PWR_EXTEND | RB_XT_PRE_EN );
        HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
        i = RTC_GetCycle32k();
        while(i == RTC_GetCycle32k());
        return 0;
    }
  要进入睡眠模式,应该是修改进入的条件吧?
   

使用特权

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

本版积分规则

32

主题

101

帖子

0

粉丝