打印
[APM32F4]

使用APM32F411 TINY板实现HID低功耗唤醒功能

[复制链接]
8702|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 susutata 于 2023-9-12 16:55 编辑

#申请原创#@21小跑堂

使用APM32F411 TINY板实现USB HID低功耗唤醒



## 01 前言

在之前举行的上海慕尼黑电子展时就看到极海发布了APM32F411系列芯片,有许多新特性,比如QSPI、COMP比较器、OTG FS等,还有主频高达120MHz,高出同系列竞品不少。增加了不少特性以及高主频的情况下,极海还能做到能耗低和成本低吗?话不多说,马上用收到的开发板来测试下。

## 02 APM32F411 TINY板简介

### 芯片特性
  • 工作主频达120MHz,支持单精度FPU和 DSP 指
  • 内置两个DMA单元,每个有8个数据流
  • 内置CRC32运算单元
  • Flash 512/256 KB,SRAM 128KB
  • 内置SMC,支持CF卡、PSRAM、 NORFlash、NANDFlash等多种外部存储器
  • 支持睡眠、停机和待机三种低功耗模式

### 芯片外设
  • USARTx4,UARTx2,I2Cx3,SPIx5(可复用I2S),QSPIx1,CANx2,SDIOx1
  • 最多配置81个I/O接口,所有 I/O 均可映射到外部中断向量
  • 内置USB_OTG控制器,集成了内部PHY
  • 2个16位高级定时器,2个32位通用定时器,8个16位通用定时器,2 个看门狗定时器,1 个24位自减型系统滴答定时器
  • 2个12位高精度ADC,外部通道数16,最大采样率2.4MSPS
  • 2个独立比较器,支持外部唤醒功能

### 开发板
  • 板载DC 5V接口
  • 板载USB TYPE C设备接口
  • 板载Geehy CMSIS-DAP,这样就可以开箱即用了,不需要额外用仿真器。


另外还注意到,板载CMSIS DAP还带有一个虚拟COM口,这样一会的串口调试也不需要外接串口模块了。


## 03 HID低功耗唤醒测试
本次测试主要使用APM32F411 TINY板OTG FS外设模拟成HID鼠标,开启OTG FS WAKEUP中断并设置在USB suspend事件中进入内核深度睡眠模式,以此测试OTG FS实际应用时的功耗。
### 下载官方SDK
测试前首先要下载官方SDK:(https://global.geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip)

### 修改官方例程
例程路径:APM32F4xx_SDK_V1.4\Examples\USB_OTG\Device_Examples\OTGD_HID

#### 开启低功耗配置和唤醒中断
void USBD_HardwareInit(USBD_INFO_T* usbInfo)
{
    ...
    if (usbInfo->devSpeed == USBD_SPEED_FS)
    {
        ...
        usbDeviceHandler.usbCfg.lowPowerStatus      = ENABLE;
        ...

        /* Low power */
        if(usbDeviceHandler.usbCfg.lowPowerStatus == ENABLE)
        {
            USBD_OTG_FS_WAKEUP_EINT_CLEAR_FLAG();
            USBD_OTG_FS_WAKEUP_EINT_ENABLE_RISING_EDGE();
            USBD_OTG_FS_WAKEUP_EINT_ENABLE_IT();

            NVIC_EnableIRQRequest(OTG_FS_WKUP_IRQn, 1, 0);
        }
        ...
    }
    ...
}


#### 配置suspend事件操作
void USBD_SuspendCallback(USBD_HANDLE_T* usbdh)
{
    USBD_Suspend(usbdh->dataPoint);

    if((usbdh->usbCfg.phyType == USB_OTG_PHY_EMB) && \
        (usbdh->usbCfg.speed == USB_OTG_SPEED_HSFSLS))
    {
        /* Embedded HS PHY can not stop clock */
    }
    else
    {
        /* Stop PHY clock */
        usbdh->usbPower->PCGCTRL_B.PCLKSTOP = BIT_SET;
    }

    if (usbdh->usbCfg.lowPowerStatus == ENABLE)
    {
        /* Set SLEEPDEEP bit and SLEEPONEXIT SCR */
        SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
    }
}


#### 配置OTG FS 唤醒服务函数
void OTG_FS_WKUP_IRQHandler(void)
{
    if ((&usbDeviceHandler)->usbCfg.lowPowerStatus == ENABLE)
    {
        /* Reset SLEEPDEEP bit and SLEEPONEXIT SCR */
        SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk));
        SystemInit();
    }

    /* Start PHY clock */
    (&usbDeviceHandler)->usbPower->PCGCTRL_B.PCLKSTOP = BIT_RESET;

    USBD_OTG_FS_WAKEUP_EINT_CLEAR_FLAG();
}

### 测试结果
下载修改后的固件到APM32F411 TINY板后,将其USB口接入电脑。



可以看到电脑正确识别APM32F411 TINY为HID鼠标。


此时功耗电流为15.35mA(板载CMSIS DAP、LED灯及各个信号的上拉功耗未排除


让电脑进入“睡眠模式”,使USB总线发出suspend事件给APM32F411 TINY板。
此时功耗电流为1.93mA(板载CMSIS DAP、LED灯及各个信号的上拉功耗未排除


本功耗测试为非严谨性测试,其基于APM32F411 TINY板,且未去除板载耗能元件,仅作参考,详细芯片功耗信息可参考官方给出的数据

然后唤醒电脑,使APM32F411 TINY wakup。

唤醒后,APM32F411 TINY板模拟的鼠标能够正常运行。


### 利用CMSIS DAP查看串口调试信息
连接上J16和J17(TX1和RX1)跳线帽。


串口终端连接上CMSIS DAP的虚拟COM后,可以看到APM32F411 USART1输出的调试信息。


本次测试到此结束,后续有空再测下QSPI和COMP等新特性。
最后,附上测试代码。
APM32F4xx_SDK_V1.4(HID低功耗唤醒测试).zip (5.88 MB)



使用特权

评论回复
评论
xu@xupt 2023-9-17 08:24 回复TA
很好的资源,学习啦~~ 
沙发
kai迪皮| | 2023-9-12 17:12 | 只看该作者
学习了

使用特权

评论回复
板凳
21小跑堂| | 2023-9-15 10:50 | 只看该作者
hi大佬,代码部分可使用编辑栏上方的插入代码文字功能,另外咱们申请原创是需要文章字数除代码和开发板官方介绍外达到800字的噢,您可以具体补充下开发过程和技术结果等的描述,完成后可再次@21小跑堂

使用特权

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

本版积分规则

19

主题

31

帖子

3

粉丝