系统工程 - 记录一次调试USB设备低功耗应用的过程

news2025/1/13 13:17:32

系统工程 - 记录一次调试USB设备低功耗应用的过程

文章目录

  • 系统工程 - 记录一次调试USB设备低功耗应用的过程
    • 需求
    • 功耗测量方法
    • 分析功耗来源
      • LED功耗
      • MCU功耗
      • 板子漏电
    • 软件改善功耗
      • 调整tinyusb协议栈源码
      • 降低主频
      • 电脑唤醒usb设备
      • 退出低功耗
      • 进入STOP模式
    • 总结

需求

最近在同客户做机械键盘的产品设计,我们SE系统工程团队为客户设计了一套使用灵动MM32F0160微控制器的机械键盘原型电路板,用于评估原型方案。随着同客户不断沟通,客户进一步细化了需求,这次对低功耗特别提了要求:根据USB规范约定,当电脑处于待机状态时,USB设备从USB线缆上获取的电流不能超过2.5mA,这个2.5mA不仅仅是MCU的工作电流,而是整个USB设备电路板的工作电流!

此前在设计键盘原型方案的时候,并未考虑低功耗的问题,电脑在待机状态下,实测键盘的功耗超过100mA。现在看来,这显然是不符合客户需求和USB规范的,因此,需要从系统层面上考虑,充分降低USB设备的功耗。

最后,经过一顿调试,使得键盘在低功耗的待机模式下耗电约0.8mA,正常工作时约16mA。如图x所示。
在这里插入图片描述

功耗测量方法

欲要调试低功耗,先要搭建测量低功耗的环境。本案中,将一根USB线缆的VBUS信号线从中间截断并串联电流表,以检测VBUS上的电流值。如图x所示。
在这里插入图片描述

图x 功耗测量方法

在这里插入图片描述

图x 万用表连接实物图

分析功耗来源

分析USB电路板的功耗来源:

  • MCU自身功耗
  • 电路板其它电路功耗,例如板子上87颗WS2812B彩灯和LED指示灯
  • 板子漏电或者短路???

另外,还有LDO和为适配WS2812B电平转换而引入的NMOS管。按理说LDO功耗极低,NMOS所有的引脚都是高电平的情况下,也不会产生漏电流。

LED功耗

MCU的功耗可通过软件控制,每颗WS2812B中都包含了一个灯控IC,它也是会产生功耗的,但不至于那么高(???)。

键盘参考方案中有87颗WS2812B用来产生灯效,如果焊接时间过长,则可能被损毁造成短路,而一旦器件短路,上电后很难查出是哪颗WS2812B短路,给维修造成了极大的麻烦。为解决这个问题,电路设计工程师在设计PCB的时候,曾在键盘的侧边加入了 6个0欧电阻,对应按键的的6排,让供电电流通过0欧电阻流入WS2812B。当出现短路时,可以拆除对应排的0欧电阻,以快速排查短路的WS2812B。

  • 拆除六颗0欧电阻前,功耗达到了惊人的115mA。
  • 逐步拆除六颗0欧电阻后,功耗降至18mA。

WS2812B的待机功耗确实不小。

除了WS2812B,电源指示灯的功耗很难被注意到。电源指示灯的串联电阻为2K欧,如果LED的正向压降为2V,在5V供电的情况下,至少有1mA的电流从电源指示灯流过,对于总功耗不能超过2.5mA的USB设备而言,1mA也是一笔巨大的支出,需要节省掉。

其余指示灯LED可由程序控制,在熄灭时不消耗额外的电流。

后续设计键盘上的背光彩灯时,可以再加入一个PMOS管,可由软件控制是否对背光灯电路供电。当进入休眠状态时,关断对背光电路的供电。

MCU功耗

去掉那六颗给WS2812B灯带供电的0欧电阻和电源指示灯后,剩下的十几毫安电流看起来就是MCU自身的功耗了。正常情况下,MCU消耗十几毫安的电流是正常的,但现在需要进一步降低功耗,以满足客户需求。

