stm32实现USB键盘keyboard的功能配置记录,但愿给你有点帮助

stm32使用STM32CubeIDE 或者 STM32CubeMX两个工具都可以实现
前面简单的建立工程部分就不多说了,网上搜一下一大把,主要是下面2张图注意一下配置:
在这里插入图片描述
在这里插入图片描述
相信看一下就明白了,USB_OTG_FS这里选Device_Only,说明建usb设备,不是主机,在usb_device这里建Human接口设备,系统默认给建了一个鼠标设备,一般我们还是想建一个USB键盘设备更加有用一点,生成工程后再改一部分数据就可以实现usb键盘了:
先看看这个需要重点修改的文件usbd_hid.c:
在这里插入图片描述找到

0x01,                      /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */

很明显:我们要改为0x01,就是键盘,我这里已经改了,原来是0x02

再找到这里:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
		0x05, 0x01,			//这里的63个字节是键盘的描述符,绝对正确的,网上找了很多键盘的描述符都是错的,要谨慎
		0x09, 0x06,
		0xA1, 0x01,
		0x05, 0x07,
		0x19, 0xE0,
		0x29, 0xE7,
		0x15, 0x00,
		0x25, 0x01,
		0x75, 0x01,
		0x95, 0x08,
		0x81, 0x02,
		0x95, 0x01,
		0x75, 0x08,
		0x81, 0x01,
		0x95, 0x05,
		0x75, 0x01,
		0x05, 0x08,
		0x19, 0x01,
		0x29, 0x05,
		0x91, 0x02,
		0x95, 0x01,
		0x75, 0x03,
		0x91, 0x01,
		0x95, 0x06,
		0x75, 0x08,
		0x15, 0x00,
		0x25, 0x65,
		0x05, 0x07,
		0x19, 0x00,
		0x29, 0x65,
		0x81, 0x00,
		0xC0
};

这里是usb鼠标的描述符(可以搜索__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END ),里面的内容我已经改成键盘的了,内容的说明比较复杂,我也不去过多的关心,知道是这些就够了,数一数是63个字节,所以还要去改描述符的字节的数量。

再列一下,老的鼠标的描述符数据: 如果用键盘的,可以删除或注释掉

  0x05, 0x01,        /* Usage Page (Generic Desktop Ctrls)     */
  0x09, 0x02,        /* Usage (Mouse)                          */
  0xA1, 0x01,        /* Collection (Application)               */
  0x09, 0x01,        /*   Usage (Pointer)                      */
  0xA1, 0x00,        /*   Collection (Physical)                */
  0x05, 0x09,        /*     Usage Page (Button)                */
  0x19, 0x01,        /*     Usage Minimum (0x01)               */
  0x29, 0x03,        /*     Usage Maximum (0x03)               */
  0x15, 0x00,        /*     Logical Minimum (0)                */
  0x25, 0x01,        /*     Logical Maximum (1)                */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x75, 0x01,        /*     Report Size (1)                    */
  0x81, 0x02,        /*     Input (Data,Var,Abs)               */
  0x95, 0x01,        /*     Report Count (1)                   */
  0x75, 0x05,        /*     Report Size (5)                    */
  0x81, 0x01,        /*     Input (Const,Array,Abs)            */
  0x05, 0x01,        /*     Usage Page (Generic Desktop Ctrls) */
  0x09, 0x30,        /*     Usage (X)                          */
  0x09, 0x31,        /*     Usage (Y)                          */
  0x09, 0x38,        /*     Usage (Wheel)                      */
  0x15, 0x81,        /*     Logical Minimum (-127)             */
  0x25, 0x7F,        /*     Logical Maximum (127)              */
  0x75, 0x08,        /*     Report Size (8)                    */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x81, 0x06,        /*     Input (Data,Var,Rel)               */
  0xC0,              /*   End Collection                       */
  0x09, 0x3C,        /*   Usage (Motion Wakeup)                */
  0x05, 0xFF,        /*   Usage Page (Reserved 0xFF)           */
  0x09, 0x01,        /*   Usage (0x01)                         */
  0x15, 0x00,        /*   Logical Minimum (0)                  */
  0x25, 0x01,        /*   Logical Maximum (1)                  */
  0x75, 0x01,        /*   Report Size (1)                      */
  0x95, 0x02,        /*   Report Count (2)                     */
  0xB1, 0x22,        /*   Feature (Data,Var,Abs,NoWrp)         */
  0x75, 0x06,        /*   Report Size (6)                      */
  0x95, 0x01,        /*   Report Count (1)                     */
  0xB1, 0x01,        /*   Feature (Const,Array,Abs,NoWrp)      */
  0xC0               /* End Collection                         */

