最近几天工作比较忙,就发了一个简单的开箱和点亮LED的测试,今天下午搞了下USB部分,通过PC端的上位机点亮和熄灭板子上的三个用户LED.下面是过程,完完整整的过程.工程是利用之前的点亮LED工程修改的,点亮LED的帖子是
https://bbs.elecfans.com/jishu_1100675_1_1.html
复制工程文件夹,修改文件名为USBLEDTest,打开CubeMX导入工程.
启用外部晶振
使能USB_OTG_ONLY模式为DeviceOnly,其他部分默认
点击MiddleWares,USB类型设置为自定义HID设备类型
点Configura tion选项卡,切换到配置部分,
基层Connectivity部分不需要改动,但是第三方组件部分需要改动
点击第三方组件中的USB_Device按钮
红框部分是修改的地方,其余默认即可
这里的设备字符串可不进行修改直接使用,不影响
然后点确定,可能时钟部分会报错,让其自动生成合适时钟频率即可,然后生成工程
发现文件结构是
有几处CubeMX生成代码不对,需要进行修改
打开Srcu***d_custom_hid_if.c文件,修改CUSTOM_HID_ReportDesc_FS数组为下述内容
- __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
- {
- /* USER CODE BEGIN 0 */
- 0x06, 0xFF, 0x00, // USAGE_PAGE (Vendor Page: 0xFF00)
- 0x09, 0x01, // USAGE
- 0xa1, 0x01, // COLLECTION (Application)
- // 接收报告描述符 report <- pc
- 0x85, 0x01, // 报告ID REPORT_ID (1)
- 0x09, 0x01, // 用途 USAGE
- 0x15, 0x00, // 逻辑最小值 LOGICAL_MINIMUM (0)
- 0x26, 0xff, 0x00, // 逻辑最大值 LOGICAL_MAXIMUM (255)
- 0x75, 0x08, // 数据宽度8字节 REPORT_SIZE (8 bits)
- 0x95, 0x03, // 报告长度 REPORT_COUNT (64)
- 0x91, 0x82, // 类型,输出 OUTPUT (Data,Var,Abs,Vol)
- // 发送报告描述符 report -> pc
-
- 0x85, 0x02, // 报告ID REPORT_ID (2)
- 0x09, 0x02, // 用途 USAGE
- 0x15, 0x00, // 逻辑最小值 LOGICAL_MINIMUM (0)
- 0x26, 0xFF, 0x00, // 逻辑最大值 LOGICAL_MAXIMUM (255)
- 0x75, 0x08, // 数据宽度8字节 REPORT_SIZE (8 bits)
- 0x95, 0x03, // 报告长度 REPORT_COUNT (64)
- 0x81, 0x82, // 类型,输出 OUTPUT (Data,Var,Abs,Vol)
- /* USER CODE END 0 */
- 0xC0 /* END_COLLECTION */
- };
复制代码
在
/* USER CODE BEGIN EXPORTED_VARIABLES */ 和 /* USER CODE END EXPORTED_VARIABLES */
之间添加
- uint8_t USB_RX_Buffer[4];
复制代码
这是USB数据接收缓存,
然后在CUSTOM_HID_OutEvent_FS函数的USER Code Begin 6里面添加
- memcpy(USB_RX_Buffer,hU***DeviceFS.pClassData,4); //拷贝接收到的数据到缓存
复制代码
打开 MiddlewaresST STM32_USB_Device_LibraryClassCustomHIDIncu***d_customhid.h文件
修改宏定义CUSTOM_HID_EPIN_SIZE和CUSTOM_HID_EPOUT_SIZE为0x40.
打开Main.c
在/* USER CODE BEGIN PFP */ 和 /* USER CODE END PFP */之间添加
- extern uint8_t USB_RX_Buffer[4];
复制代码
主循环里添加
- if(USB_RX_Buffer[0] == 1)
- {
- USB_RX_Buffer[0] = 0;
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, USB_RX_Buffer[3]);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, USB_RX_Buffer[2]);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, USB_RX_Buffer[1]);
- }
复制代码
编译工程,下载到Nucle里边,再找一个数据线.插在网口那一边的USB接口上,这个USB不对开发版进行供电,所以调试器部分的USB接口不能不接.
接上之后电脑会提示发现新硬件,同时安装驱动(微软提供的),等待安装完成
右击我的电脑,选管理
然后按照下图顺序查看是否完成驱动安装
如果正确,那么就是安装成功了.
下面说上位机编写过程
上位机采用C#进行编写
代码很简单,但是我对HID 通信部分进行了封装,为了尊重我的劳动成果,此部分代码不在上传,但是需要的朋友可私信我或者发邮件跟我要.
上位机界面如图所示
此部分源码可可分享
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- using USBHIDControl;
- namespace NUCLEOF412点亮LED
- {
- public partial class MainForm : Form
- {
- /* 按钮颜色 */
- Color R, Y, B;
- /* 封装好的USB类 */
- USBHID USB;
- /* 发送数据包 */
- byte[] Dat = { 1, 1, 1,1 };
- public MainForm()
- {
- InitializeComponent();
- R = BTN_R.BackColor;
- Y = BTN_Y.BackColor;
- B = BTN_B.BackColor;
- }
-
- private void Btn_USB_Open_Click(object sender, EventArgs e)
- {
- try
- {
- ushort VID = Convert.ToUInt16(Input_VID.Text, 16);
- ushort PID = Convert.ToUInt16(Input_PID.Text, 16);
- USB = new USBHID(VID, PID);
- USB.Start();
- sendCMD();
- MessageBox.Show("已连接");
- }
- catch (Exception ex)
- {
- MessageBox.Show("未连接rn"+ex.Message + "rn" + ex.ToString());
- }
- }
- //发送指令
- private void sendCMD()
- {
- if(USB.IsOpen)
- {
- USB.Write(Dat);
- }
- }
- private void BTN_Y_Click(object sender, EventArgs e)
- {
- if (BTN_Y.BackColor == Y)
- {
- BTN_Y.BackColor = Color.FromArgb(0x50, 0x50, 0x00);
- Dat[1] = 0;
- }
- else
- {
- BTN_Y.BackColor = Y;
- Dat[1] = 1;
- }
- sendCMD();
- }
- private void MainForm_Load(object sender, EventArgs e)
- {
- }
- private void BTN_B_Click(object sender, EventArgs e)
- {
- if (BTN_B.BackColor == B)
- {
- BTN_B.BackColor = Color.FromArgb(0x00, 0x00, 0x50);
- Dat[2] = 0;
- }
- else
- {
- BTN_B.BackColor = B;
- Dat[2] = 1;
- }
- sendCMD();
- }
- private void BTN_R_Click(object sender, EventArgs e)
- {
- if (BTN_R.BackColor == R)
- {
- BTN_R.BackColor = Color.FromArgb(0x50, 0x00, 0x00);
- Dat[3] = 0;
- }
- else
- {
- BTN_R.BackColor = R;
- Dat[3] = 1;
- }
- sendCMD();
- }
- }
- }
复制代码
打开上位机,VID部分和PID部分CubeMX会默认设置为0x0483和0x5750,此上位机也是这个默认设置,可自行修改为自己设置的.
然后点打开USB端口,会提示连接结果
成功连接提示为
这时候点三个各种颜色的按钮就回同步到 开发板
0
|
|
|
|