本帖最后由 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个独立比较器,支持外部唤醒功能
### 开发板
另外还注意到,板载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等新特性。 最后,附上测试代码。
|
很好的资源,学习啦~~