再是修改usbd_hid.h:

#ifndef HID_EPIN_ADDR
#define HID_EPIN_ADDR                              0x81U
#endif /* HID_EPIN_ADDR */
//#define HID_EPIN_SIZE                              0x04U		//鼠标
#define HID_EPIN_SIZE                              0x08U		//键盘

#define USB_HID_CONFIG_DESC_SIZ                    34U
#define USB_HID_DESC_SIZ                           9U
//#define HID_MOUSE_REPORT_DESC_SIZE                 74U		//鼠标的
#define HID_MOUSE_REPORT_DESC_SIZE                 63U			//键盘的

#define HID_DESCRIPTOR_TYPE                        0x21U
#define HID_REPORT_DESC                            0x22U

鼠标的和键盘的数据,看一下就能明白

键盘的测试按键的实现

	uint8_t keyboard[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  for(;;)
  {
	  keyboard[0] = 0x01;
	  while(USBD_HID_SendReport(&hUsbDeviceFS, &keyboard, 8)){}
	  osDelay(10);
	  keyboard[0] = 0x00;
	  while(USBD_HID_SendReport(&hUsbDeviceFS, &keyboard, 8)){}
	  //USBD_HID_SendReport(&hUsbDeviceFS, &keyboard, 8) ;
    osDelay(1000);
  }

可以看到ctrl按键每秒被按了一次

定义八个键盘发送字节是这样的:
第一字节表示特殊件是否按下:D0:Ctrl D1:Shift D2:Alt
第二字节保留,值为0
第三~第八字节:普通键键值的数组,所以最多能同时按下6个键

	0x04  Keyboard a and A 
	0x05  Keyboard b and B
	0x06  Keyboard c and C 
	0x07  Keyboard d and D
	0x08  Keyboard e and E
	0x09  Keyboard f and F
	0x0A  Keyboard g and G
	0x0B  Keyboard h and H
	0x0C  Keyboard i and I
	0x0D  Keyboard j and J
	0x0E  Keyboard k and K
	0x0F  Keyboard l and L
	0x10  Keyboard m and M
	0x11  Keyboard n and N
	0x12  Keyboard o and O
	0x13  Keyboard p and P
	0x14  Keyboard q and Q
	0x15  Keyboard r and R
	0x16  Keyboard s and S
	0x17  Keyboard t and T
	0x18  Keyboard u and U
	0x19  Keyboard v and V
	0x1A  Keyboard w and W
	0x1B  Keyboard x and X
	0x1C  Keyboard y and Y
	0x1D  Keyboard z and Z

别的又摘抄一部分,可以参考:

	// 1E  Keyboard 1 and !
	// 1F  Keyboard 2 and @
	// 20  Keyboard 3 and #
	// 21  Keyboard 4 and $
	// 22  Keyboard 5 and %
	// 23  Keyboard 6 and ^
	// 24  Keyboard 7 and &
	// 25  Keyboard 8 and *
	// 26  Keyboard 9 and (
	// 27  Keyboard 0 and )
	// 28  Keyboard Return (ENTER) 
	0,0,0,0, //41	29  Keyboard ESCAPE  
	0,GPIOA,GPIO_Pin_0,0, //42	2A  Keyboard DELETE (Backspace) 
	0,0,0,0, //43	2B  Keyboard Tab 
	0,0,0,0, //44	2C  Keyboard Spacebar 
	0,0,0,0, //45	2D  Keyboard - and (underscore) 
	0,0,0,0, //46	2E  Keyboard = and + 
	0,0,0,0, //47	2F  Keyboard [ and { 
	0,0,0,0, //48	30  Keyboard ] and } 
	0,0,0,0, //49	31  Keyboard \ and | 
	0,0,0,0, //50	32  Keyboard Non-US # and ~ 
	0,0,0,0, //51	33  Keyboard ; and : 
	0,0,0,0, //52	34  Keyboard ‘ and “ 
	0,0,0,0, //53	 35  Keyboard Grave Accent and Tilde 
	0,0,0,0, //54	 36  Keyboard, and < 
	0,GPIOB,GPIO_Pin_10,0, //55	 37  Keyboard . and > 
	0,0,0,0, //56	 38  Keyboard / and ? 
	0,0,0,0, //57	 39  Keyboard Caps Lock	
	0,0,0,0, //58	 3A  Keyboard F1  
	0,0,0,0, //59	 3B  Keyboard F2  
	0,0,0,0, //60	 3C  Keyboard F3  
	0,0,0,0, //61	 3D  Keyboard F4  
	0,0,0,0, //62	 3E  Keyboard F5  
	0,0,0,0, //63	 3F  Keyboard F6  
	0,0,0,0, //64	 40  Keyboard F7  
	0,0,0,0, //65	 41  Keyboard F8  
	0,0,0,0, //66	 42  Keyboard F9  
	0,0,0,0, //67	 43  Keyboard F10  
	0,0,0,0, //68	 44  Keyboard F11
	0,0,0,0, //69	 45  Keyboard F12
	0,0,0,0, //70  46  Keyboard PrintScree n 
	0,0,0,0, //71  47  Keyboard Scroll Lock
	0,0,0,0, //72  48  Keyboard Pause 
	0,0,0,0, //73  49  Keyboard Insert
	0,0,0,0, //74  4A  Keyboard Home
	0,0,0,0, //75  4B  Keyboard PageUp
	0,0,0,0, //76  4C  Keyboard Delete Forward
	0,0,0,0, //77  4D  Keyboard End
	0,0,0,0, //78  4E  Keyboard PageDown
	0,0,0,0, //79  4F  Keyboard RightArrow
	0,0,0,0, //80  50  Keyboard LeftArrow
	0,0,0,0, //81  51  Keyboard DownArrow
	0,0,0,0, //82  52  Keyboard UpArrow
	0,0,0,0, //83  53  Keypad Num Lock and Clear
	0,0, //84  54  Keypad /
	0,0, //85  55  Keypad * 
	0,0, //86  56  Keypad - 
	0,0, //87  57  Keypad + 
	0,0,0,0, //88  58  Keypad ENTER
	0,0,0,0, //89  59  Keypad 1 and End
	0,0,0,0, //90  5A  Keypad 2 and Down Arrow
	0,0,0,0, //91  5B  Keypad 3 and PageDn 
	0,0,0,0, //92  5C  Keypad 4 and Left Arrow
	0,0,0,0, //93  5D  Keypad 5
	0,0,0,0, //94  5E  Keypad 6 and Right Arrow 
	0,0,0,0, //95  5F  Keypad 7 and Home
	0,0,0,0, //96  60  Keypad 8 and Up Arrow
	0,0,0,0, //97  61  Keypad 9 and PageUp 
	0,0,0,0, //98  62  Keypad 0 and Insert
	0,0,0,0, //99  63  Keypad . and Delete 
	0,0,0,0, //100 64  Keyboard Non-US \ and | 3;
	0,0,0,0, //101 65  Keyboard Application 
	0,0,0,0, //102 66  Keyboard Power
	0,0,0,0, //103 67  Keypad =  
	0,0,0,0, //104 68  Keyboard F13
	0,0,0,0, //105 69  Keyboard F14
	0,0,0,0, //106 6A  Keyboard F15
	0,0,0,0, //107 6B  Keyboard F16 
	0,0,0,0, //108 6C  Keyboard F17 
	0,0,0,0, //109 6D  Keyboard F18 
	0,0,0,0, //110 6E  Keyboard F19 
	0,0,0,0, //111 6F  Keyboard F20 
	0,0,0,0, //112 70  Keyboard F21 
	0,0,0,0, //113 71  Keyboard F22 
	0,0,0,0, //114 72  Keyboard F23 
	0,0,0,0, //115 73  Keyboard F24 
	0,0,0,0, //116 74  Keyboard Execute  √ 
	0,0,0,0, //117 75  Keyboard Help  √ 
	0,0,0,0, //118 76  Keyboard Menu  √ 
	0,0,0,0, //119 77  Keyboard Select  √ 
	0,0,0,0, //120 78  Keyboard Stop  √ 
	0,0,0,0, //121 79  Keyboard Again  √ 
	0,0,0,0, //122 7A  Keyboard Undo  √ 
	0,0,0,0, //123 7B  Keyboard Cut  √ 
	0,0,0,0, //124 7C  Keyboard Copy  √ 
	0,0,0,0, //125 7D  Keyboard Paste  √ 
	0,0,0,0, //126 7E  Keyboard Find  √ 
	0,0,0,0, //127 7F  Keyboard Mute  √ 
	0,0,0,0, //128 80  Keyboard Volume Up  √ 
	0,0,0,0, //129 81  Keyboard Volume Down  √ 
	0,0,0,0, //130 82  Keyboard Locking Caps Lock 12 √ 
	0,0,0,0, //131 83  Keyboard Locking Num Lock 12 √ 
	0,0,0,0, //132 84  Keyboard Locking Scroll Lock 12 √ 
	0,0,0,0, //133 85  Keypad Comma 27 107 
	0,0,0,0, //134 86  Keypad Equal Sign 29
	0,0,0,0, //135 87  Keyboard International1 15,28 56 
	0,0,0,0, //136 88  Keyboard International2 16
	0,0,0,0, //137 89  Keyboard International3 17
	0,0,0,0, //138 8A  Keyboard International4 18
	0,0,0,0, //139 8B  Keyboard International5 19
	0,0,0,0, //140 8C  Keyboard International6 20
	0,0,0,0, //141 8D  Keyboard International7 21
	0,0,0,0, //142 8E  Keyboard International8 22
	0,0,0,0, //143 8F  Keyboard International9 22
	0,0,0,0, //144 90  Keyboard LANG1 25
	0,0,0,0, //145 91  Keyboard LANG2 26
	0,0,0,0, //146 92  Keyboard LANG3 30
	0,0,0,0, //147 93  Keyboard LANG4 31
	0,0,0,0, //148 94  Keyboard LANG5 32
	0,0,0,0, //149 95  Keyboard LANG6 8
	0,0,0,0, //150 96  Keyboard LANG7 8
	0,0,0,0, //151 97  Keyboard LANG8 8
	0,0,0,0, //152 98  Keyboard LANG9 8
	0,0,0,0, //153 99  Keyboard Alternate Erase 7
	0,0,0,0, //154 9A  Keyboard SysReq/Attention 1
	0,0,0,0, //155 9B  Keyboard Cancel 
	0,0,0,0, //156 9C  Keyboard Clear 
	0,0,0,0, //157 9D  Keyboard Prior 
	0,0,0,0, //158 9E  Keyboard Return 
	0,0,0,0, //159 9F  Keyboard Separator 
	0,0,0,0, //160 A0  Keyboard Out 
	0,0,0,0, //161 A1  Keyboard Oper 
	0,0,0,0, //162 A2  Keyboard Clear/Again 
	0,0,0,0, //163 A3  Keyboard CrSel/Props 
	0,0,0,0, //164 A4  Keyboard ExSel 
	0,0,0,0, //165 A5-CF  Reserved 
	0,0,0,0, //166 A5-CF  Reserved 
	0,0,0,0, //167 A5-CF  Reserved 
	0,0,0,0, //168 A5-CF  Reserved 
	0,0,0,0, //169 A5-CF  Reserved 
	0,0,0,0, //170 A5-CF  Reserved 
	0,0,0,0, //171 A5-CF  Reserved  
	0,0,0,0, //172 A5-CF  Reserved  
	0,0,0,0, //173 A5-CF  Reserved 
	0,0,0,0, //174 A5-CF  Reserved 
	0,0,0,0, //175 A5-CF  Reserved 
	0,0,0,0, //176 Keypad 00 
	0,0,0,0, //177 Keypad 000 
	0,0,0,0, //178 Thousands Separator  33
	0,0,0,0, //179 Decimal Separator  33
	0,0,0,0, //180 Currency Unit  34
	0,0,0,0, //181 Currency Sub-unit  34
	0,0,0,0, //182 Keypad ( 
	0,0,0,0, //183 Keypad ) 
	0,0,0,0, //184 Keypad { 
	0,0,0,0, //185 Keypad } 
	0,0,0,0, //186 Keypad Tab 
	0,0,0,0, //187 Keypad Backspace 
	0,0,0,0, //188 Keypad A 
	0,0,0,0, //189 Keypad B 
	0,0,0,0, //190 Keypad C 
	0,0,0,0, //191 Keypad D 
	0,0,0,0, //192 Keypad E 
	0,0,0,0, //193 Keypad F 
	0,0,0,0, //194 Keypad XOR 
	0,0,0,0, //195 Keypad ^ 
	0,0,0,0, //196 Keypad % 
	0,0,0,0, //197 Keypad < 
	0,0,0,0, //198 Keypad > 
	0,0,0,0, //199 Keypad & 
	0,0,0,0, //200 Keypad && 
	0,0,0,0, //201 Keypad | 
	0,0,0,0, //202 Keypad || 
	0,0,0,0, //203 Keypad : 
	0,0,0,0, //204 Keypad # 
	0,0,0,0, //205 Keypad Space 
	0,0,0,0, //206 Keypad @ 
	0,0,0,0, //207 Keypad ! 
	0,0,0,0, //208 Keypad Memory Store 
	0,0,0,0, //209 Keypad Memory Recall 
	0,0,0,0, //210 Keypad Memory Clear 
	0,0,0,0, //211 Keypad Memory Add 
	0,0,0,0, //212 Keypad Memory Subtract 
	0,0,0,0, //213 Keypad Memory Multiply 
	0,0,0,0, //214 Keypad Memory Divide 
	0,0,0,0, //215 Keypad +/- 
	0,0,0,0, //216 Keypad Clear 
	0,0,0,0, //217 Keypad Clear Entry 
	0,0,0,0, //218 Keypad Binary 
	0,0,0,0, //219 Keypad Octal 
	0,0,0,0, //220 Keypad Decimal 
	0,0,0,0, //221 Keypad Hexadecimal 
	0,0,0,0, //222 DE  Reserved 
	0,0,0,0, //223 DF  Reserved 
	0,0,0,0, //224 LeftControl
	0,0,0,0, //225 LeftShift
	0,0,0,0, //226 LeftAlt
	0,0,0,0, //227 LeftGUI
	0,0,0,0, //228 RightControl
	0,0,0,0, //229 RightShift
	0,0,0,0, //230 RightAlt
	0,0,0,0, //231 RightGUI

网上摘抄描述符部分的说明可以作为参考,可能有点不一样:(实际使用数据以我上面的为准)

	//0x05:0000 01 01 这是个全局条目,用途页选择为普通桌面页
	0x05, 0x01, // USAGE_PAGE (Generic Desktop)
	//0x09:0000 10 01 这是个全局条目,用途选择为键盘
	0x09, 0x06, // USAGE (Keyboard)
	//0xa1:1010 00 01 这是个主条目,选择为应用集合,
	0xa1, 0x01, // COLLECTION (Application)
	//0x05:0000 01 11 这是个全局条目,用途页选择为键盘/按键
	0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)

	//0x19:0001 10 01 这是个局部条目,用途的最小值为0xe0,对应键盘上的左ctrl键
	0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
	//0x29:0010 10 01 这是个局部条目,用途的最大值为0xe7,对应键盘上的有GUI(WIN)键
	0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
	//0x15:0001 01 01 这是个全局条目,说明数据的逻辑值最小值为0
	0x15, 0x00, // LOGICAL_MINIMUM (0)
	//0x25:0010 01 01 这是个全局条目,说明数据的逻辑值最大值为1
	0x25, 0x01, // LOGICAL_MAXIMUM (1)

	//0x95:1001 01 01 这是个全局条目,数据域的数量为8个
	0x95, 0x08, // REPORT_COUNT (8)
	//0x75:0111 01 01 这是个全局条目,每个数据域的长度为1位
	0x75, 0x01, // REPORT_SIZE (1)	   
	//0x81:1000 00 01 这是个主条目,有8*1bit数据域作为输入,属性为:Data,Var,Abs
	0x81, 0x02, // INPUT (Data,Var,Abs)

	//0x95:1001 01 01 这是个全局条目,数据域的数量为1个
	0x95, 0x01, // REPORT_COUNT (1)
	//0x75:0111 01 01 这是个全局条目,每个数据域的长度为8位
	0x75, 0x08, // REPORT_SIZE (8)
	//0x81:1000 00 01 这是个主条目,有1*8bit数据域作为输入,属性为:Cnst,Var,Abs
	0x81, 0x03, // INPUT (Cnst,Var,Abs)

	//0x95:1001 01 01 这是个全局条目,数据域的数量为6个
	0x95, 0x06, // REPORT_COUNT (6)
	//0x75:0111 01 01 这是个全局条目,每个数据域的长度为8位
	0x75, 0x08, // REPORT_SIZE (8)
	//0x25:0010 01 01 这是个全局条目,逻辑最大值为255
	0x25, 0xFF, // LOGICAL_MAXIMUM (255)
	//0x19:0001 10 01 这是个局部条目,用途的最小值为0
	0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
	//0x29:0010 10 01 这是个局部条目,用途的最大值为0x65
	0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
	//0x81:1000 00 01 这是个主条目,有6*8bit的数据域作为输入,属相为属性为:Data,Var,Abs
	0x81, 0x00, // INPUT (Data,Ary,Abs)

	//0x25:0010 01 01 这是个全局条目,逻辑的最大值为1
	0x25, 0x01, // LOGICAL_MAXIMUM (1)
	//0x95:1001 01 01 这是个全局条目,数据域的数量为2
	0x95, 0x02, // REPORT_COUNT (2)
	//0x75:0111 01 01 这是个全局条目,每个数据域的长度为1位
	0x75, 0x01, // REPORT_SIZE (1)
	//0x05:0000 01 01 这是个全局条目,用途页选择为LED页
	0x05, 0x08, // USAGE_PAGE (LEDs)
	//0x19:0001 10 01 这是个局部条目,用途的最小值为0x01,对应键盘上的Num Lock
	0x19, 0x01, // USAGE_MINIMUM (Num Lock)
	//0x29:0010 10 01 这是个局部条目,用途的最大值为0x02,对应键盘上的Caps Lock
	0x29, 0x02, // USAGE_MAXIMUM (Caps Lock)
	//0x91:1001 00 01 这是个主条目,有2*1bit的数据域作为输出,属性为:Data,Var,Abs
	0x91, 0x02, // OUTPUT (Data,Var,Abs)
	//0x95:1001 01 01 这是个全局条目,数据域的数量为1个
	0x95, 0x01, // REPORT_COUNT (1)
	//0x75:0111 01 01 这是个全局条目,每个数据域的长度为6bit,正好与前面的2bit组成1字节
	0x75, 0x06, // REPORT_SIZE (6)
	//0x91:1001 00 01 这是个主条目,有1*6bit数据域最为输出,属性为:Cnst,Var,Abs
	0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
	0xc0        // END_COLLECTION
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值