相当于正常运行的工作模式MCU带有多种低功耗模式,适合用于USB的低功耗方案是STOP模式(休眠CPU内核和部分外设,但可以通过中断原地唤醒),理论功耗能够低于0.5mA。

但 USB 设备有几个情况需要考虑:

  • Host能让Device进入低功耗状态
  • Host能让Device从低功耗状态恢复到工作状态
  • Device能让Host从Suspend恢复到工作状态

如果只需要让PC主机Host唤醒Device恢复到工作状态,PC主机通过USB发送Resume中断信号,从机设备捕获到就能恢复工作状态。但Device需要能唤醒Host从Suspend恢复过来,就要求矩阵按键不能停止扫描,随时检测用户是否按下按键,判断是否退出低功耗模式,此时可选择使用降低主频的方法实现低功耗模式。

在继续调试的过程中发现,保持低速的扫描,键盘反应比较慢,体验不好。客户建议使用中断方式捕获按键输入触发唤醒。此时,将每一个列引脚都配置为推挽输出拉低电平,把每个行引脚配置为上拉输入,6个行引脚意味着6个外部中断,如此,当任意按键被按下时,总会有一个行引脚编变成低电平,触发外部中断,退出低功耗模式,唤醒计算机。Bingo。

总结下来有两种方法:

  • 降低主频,适用于在低功耗运行模式时,仍需与外部电路进行有限交互的场景
  • STOP模式,适用于不需要与外设进行有交互信但需要保留现场的场景,可通过引脚(指定的外部通信)触发唤醒。

板子漏电

板子漏电仍是一个值得思考的方向:

  • 键盘上面的元器件全部都是手焊的,这就意味着会有一些焊锡或者其它脏东西在偷偷地漏电。
  • 键盘的 PCB 尺寸还是相当大的,拿起,放下,也可能会造成板材变形,铺铜断裂或短路等情况。
  • PCB 被尖锐物品划伤,或者 PCB 设计时就有问题……

当然,经过检查,板子的质量问题是没有的,用洗板水和酒精擦拭后,功耗也几乎没有变化。

所以,幸好没出问题。

软件改善功耗

从上文分析来看,WS2812B灯带和电源指示灯产生比较大电流消耗,当当前的参考方案中,暂行移除,以减少不必要的功耗。然后,重点就转移到软件上对唤醒机制的实现。

调整tinyusb协议栈源码

本案中使用的TinyUSB协议栈提供了一个tud_suspend_cb()回调函数,当电脑待机时候,会向USB设备发送待机信号,USB设备上的TinyUSB程序会调用这个回调函数。注意,在TinyUSB的device/usbd.h文件中,定义了tud_suspend_cb()是一个弱函数TU_ATTR_WEAK

但尚不清楚为什么在用户应用程序中已经实现一个弱函数后,Keil MDK依然会判断函数地址为0,所以人为修改TinyUSB协议栈的源码,移除这个弱函数的声明,同时显式调用tud_suspend_cb()函数。

void tud_task_ext(uint32_t timeout_ms, bool in_isr)
{
    ...
      case DCD_EVENT_SUSPEND:
        // NOTE: When plugging/unplugging device, the D+/D- state are unstable and
        // can accidentally meet the SUSPEND condition ( Bus Idle for 3ms ), which result in a series of event
        // e.g suspend -> resume -> unplug/plug. Skip suspend/resume if not connected
        if ( _usbd_dev.connected )
        {
          TU_LOG(USBD_DBG, ": Remote Wakeup = %u\r\n", _usbd_dev.remote_wakeup_en);
//          if (tud_suspend_cb) tud_suspend_cb(_usbd_dev.remote_wakeup_en);
            tud_suspend_cb(_usbd_dev.remote_wakeup_en);
        }else
        {
          TU_LOG(USBD_DBG, " Skipped\r\n");
        }
      break;
   ...
}

这也是之前键盘不能唤醒主机的原因:TinyUSB没意识到电脑之前已经进入待机状态了,所以再唤醒时,不会发出唤醒信号。

降低主频

修改主频的方法就是修改 PLL 的倍频系数,从 72MHz 改为 12MHz,1MHz,MCU的功耗也从两位数降至一位数,但依然高达 5mA 以上,继续降至 500KHz,好像也没有什么效果。

查了手册后发现,可以继续将系统时钟切换到LSI 上,它只有 40KHz 左右的频率。即使降低主频到 40KHz,功耗依然高达4mA。

虽然降低了系统时钟,但还有两个高主频的时钟发生器在工作: PLL1 和 PLL2,其中,PLL1 为系统提供 72MHz 的工作时钟,PLL2 为 USB 提供 48MHz 的工作时钟。切换系统时钟到 LSI 后,PLL1 就不用了,关闭后,功耗降至 2.9mA。继续试着关PLL2,但PLL2一旦被关闭,USB外设引擎也就停用了,不能捕获PC发送过来的suspend信号。到时候试着用按键唤醒芯片吧,关掉PLL2试试看。关闭 PLL2 后,功耗降到 1.8mA,等键盘矩阵扫描到有按键按下后,恢复这个 PLL2,USB还是能继续工作的。

但是,因为USB外设引擎没有时钟驱动不能工作,收不到电脑发来的suspend信号,电脑就再也唤不醒键盘了!

电脑唤醒usb设备

由于关闭了 PLL2,造成 USB 停止工作,因此当电脑唤醒设备的时候,MCU接收不到来自电脑的唤醒信号,MCU始终处于低功耗模式。

这里只能使用一些奇怪的招式。

电脑唤醒设备的时候,USB的信号线上是会出现电平的变化的,如果使用某个引脚检查这个电平变化,就可以知道电脑要唤醒设备了,让设备退出低功耗模式。

PA12 引脚作为 USB D+ 信号线,能否配置 PA12 引脚检查这个电平变化呢?经过实验是不行的,PA12引脚一直被USB占用(USB设备被停了时钟,但未停电),无法读取 PA12 的电平变化,即使关闭了USB 的RCC时钟也不行(仅关闭访问USB寄存器区域的地址映射),必须使用USB_Enable(false)关闭 USB 外设才能释放引脚。但执行了这个功能后,USB 整个外设的大部分逻辑就会被重置,不可行。

此时,从USB D+信号上飞一根信号线到别的GPIO引脚,用这个引脚检测电平的变化。键盘原型电路板右侧留有为扩展数字键盘的接口,上面有一个 PB15 引脚,适合用于检测 USB D+ 电平变化。如图x所示。

在这里插入图片描述

图x 捕获电脑唤醒USB设备的外部中断线

软件处理上,配置PB15可以捕获外部中断,当MCU进入低功耗状态时,打开外部中断,下降沿触发中断,退出低功耗状态时,关闭外部中断,清除触发方式。可行。

退出低功耗

前面为了最大限度地降低MCU的功耗,将系统时钟切换到 LSI,关闭 PLL1 和 PLL2,关闭了指示灯。退出低功耗时,就需要把这些功能再重新打开。

为了加快从低功耗模式到正常模式的速度,退出低功耗应先打开PLL1和PLL2,切换系统时钟到 PLL1 上,然后再打开指示灯,进入正常的工作模式。

将以上退出低功耗的过程相当于重新初始化了整个芯片的时钟系统,故可调用板子初始化过程中配置时钟的函数BOARD_InitBootClocks(),分别在外部中断和应用层唤醒电脑之前执行这个函数。

经过实验,键盘的待机电流低至2mA以下,键盘能唤醒电脑,电脑也能唤醒键盘。但总得按下键盘任意键等一会,或者不停地按按键,才能唤醒键盘,这不是一个好消息。

