RYMCU

STM32全速USB通信Bulk通信

Hugh 1 月前
# 划水 # 草稿

所属作品集

1.使用 CubeMX 生成工程

step1:运行 CubeMX ,新建工程并选择芯片 STM32F103RCTx,如下图。

芯片选型.png
step2:系统时钟配置为外部时钟,如下图。

时钟选择.png
step3:使能下载调试接口 SWD,如下图,后续需要通过该接口下载程序至单片机。

SWD.png
step4:使能 USB,如下图所示,③ 处参数保持默认值。

usb1.png
step5:选择 CDC

image.png
step6:配置时钟,USB 为 48MHz

image.png
step7:设置 LED
image.png
step8:使能串口 uart1,如下图所示,串口用于输出调试信息。

uart1.png
step9:更改堆栈大小,并生成代码
image.png
step10:keil 编译,下载至开发板,USB 插入电脑,并通过 Zadig.exe 将驱动替换为 winUSB

image.png
step11:代码编辑,功能为:当接收到上位机发来的 USB bulk 数据后,翻转 LED1

//usbd_cdc.h添加全局变量
extern uint8_t RxLength1;
extern uint8_t USBD_RXBuffer1[CDC_DATA_FS_MAX_PACKET_SIZE];
//usbd_cdc.c添加全局变量声明
uint8_t RxLength1;
 uint8_t USBD_RXBuffer1[CDC_DATA_FS_MAX_PACKET_SIZE];
//usbd_cdc.c文件的USB接收函数USBD_CDC_DataOut()中,添加如下代码
//将接收到的数据放入自定义缓存USBD_RXBuffer1
	USBD_LL_PrepareReceive(pdev,CDC_OUT_EP,USBD_RXBuffer1,CDC_DATA_FS_OUT_PACKET_SIZE);
	RxLength1 = hcdc->RxLength;
//main.c中添加头文件#include "usbd_cdc.h"
//while()循环添加如下代码,CDC_OUT_EP端点接收到bulk数据后,反正LED1
  while (1)
  {
	if(RxLength1)
	{
		RxLength1=0;
		HAL_GPIO_TogglePin(GPIOC,LED1_Pin);//翻转LED1	
		//USBD_LL_Transmit(&hUsbDeviceFS,CDC_IN_EP,USBD_RXBuffer1,RxLength1);			
	}
  }

所属作品集

后发布评论