STM32/STM8技术论坛
400万+工程师在用
华为|鸿蒙开发者日
直播报名
400万+工程师在用
华为|鸿蒙开发者日
直播报名

高佳鑫

7年用户 29经验值
擅长:基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件 基础元器件
私信 关注
[资料]

【NUCLEO-F412ZG试用体验】USB通信测试--控制LED

2016-12-17 20:51

最近几天工作比较忙,就发了一个简单的开箱和点亮LED测试,今天下午搞了下USB部分,通过PC端的上位机点亮和熄灭板子上的三个用户LED.下面是过程,完完整整的过程.工程是利用之前的点亮LED工程修改的,点亮LED的帖子是
https://bbs.elecfans.com/jishu_1100675_1_1.html
复制工程文件夹,修改文件名为USBLEDTest,打开CubeMX导入工程.
启用外部晶振
6.png
使能USB_OTG_ONLY模式为DeviceOnly,其他部分默认
1.png
点击MiddleWares,USB类型设置为自定义HID设备类型
2.png
点Configuration选项卡,切换到配置部分,
基层Connectivity部分不需要改动,但是第三方组件部分需要改动
点击第三方组件中的USB_Device按钮
3.png
红框部分是修改的地方,其余默认即可
4.png
这里的设备字符串可不进行修改直接使用,不影响
5.png
然后点确定,可能时钟部分会报错,让其自动生成合适时钟频率即可,然后生成工程
发现文件结构是
7.png
有几处CubeMX生成代码不对,需要进行修改
打开\Src\usbd_custom_hid_if.c文件,修改CUSTOM_HID_ReportDesc_FS数组为下述内容
  1. __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
  2. {
  3.     /* USER CODE BEGIN 0 */
  4.     0x06, 0xFF, 0x00,                               // USAGE_PAGE (Vendor Page: 0xFF00)
  5.     0x09, 0x01,                                     // USAGE
  6.     0xa1, 0x01,                                     // COLLECTION (Application)

  7.     // 接收报告描述符  report <- pc
  8.     0x85, 0x01,                                     // 报告ID                         REPORT_ID (1)
  9.     0x09, 0x01,                                     // 用途                        USAGE
  10.     0x15, 0x00,                                     // 逻辑最小值                LOGICAL_MINIMUM (0)
  11.     0x26, 0xff, 0x00,                               // 逻辑最大值                LOGICAL_MAXIMUM (255)
  12.     0x75, 0x08,                                     // 数据宽度8字节        REPORT_SIZE (8 bits)
  13.     0x95, 0x03,                                        // 报告长度                        REPORT_COUNT (64)
  14.     0x91, 0x82,                                     // 类型,输出                OUTPUT (Data,Var,Abs,Vol)

  15.     // 发送报告描述符  report -> pc
  16.        
  17.         0x85, 0x02,                                     // 报告ID                         REPORT_ID (2)
  18.     0x09, 0x02,                                     // 用途                        USAGE
  19.     0x15, 0x00,                                     // 逻辑最小值                LOGICAL_MINIMUM (0)
  20.     0x26, 0xFF, 0x00,                               // 逻辑最大值                LOGICAL_MAXIMUM (255)
  21.     0x75, 0x08,                                     // 数据宽度8字节        REPORT_SIZE (8 bits)
  22.     0x95, 0x03,                                        // 报告长度                        REPORT_COUNT (64)
  23.     0x81, 0x82,                                     // 类型,输出                OUTPUT (Data,Var,Abs,Vol)

  24.     /* USER CODE END 0 */
  25.     0xC0    /*     END_COLLECTION                     */

  26. };

/* USER CODE BEGIN EXPORTED_VARIABLES */ 和 /* USER CODE END EXPORTED_VARIABLES */
之间添加
  1. uint8_t USB_RX_Buffer[4];

这是USB数据接收缓存,
然后在CUSTOM_HID_OutEvent_FS函数的USER Code Begin 6里面添加
  1. memcpy(USB_RX_Buffer,hUsbDeviceFS.pClassData,4); //拷贝接收到的数据到缓存
打开 Middlewares\ST\STM32_USB_Device_Library\Class\CustomHID\Inc\usbd_customhid.h文件

修改宏定义CUSTOM_HID_EPIN_SIZE和CUSTOM_HID_EPOUT_SIZE为0x40.
打开Main.c
在/* USER CODE BEGIN PFP */ 和 /* USER CODE END PFP */之间添加
  1. extern uint8_t USB_RX_Buffer[4];
主循环里添加
  1. if(USB_RX_Buffer[0] == 1)
  2.                 {
  3.                         USB_RX_Buffer[0] = 0;
  4.                          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, USB_RX_Buffer[3]);
  5.                         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, USB_RX_Buffer[2]);
  6.                         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, USB_RX_Buffer[1]);
  7.                 }