进入STOP模式

在未引入中断唤醒的方法时,仅通过降低主频降低功耗后,键盘从低功耗状态下唤醒总是反应很慢。降低主频的方法虽然保证了键盘能够一直被扫描,但40KHz的工作频率,扫描一次键盘花费的时间长达0.5s,要是很快地按下一次按键,则键盘可能扫描不到按键被按下,表现就是没反应,或者唤醒电脑唤醒地慢,这并不是一个可被接受的结果。

根据客户的建议,待机唤醒仅需要知道有按键按下就行,至于按下了哪一个按键,是不需要被关心的,因此只需要判断哪一行的按键被按下即可,这样只需要6个外部中断。

使用外部中断会有一个问题,例如,若把PA0用作外部中断源,则PB0就不能再被用作外部中断源,这算是灵动MCU芯片设计的一个限制。幸好,设计电路的工程师在设计键盘原理图时,因为某种神秘的强迫症,想方设法把6个行引脚强制选到了 GPIOB 上,避免了外部中断源冲突的问题。如此,在软件中只要分配一个外部中断服务函数即可捕获6个中断源。

使用外部中断检测按键是否被按下的事件,就可以使用MCU的STOP模式进一步降低功耗。如果需要知道是哪个按键被按下(比如说 Cherry 键盘唤醒主机后,被按下的那个按键还是会有特定的灯效),只需要让设备恢复过来后,趁用户还没把按键松开的时候,再扫描一遍键盘即可,一般来说,从按键被按下到按键被松开,至少会有 10ms 以上的时间,足够MCU唤醒后,再扫描一次键盘了。

此时,选择"STOP模式+外部中断"的唤醒方案,前面提到的降低主频,人为关闭 PLL 等操作就都不需要考虑了:进入STOP模式后,CPU直接暂停工作,并自动关停所有PLL。外部中断唤醒且执行完外部中断服务程序后,CPU会被原地唤醒继续工作。但需要注意到,从STOP模式唤醒后,MCU的系统时钟源换成了HSI,PLL均全部关闭,因此需要在中断函数中再重新配置一次系统时钟,启用PLL,包括USB的48MHz时钟。

/* exti interrupt handler. */
void EXTI15_4_IRQHandler(void)
{
    /* config the clock. */
    BOARD_InitBootClocks();
    BOARD_EnableLEDPins(true);

    /* get exti line. */
    uint32_t flags = EXTI_GetLineStatus(EXTI);

    /* deinit exti. */
    for (uint32_t i = 0; i < KB_MTX_LINE_PIN_NUM; i++)
    {
        EXTI_SetTriggerIn(EXTI, 1 << kb_mtx_line_pins[i].Pin, EXTI_TriggerIn_Disable);
        EXTI_EnableLineInterrupt(EXTI, 1 << kb_mtx_line_pins[i].Pin, false);
    }
    EXTI_SetTriggerIn(EXTI, EXTI_LINE_15, EXTI_TriggerIn_Disable);
    EXTI_EnableLineInterrupt(EXTI, EXTI_LINE_15, false);
    EXTI_ClearLineStatus(EXTI, flags);
    NVIC_DisableIRQ(EXTI15_4_IRQn);

    /* set row gpio to high. */
    for (uint32_t i = 0; i < KB_MTX_ROW_PIN_NUM; i++)
    {
        GPIO_SetBits(kb_mtx_row_pins[i].GPIOx, 1 << kb_mtx_row_pins[i].Pin);
    }

    /* send event to tinyusb. */
    if ( 0u != ( flags & EXTI_LINE_15 ) ) /* Interrupts. */
    {
    }
    else
    {
        tud_remote_wakeup();
    }
}

经过实验,使用这种方法能够使MCU在低功耗状态下的功耗降至1mA以下。

总结

