<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Keyboard on 我的博客</title><link>https://www.gechengzhen.com/tags/keyboard/</link><description>Recent content in Keyboard on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Mon, 22 Aug 2022 18:51:16 +0800</lastBuildDate><atom:link href="https://www.gechengzhen.com/tags/keyboard/index.xml" rel="self" type="application/rss+xml"/><item><title>DIY键盘教程（一）配置USB HID</title><link>https://www.gechengzhen.com/posts/keyboard-usb-hid/</link><pubDate>Mon, 22 Aug 2022 18:51:16 +0800</pubDate><guid>https://www.gechengzhen.com/posts/keyboard-usb-hid/</guid><description>&lt;blockquote&gt;
&lt;p&gt;首先键盘使用的主控是stm32f401CCU6，开发方式为cubemx+keil。键盘主要采用的是USB HID+矩阵键盘扫描，灯光部分使用的是ws2812。此教程适合有一定stm32基础的人。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;##Cubemx配置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先用cubemx新建一个工程&lt;/li&gt;
&lt;li&gt;选择USB_OTG_FS(有的芯片是USB)&lt;/li&gt;
&lt;li&gt;mode里选择Device_Only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220821223709724.png"
width="2520"
height="1584"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220821223709724_hu_e64d069ad03e7575.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220821223709724_hu_aa00386e2e13fe1e.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="159"
data-flex-basis="381px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后Middleware里选择USB_DEVICE&lt;/li&gt;
&lt;li&gt;Class For FS IP 里选择Human Interface Device Class(HID)&lt;/li&gt;
&lt;li&gt;其中VID和PID可以改成任意你喜欢的值，MANUFACTURER_STRING改成任意你喜欢的值&lt;/li&gt;
&lt;li&gt;最后生成代码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822170957632.png"
width="2520"
height="1586"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822170957632_hu_5b96444d2f6f6b9a.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822170957632_hu_65439458ed2b231c.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="158"
data-flex-basis="381px"
&gt;
&lt;/p&gt;
&lt;h2 id="keil配置"&gt;keil配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打开usb_hid.c文件&lt;/li&gt;
&lt;li&gt;在文件中搜索&lt;code&gt;HID_MOUSE_ReportDesc&lt;/code&gt;（ctrl+f）&lt;/li&gt;
&lt;li&gt;因为cubemx默认是生成鼠标报告描述符，所以要将其替换为键盘报告描述符&lt;/li&gt;
&lt;li&gt;所以将鼠标描述符&lt;strong&gt;内容&lt;/strong&gt;替换成以下键盘报告描述符&lt;strong&gt;内容&lt;/strong&gt;即可&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; ReportDescriptor[&lt;span style="color:#ae81ff"&gt;63&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_PAGE (Generic Desktop)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x09&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x06&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE (Keyboard)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0xa1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// COLLECTION (Application)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x07&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_PAGE (Keyboard)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x19&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0xe0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MINIMUM (Keyboard LeftControl)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x29&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0xe7&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MAXIMUM (Keyboard Right GUI)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x15&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x00&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// LOGICAL_MINIMUM (0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x25&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// LOGICAL_MAXIMUM (1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_SIZE (1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x95&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x08&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_COUNT (8)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x81&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x02&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// INPUT (Data,Var,Abs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x95&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_COUNT (1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x08&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_SIZE (8)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x81&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x03&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// INPUT (Cnst,Var,Abs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x95&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_COUNT (5)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_SIZE (1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x08&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_PAGE (LEDs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x19&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MINIMUM (Num Lock)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x29&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MAXIMUM (Kana)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x91&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x02&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// OUTPUT (Data,Var,Abs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x95&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x01&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_COUNT (1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x03&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_SIZE (3)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x91&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x03&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// OUTPUT (Cnst,Var,Abs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x95&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x06&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_COUNT (6)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x08&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// REPORT_SIZE (8)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x15&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x00&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// LOGICAL_MINIMUM (0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x25&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x65&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// LOGICAL_MAXIMUM (101)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x05&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x07&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_PAGE (Keyboard)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x19&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x00&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MINIMUM (Reserved (no event indicated))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x29&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x65&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// USAGE_MAXIMUM (Keyboard Application)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0x81&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0x00&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// INPUT (Data,Ary,Abs)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;0xc0&lt;/span&gt; &lt;span style="color:#75715e"&gt;// END_COLLECTION
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;然后将&lt;strong&gt;所有的&lt;/strong&gt;&lt;code&gt;HID_MOUSE_ReportDesc&lt;/code&gt;改为&lt;code&gt;HID_KEYBOARD_ReportDesc&lt;/code&gt;（ctrl+h）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如下图所示：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822173613844.png"
width="1287"
height="1076"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822173613844_hu_22d8e4834365f778.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822173613844_hu_5ed45ccb4892e717.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="287px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开usbd_hid.h文件&lt;/li&gt;
&lt;li&gt;找到&lt;code&gt;#define HID_MOUSE_REPORT_DESC_SIZE 74U&lt;/code&gt;（ctrl+f）替换为
&lt;code&gt;#define HID_KEYBOARD_REPORT_DESC_SIZE 63U&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将&lt;strong&gt;所有文件中&lt;/strong&gt;的&lt;code&gt;HID_MOUSE_REPORT_DESC_SIZE&lt;/code&gt;替换为&lt;code&gt;HID_KEYBOARD_REPORT_DESC_SIZE&lt;/code&gt;（ctrl+h）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180941299.png"
width="1082"
height="312"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180941299_hu_b0e0f318eafbdc2.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180941299_hu_71faa479a701076f.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="346"
data-flex-basis="832px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后找到红线那一行，0x02改为0x01，注释里说了1为键盘&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180338523.png"
width="2228"
height="1310"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180338523_hu_c4f93297af7dded0.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822180338523_hu_cb1d05692706cdaa.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="170"
data-flex-basis="408px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开usb_device.h文件添加一行&lt;code&gt;extern USBD_HandleTypeDef hUsbDeviceFS;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822181922530.png"
width="1446"
height="334"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822181922530_hu_af0bc89bbb23ec61.png 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/image-20220822181922530_hu_4abb517362c14e9.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="432"
data-flex-basis="1039px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在main.c添加头文件**#include “usbd_hid.h”**及以下试验代码&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* USER CODE BEGIN 2 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;uint8_t&lt;/span&gt; report[&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* USER CODE END 2 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* Infinite loop */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* USER CODE BEGIN WHILE */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;HAL_Delay&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; report[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;USBD_HID_SendReport&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;hUsbDeviceFS,report,&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;HAL_Delay&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; report[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;USBD_HID_SendReport&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;hUsbDeviceFS,report,&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;HAL_Delay&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* USER CODE END WHILE */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* USER CODE BEGIN 3 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;编译烧录&lt;/li&gt;
&lt;li&gt;打开记事本&lt;/li&gt;
&lt;li&gt;stm32通过type-c连接至电脑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/IMG_20220822_183416_edit_199875810136167.jpg"
width="4254"
height="1418"
srcset="https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/IMG_20220822_183416_edit_199875810136167_hu_b3ac278b72b40fa.jpg 480w, https://www.gechengzhen.com/posts/keyboard-usb-hid/keyboard-usb-hid.assets/IMG_20220822_183416_edit_199875810136167_hu_fa6dbde7c6184260.jpg 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="300"
data-flex-basis="720px"
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两秒钟后不断打印aaaa…则配置成功🥳&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;##未完待续。。。&lt;/p&gt;</description></item></channel></rss>