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

发布者:VelvetWhisper最新更新时间:2024-02-20 来源: elecfans关键字:USB-PD  接收设备  STM32 手机看文章 扫描二维码
随时随地手机看文章

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。其余保持默认。

poYBAGPYy9eAPq47AAEVgBuFdGs078.png

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

pYYBAGPYy9iAUMozAADv_wJIMWU441.png

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

poYBAGPYy9iAX92PAAAuyXQDUVY814.png

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

pYYBAGPYy9mAWsjlAAAzf2Fllxk506.png

2.7.2配置嵌入式tracer ↑

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

poYBAGPYy9mARMMLAABqoei-3ew715.png

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

pYYBAGPYy9qAHHQPAABA7iGpoWw512.png

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

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

poYBAGPYy9qAVM3qAABnPp2h03E255.png

3配置项目

40px-Clock.png

5min

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

pYYBAGPYy92AL13WAAClLV1QLXo455.png

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

poYBAGPYy96AbucWAACLHJiI0lM022.png

4生成代码

40px-Clock.png

5分钟

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

pYYBAGPYy96AVyeOAAAvxx-Cqwo902.png

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

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

poYBAGPYy9-AKALPAAA_ongVZyc927.png

25px-Info_white.png

信息

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

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

5简单的USB-PD应用


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

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

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

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

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

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

25px-Warning_white.png

警告

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

5.1 main.c中的修改↑

25px-Info_white.png

信息

您可以双击代码区域将其全部选中,然后使用 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 */

关键字:USB-PD  接收设备  STM32 引用地址:如何创建 USB-PD 接收设备(中)

上一篇:如何使用外部中断并在按下用户按钮时打开LED
下一篇:ESP8266纯串口透传,助力设备上云端

推荐阅读最新更新时间:2024-11-09 23:11

STM32系统时钟默认设置
“我们一直都说STM32有一个非常复杂的时钟系统,然而在原子或者野火的例程中,只要涉及到时钟,我们却只能看到类似的库函数调用,如RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);这个仅仅只是起到开启挂载在APB2线上的USART1时钟的作用罢了,APB2的时钟频率是多少我们并不知道” 我们先来了解一些stm32的时钟结构。 这个图说明了STM32的时钟走向,从图的左边开始,从时钟源一步步分配到外设时钟。 从时钟频率来说,又分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的RTC(实时时钟)
[单片机]
STM32 EXIT
这张图是一条外部中断线或外部事件线的示意图,途中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套,途中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输入到NVIC中断控制器,在这个通道上游4个控制选项,外部的信号收件经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或是下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了,接下
[单片机]
STM32 环境光传感器ADC采样
一、STM32 环境光传感器模块 TEMT60000光传感器把光信号转变成为电信号,PA作为模拟输入,接收光传感器的电压, 将PA4设置成ADC 二、Stm32CubeMx配置ADC 打开PA4并使能ADC1通道9 配置完ADC之后,GPIO模式自动为模数转换模式 使能外部高速时钟 配置时钟 不要让ADC时钟超过14MHz,否则可能不准 ADC参数设置 配置USART1为异步模式 PA10和PA9被使能作为串口的收发端 生成代码 三、Keil编写程序 在uart.c中做printf、scanf的重定向以便于串口通信 #include stdio.h #ifdef __GNU
[单片机]
<font color='red'>STM32</font> 环境光传感器ADC采样
STM32输入输出总结
(1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结: 推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互
[单片机]
STM32 STLINK的使用以及一些错误的解决方案
如果是第一次使用 需要先安装驱动 就和使用ch310一样 需要电脑识别 安装成功在设备管理器里面能看到stlink 的这个设备 错误解决方案 flash download failed - Target dll has been cancelled 错误解决办法 1 下载st-link utility并安装,选择Target- Connect 会提示下面的错误 Can not connect to target! Please select “Connect Under Reset” mode from Target- Settings menu and try again. 2 选择Target- Settings,Mod
[单片机]
<font color='red'>STM32</font> STLINK的使用以及一些错误的解决方案
stm32的 开漏电路 与 推挽输出
===================================================== 开漏结构 所谓开漏电路概念中提到的 漏 就是指MOS FET的漏极。同理,开集电路中的 集 就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。如图1所示: 图1 组成开漏形式的电路有以下几个特点: 1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部 MOSFET 导通时,驱动电流是从外部的VCC流经R pull-up , MOSFET 到GND。IC内部仅需很下
[单片机]
<font color='red'>stm32</font>的 开漏电路 与 推挽输出
STM32串口接收数据卡死问题解决办法
在使用STM32串口时,有时候串口接受一段时间数据之后便会卡死不在进入中断接收数据。原因是串口中断标志没有清除,导致终端锁死,此时需要判断对应的标志位,重新启动中断。 if((huart1.Instance- CR1 & 0x20)==0) { HAL_UART_Receive_IT(&huart1,bsp_uart1.rx_tmp,1); }
[单片机]
STM32数据类型的定义
/* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; /* exact-width unsigned integer types */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned in
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved