如何创建 USB-PD 接收设备(中)

描述

2.7 [可选] 配置 Tracer 进行调试↑

2.7.1配置LPUART ↑

在STM32G0 Nucleo-64板子上,连接ST-LINK的Virtual COM口是LPUART1。

必须更改 LPUART1 使用的默认 STM32CubeMX 引脚以匹配 STM32G0 Nucleo-64 硬件:

TX 的 PA2

用于接收的 PA3。

在Connectivity部分,在 Asynchronous 模式下启用LPUART1,波特率为921600 bauds。其余保持默认。

usb

在引脚布局视图中,左键单击 PA2 和 PA3 以将它们重新映射到LPUART1_TX和LPUART1_RX。

usb

在DMA 配置选项卡下,添加对LPUART1_TX的请求。使用DMA1 通道 3。

usb

最后,在NVIC 设置选项卡下,启用 LPUART1 全局中断。

usb

2.7.2配置嵌入式tracer ↑

在Utilities部分,选择TRACER_EMB并使用LPUART1作为跟踪源。

usb

然后,返回USBPD中间件配置并选中 Tracer Source 复选框。

usb

2.7.3配置UCPD监控固件响应器调试↑

如果需要与 USB-PD 堆栈交互,可以使用 UCPD 监控工具STM32CubeMonUCPD激活固件交互式堆栈响应器。在“实用程序”部分,启用 GUI_INTERFACE,然后输入自由文本来描述电路板。

usb

3配置项目

usb

5min

在Project Manager主选项卡下,将Project选项卡下的最小堆栈大小配置为0xC00。这是第一个值,以后可以根据应用需要进行调整。

usb

在Advanced Settings选项卡下,将 LPUART 驱动程序更改为 LL。

usb

4生成代码

usb

5分钟

使用 Ctrl+S 保存文件,并在出现提示时选择生成代码。您还可以通过单击项目/生成代码或按 Alt+K 从 STM32CubeIDE 菜单生成代码。

usb

出现一条警告,通知未定义正确的 HAL 时基。使用专用定时器作为 HAL 时基源更安全。

对于此演示,可以通过单击是忽略以下警告。

usb

usb

信息

这成为在即将发布的固件包交付中推荐的标准工作方式,尤其是在使用 CMSIS OS V2 时,它将 Systick 定义为 FreeRTOS™ 时基。

对于此演示,可以通过单击是忽略警告。

5简单的USB-PD应用

 

现在外设已由 STM32CubeMX 初始化,需要添加一些最低级别的应用程序:

ADC 需要校准,转换需要开始。

中断处理程序需要完成,以唤醒 UCPD 外设。

BSP_USBPD_PWR_VBUSGetVoltage函数需要根据 VBUS 分压桥使用正确的系数来完成。

需要完成USBPD_DPM_SNK_EvaluateCapabilities函数以回答一个源能力消息。

需要禁用 TCPP01‑M12 没电电池引脚并将 GPIO 驱动为高电平以查看源 Rp,或者必须在屏蔽上设置跳线。

usb

警告

此应用程序是一个非常基本的示例,它请求第一个默认 5V PDO。如果要从源请求特定电压,则需要添加一些与接收器和源 PDO 匹配的用户代码。完成此基本示例后,请参阅高级 USB-PD 应用部分以获得更完整的应用。

5.1 main.c中的修改↑

usb

信息

您可以双击代码区域将其全部选中,然后使用 Ctrl+C 进行复制。

在/* USER CODE BEGIN-END ADC1_Init 2 */标签之间添加以下代码:

/* 用户代码开始 ADC1_Init 2 */ HAL_ADCEx_Calibration_Start ( & hadc1 ); HAL_ADC_Start ( & hadc1 ); /* 用户代码结束 ADC1_Init 2 */

5.2 usbpd_dpm_user.c中的修改↑

在USBPD_DPM_GetDataInfo函数中添加如下代码:

case USBPD_CORE_DATATYPE_SNK_PDO : /*!《 端口 Sink PDO 的处理,由 get sink capa 请求*/ USBPD_PWR_IF_GetPortPDOs ( PortNum , DataId , Ptr , Size ); *大小 *= 4 ; 打破;

在/* USER CODE BEGIN-END USBPD_DPM_SNK_EvaluateCapabilities */标签 之间添加以下代码:

/* 用户代码开始 USBPD_DPM_SNK_EvaluateCapabilities */ USBPD_SNKRDO_TypeDef rdo ; /* 初始化 RDO */ rdo 。 d32 = 0 ; /* 准备请求的 pdo */ rdo 。 固定变量 RDO 。对象位置 = 1 ; rdo 。固定变量 RDO 。OperatingCurrentIn10mAunits = 50 ; rdo 。固定变量 RDO 。MaxOperatingCurrent10mAunits = 50 ; rdo 。固定变量 RDO 。能力不匹配 = 0 ; * PtrPowerObjectType = USBPD_CORE_PDO_TYPE_FIXED ; * PtrRequestData = rdo 。d32 ; /* 用户代码结束 USBPD_DPM_SNK_EvaluateCapabilities */

5.3 usbpd_pwr_user.c中的修改↑

在/* USER CODE BEGIN-END include */标签之间添加以下代码:

/* 用户代码开始包括 */ #include “main.h” /* 用户代码结束包括 */

在/* USER CODE BEGIN-END BSP_USBPD_PWR_VBUSGetVoltage */标签之间添加以下代码:

/* USER CODE BEGIN BSP_USBPD_PWR_VBUSGetVoltage */ /* 检查实例是否有效 */ int32_t ret = BSP_ERROR_NONE ; if (( Instance 》= USBPD_PWR_INSTANCES_NBR ) || ( NULL == pVoltage )) { ret = BSP_ERROR_WRONG_PARAM ; * p电压 = 0 ; } else { uint32_t val ; val = __LL_ADC_CALC_DATA_TO_VOLTAGE ( VDDA_APPLI , LL_ADC_REG_ReadConversionData12( ADC1 ), LL_ADC_RESOLUTION_12B ); /* mV */ /* 使用 X-NUCLEO-USBPDM 板 */ /* 值乘以 5.97(VSENSE 的分压器 R6/R7 (40.2K/200K))*/ val *= 597 ; val /= 100 ; * pVoltage = val ; } 返回 ret ; /* 用户代码结束 BSP_USBPD_PWR_VBUSGetVoltage */

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分