本例根据客户需求,从系统层面上优化了以MM32F0160为主控的USB机械键盘参考方案的待机功耗。满足了USB键盘在低功耗状态下待机电流小于1.8mA的需求(实际仅为0.8mA左右)。

通过调试电路系统,发现提供背光效果的WS2812B灯带和电源状态指示灯耗电巨大,暂且移除相关电路。后期若要保留灯效,可通过PMOS管电路控制供电。

通过调试软件,使用外部中断配合MCU的STOP低功耗模式,解决了PC机和USB键盘双向唤醒的问题:

  • PC机发送suspend信号触发TinyUSB中断让USB键盘进入休眠;
  • PC机发送resume信号无法触发TinyUSB的中断,但USB键盘通过IO引脚上的外部引脚中断捕获到来自键盘上的唤醒事件;
  • USB键盘通过IO引脚上的外部中断捕获来自键盘矩阵上的唤醒信号,唤醒自身MCU后,再通过USB发送resume信号进一步唤醒PC机。

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python 随练】寻找完数

题目&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如 61&#xff0b;2&#xff0b;3.编程找出 1000 以内的所有完数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个数学问题&#xff1a;如何找出 1000 以内的所有…

Stable diffusion WebUI txt2img使用教学

本篇文章将深入探讨如何在Stable Diffusion WebUI上进行各项参数的调整。将以txt2img为主要讨论对象&#xff0c;探讨诸如基本设定Sampling method以及CFG scale等参数的调整&#xff0c;以及这些参数之间的相互影响。 对于还未安装Stable Diffusion WebUI的小伙伴&#xff0c…

httpd的安装和mysql数据库的安装方法

目录 一 安装httpd 1.下载httpd包模块apr和apr-u到opt目录 2. 解包 3. 把apr和apr-u包放在http的第三方模块scrilb目录中 4.进入httpd包的安装目录并安装依赖环境和进行编译安装 5. make -j 2 && make install 编译并安装 6.优化配置文件 7. 把httpd服务放在sy…

智能文档图像处理技术:解决大数据时代文档图像处理难题

智能文档图像处理技术&#xff1a;解决大数据时代文档图像处理难题 0. 前言1. 智能文档处理1.1 智能文档处理简介1.2 智能文档处理应用 2. VALSE 视觉与学习青年学者研讨会2.1 VALSE 20232.2 合合信息亮相 VALSE 2023 3. 版面分析技术3.1 版面分析3.2 文档还原 4. 其他相关智能…

Gamma:强大的AI制作PPT神器,用完再也回不去了!

看过许多 AI 制作 PPT 软件&#xff0c;最终还是被 Gamma 惊艳到。 Gamma 是一款基于人工智能技术的 PPT 制作工具&#xff0c;可以帮助用户轻松制作高质量的 PPT 演示文稿。 痛点解决 相比传统制作 PPT 方式&#xff0c;Gamma 可以解决哪些如下 7 个痛点&#xff1a; 一句话…

2016年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2016年1月真题&#xff1a; 四、写作&#xff1a;第56~57小题&#xff0c;共65 分。其中论证有效性分析30 分&#xff0c;论说文35分。 56、论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0…

2013年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2013年1月真题: 四、写作:第 56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35 分。 56、论证有效性分析: 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600 字左右的文章&#xff0c;对该论证的有效性进行分析和评论…

Golang每日一练(leetDay0102) 删除无效的括号、累加数

目录 301. 删除无效的括号 Remove Invalid Parentheses &#x1f31f;&#x1f31f;&#x1f31f; 306. 累加数 Additive Number &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏…

使用mpi并行技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

iPhone手机用户们在用的手机桌面便签推荐哪款?

iPhone手机的性能和外观设计是非常好的&#xff0c;很多人在工作和生活中都少不了它的辅助。有人在工作生活中担心会忘掉一些重要的事&#xff0c;在这种情况下可以用便签软件来帮自己把这些重要的事情记录下来。iPhone手机用户们在用的手机桌面便签推荐哪款&#xff1f; 其实…