编译工程,下载到Nucle里边,再找一个数据线.插在网口那一边的USB接口上,这个USB不对开发版进行供电,所以调试器部分的USB接口不能不接.
接上之后电脑会提示发现新硬件,同时安装驱动(微软提供的),等待安装完成
右击我的电脑,选管理
然后按照下图顺序查看是否完成驱动安装
9.png
如果正确,那么就是安装成功了.
下面说上位机编写过程
上位机采用C#进行编写
代码很简单,但是我对HID通信部分进行了封装,为了尊重我的劳动成果,此部分代码不在上传,但是需要的朋友可私信我或者发邮件跟我要.
上位机界面如图所示
8.png
此部分源码可可分享
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. using USBHIDControl;

  5. namespace nucleoF412点亮LED
  6. {
  7.     public partial class MainForm : Form
  8.     {
  9.         /* 按钮颜色 */
  10.         Color R, Y, B;
  11.         /* 封装好的USB类 */
  12.         USBHID USB;
  13.         /* 发送数据包 */
  14.         byte[] Dat = { 1, 1, 1,1 };

  15.         public MainForm()
  16.         {
  17.             InitializeComponent();
  18.             R = BTN_R.BackColor;
  19.             Y = BTN_Y.BackColor;
  20.             B = BTN_B.BackColor;
  21.         }

  22.       
  23.         private void Btn_USB_Open_Click(object sender, EventArgs e)
  24.         {
  25.             try
  26.             {
  27.                 ushort VID = Convert.ToUInt16(Input_VID.Text, 16);
  28.                 ushort PID = Convert.ToUInt16(Input_PID.Text, 16);
  29.                 USB = new USBHID(VID, PID);
  30.                 USB.Start();
  31.                 sendCMD();
  32.                 MessageBox.Show("已连接");
  33.             }
  34.             catch (Exception ex)
  35.             {
  36.                 MessageBox.Show("未连接\r\n"+ex.Message + "\r\n" + ex.ToString());
  37.             }
  38.         }
  39.         //发送指令
  40.         private void sendCMD()
  41.         {
  42.             if(USB.IsOpen)
  43.             {
  44.                 USB.Write(Dat);
  45.             }
  46.         }

  47.         private void BTN_Y_Click(object sender, EventArgs e)
  48.         {
  49.             if (BTN_Y.BackColor == Y)
  50.             {
  51.                 BTN_Y.BackColor = Color.FromArgb(0x50, 0x50, 0x00);
  52.                 Dat[1] = 0;
  53.             }
  54.             else
  55.             {
  56.                 BTN_Y.BackColor = Y;
  57.                 Dat[1] = 1;
  58.             }
  59.             sendCMD();
  60.         }

  61.         private void MainForm_Load(object sender, EventArgs e)
  62.         {

  63.         }

  64.         private void BTN_B_Click(object sender, EventArgs e)
  65.         {
  66.             if (BTN_B.BackColor == B)
  67.             {
  68.                 BTN_B.BackColor = Color.FromArgb(0x00, 0x00, 0x50);
  69.                 Dat[2] = 0;
  70.             }
  71.             else
  72.             {
  73.                 BTN_B.BackColor = B;
  74.                 Dat[2] = 1;
  75.             }
  76.             sendCMD();
  77.         }
  78.         private void BTN_R_Click(object sender, EventArgs e)
  79.         {
  80.             if (BTN_R.BackColor == R)
  81.             {
  82.                 BTN_R.BackColor = Color.FromArgb(0x50, 0x00, 0x00);
  83.                 Dat[3] = 0;
  84.             }
  85.             else
  86.             {
  87.                 BTN_R.BackColor = R;
  88.                 Dat[3] = 1;
  89.             }
  90.             sendCMD();
  91.         }
  92.     }
  93. }
打开上位机,VID部分和PID部分CubeMX会默认设置为0x0483和0x5750,此上位机也是这个默认设置,可自行修改为自己设置的.
然后点打开USB端口,会提示连接结果
成功连接提示为
10.png
这时候点三个各种颜色的按钮就回同步到开发板

    USB上位机.zip (2016-12-17 20:49 上传)

    12.7 KB, 下载次数: 13

    USB上位机

    USBLEDTest.zip (2016-12-17 20:50 上传)

    21.22 MB, 下载次数: 29

    单片机工程

回帖(1)

高佳鑫

2016-12-17 20:55:17
忘记写了,我的邮箱是gaojiaxin2011@126.com,需要USB上位机源码的课发邮件给我.
我希望我的成果得到尊重,我可以奉献,但是要知道,这不是理所应当的,如果要发布,请声明来源,谢谢

更多回帖

打开APP