加密与解密 调试篇 静态分析技术 (一)文件类型/窗口/定位

1.文件类型分析 逆向分析的第一步就是文件类型分析 文件使用什么写的 使用什么编译器编译的 是否被加密过 然后才能进入下一步 有很多工具可以进行分析 我选择exeinfo来查看 但是并不是工具就可以直接分析完成 因为有些会存在欺骗 把入口代码改造成和Visual C 6.0类似的…

04-闭包

闭包&#xff1a;函数嵌套函数&#xff0c;内部函数就是闭包&#xff0c;只有函数内部的子函数才能读取内部变量。 先上一个经典的闭包&#xff1a; function outerFun () {let a 10;function innerFun () {console.log(a);}return innerFun; } let fun outerFun(); fun();…

GPT提示词系统学习-第三课-规范化提示让样本走在提示词前

开篇 本教程将为您提供有关不同类型提示的术语及如何描述它们。尽管提示工程中已经有一些方法来形式化术语,但这个领域仍在不断发展,我们在这篇教程中将给到大家展示一种基于QA形式的通用的、标准的提示语写法。 提示的组成部分 以下是在一个提示中经常会出现的一些组成部…

Triton教程 --- 动态批处理

Triton教程 — 动态批处理 Triton 提供了动态批处理功能&#xff0c;将多个请求组合在一起执行同一模型以提供更大的吞吐量。 默认情况下&#xff0c;只有当每个输入在请求中具有相同的形状时&#xff0c;请求才能被动态批处理。 为了在输入形状经常变化的情况下利用动态批处理…

【PCB专题】Allegro 生成钻孔数据方法

生成Drill Symbol 选择Manufacture->NC->Drill Customization... 在Drill Customization中选择Auto generate symbols(防止钻孔未定义图形符号,选择后会自动产生图形符号)。然后在弹出的警告框中选择是(Y)。最后点击OK。 生成Drill Legend 选择Manufacture->NC-&…

什么是OTN——光传送网?

概要 在现代通信网络中&#xff0c;光纤技术已经成为主流&#xff0c;提供了高速、高带宽的数据传输能力。光传送网&#xff08;Optical Transport Network&#xff0c;OTN&#xff09;是一种基于光纤技术的传输网络&#xff0c;用于实现可靠、高效的光纤通信。本文将详细介绍O…

01 React入门、虚拟DOM

总结 一、React 入门 1.1 特点 高性能、声明式、组件化、单向响应的数据流、JSX扩展、灵活 1.2 React初体验 <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpo…

AIDA64压力测试教程,AIDA64压力测试多长时间,AIDA64压力测试结果怎么看

硬件管理工具AIDA64功能全面专业&#xff0c;操作简便易学&#xff0c;使用AIDA64进行系统稳定性测试逐渐成为更多用户的选择。可能有很多用户对如何使用AIDA64进行系统稳定性测试不太了解&#xff0c;系统稳定性测试也称为压力测试&#xff0c;或者更通俗的烤机测试&#xff0…

SPI协议详细总结附实例图文讲解通信过程(快速掌握)

目录 一、简介二、数据通信过程2.1 通信总过程总结2.2 具体协议规则2.2.1 时钟极性与时钟相位2.2.2 SPI模式2.2.3 图文实例讲解 2.3 SPI协议优缺点总结 三、其他相关链接 一、简介 SPI(Serial Peripheral nterface&#xff0c;串行外设接口) 协议是一种高速高效率、全双工的通…

数据库SQL Server实验报告 之 SQL数据库的安全性(7/8)

实验名称 数据库的安全性实验 注意&#xff1a;原版word在下载资源里面&#xff08;免费下载&#xff09; 实验目的及要求&#xff1a; 使学生加深对数据库安全性和完整性的理解。掌握SQL Server中有关用户、角色及操作权限…