STM32的USB键盘及鼠标例程

发布者:知者如渊最新更新时间:2012-08-04 来源: 21ic 关键字:STM32  USB键盘  鼠标例程 手机看文章 扫描二维码
随时随地手机看文章

STM32的USB键盘及鼠标例程通过网络可以搜到很,但是在同一个设备中集成键盘及鼠标的例程却比较少见(我通过GOOGLE只搜到圈圈的基于51+D12的版本)。以下为我参考圈圈的例程做出来的集成键盘及鼠标的STM32的程序。

  程序上除了usb_desc.c及usb_endp.c外,其它部份同单一的键盘鼠标一样。下面着重说一下usb_desc.c及usb_endp.c的不同之处。

  单一键盘鼠标跟集成键盘鼠标这区别主要是报告描述符不同。单一键盘鼠标的报告描述符因只有一组报告输入/输出,故没有报告ID,而集成的有两组报告(键盘及鼠标),所以每一组报告都有一个报告ID加以区别。

  另外就是在usb_endp.c中对端点的数据发送不知道是不是我的原因,待发送数据长度有问题,原因还未找到,只能在后面增加一条设置发送数据长度的语句。(如果不加的话,PC端只会收到8位数据,尽管我程序里设置了9位数据)

  完整的usb_desc.c文件如下:

  #include "STM32Lib\\USBLib\\usb_lib.h"

  #include "usb_desc.h"

  // KM_DeviceDescriptor

  const u8 HID_DeviceDescriptor[HID_SIZE_DEVICE_DESC]=

  {

  0X12, // bLength

  USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType

  0x00, // bcdUSB

  0x02,

  0x00, // bDeviceClass

  0X00, // bDeviceSubClass

  0x00, // bDeviceProtocol

  0x40, // bMaxPacketSize40

  0x34, // idVendor (0x0483)

  0x12,

  0x78, // idProduct = 0x5710

  0x56,

  0x00, // bcdDevice rel.20.00

  0x02,

  1, // index of string descriptor describing manufacturer

  2, // index of string descriptor describing product

  3, // index of string descriptor describing the device serial number

  0x01 // bNumConfigurations

  };

  // USB Configuration Descriptor

  const u8 HID_ConfigDescriptor[HID_SIZE_CONFIG_DESC]=

  {

  0X09, // bLength

  USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType

  HID_SIZE_CONFIG_DESC, // wTotalLength

  0x00,

  0x01, // bNumInterfaces 接口数目

  0x01, // bConfigurationValue set_configuration命令所需要的参数值

  0x00, // iConfiguration

  0xE0, // bmAttributes

  0x32, // MaxPower 100mA

  //***************接口1配置***************

  0x09,

  USB_INTERFACE_DESCRIPTOR_TYPE,

  0x00, // 接口编号

  0x00,

  0x02, // 端点数

  0x03,

  0x01, // 1 = boot 0 = no boot

  0x01, // 0 = none 1 = keyboard 2 = mouse

  0, //接口描述符索引值

  //***************HID 描述符****************

  0x09,

  HID_DESCRIPTOR_TYPE,

  0x10,

  0x01,

  0x00,

  0x01,

  0x22,

  HID_SIZE_REPORT_DESC,

  0x00,

  //***************端点1输入描述***************

  0x07,

  USB_ENDPOINT_DESCRIPTOR_TYPE,

  0x81,

  0x03,

  0x0A,

  0x00,

  0x20,
[page]

//***************端点1输出描述***************

 

  0x07,

  USB_ENDPOINT_DESCRIPTOR_TYPE,

  0x01,

  0x03,

  0x0A,

  0x00,

  0x20,

  };

  // MOUSE ConfigDescriptor

  const u8 HID_ReportDescriptor[HID_SIZE_REPORT_DESC]=

  {

  /************************USB键盘部分报告描述符**********************/

  /*****************************************************************

**/

  //这是一个全局(bType为1)条目,将用途页选择为普通桌面Generic Desktop Page(0x01)

  //后面跟一字节数据(bSize为1),后面的字节数就不注释了,

  //自己根据bSize来判断。

  0x05, 0x01, // USAGE_PAGE (Generic Desktop)

  //这是一个局部(bType为2)条目,说明接下来的集合用途用于键盘

  0x09, 0x06, // USAGE (Keyboard)

  //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示

  //该集合是一个应用集合。它的性质在前面由用途页和用途定义为

  //普通桌面用的键盘。

  0xa1, 0x01, // COLLECTION (Application)

  //报告ID,这里定义键盘报告的ID为1(报告ID 0是保留的)

  0x85, 0x01, //Report ID (1)

  //这是一个全局条目,选择用途页为键盘(Keyboard/Keypad(0x07))

  0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)

  //这是一个局部条目,说明用途的最小值为0xe0。实际上是键盘左Ctrl键。

  //具体的用途值可在HID用途表中查看。

  0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)

  //这是一个局部条目,说明用途的最大值为0xe7。实际上是键盘右GUI键。

  0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)

  //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值)

  //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。

  0x15, 0x00, // LOGICAL_MINIMUM (0)

  //这是一个全局条目,说明逻辑值最大为1。

  0x25, 0x01, // LOGICAL_MAXIMUM (1)

  //这是一个全局条目,说明数据域的数量为八个。

  0x95, 0x08, // REPORT_COUNT (8)

  //这是一个全局条目,说明每个数据域的长度为1个bit。

  0x75, 0x01, // REPORT_SIZE (1)

  //这是一个主条目,说明有8个长度为1bit的数据域(数量和长度

  //由前面的两个全局条目所定义)用来做为输入,

  //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示

  //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。

  //这样定义的结果就是,当某个域的值为1时,就表示对应的键按下。

  //bit0就对应着用途最小值0xe0,bit7对应着用途最大值0xe7。

  0x81, 0x02, // INPUT (Data,Var,Abs)

  //这是一个全局条目,说明数据域数量为1个

  0x95, 0x01, // REPORT_COUNT (1)

  //这是一个全局条目,说明每个数据域的长度为8bit。

  0x75, 0x08, // REPORT_SIZE (8)

  //这是一个主条目,输入用,由前面两个全局条目可知,长度为8bit,

  //数量为1个。它的属性为常量(即返回的数据一直是0)。

  //该字节是保留字节(保留给OEM使用)。

  0x81, 0x03, // INPUT (Cnst,Var,Abs)

  //这是一个全局条目。定义位域数量为6个。

  0x95, 0x06, // REPORT_COUNT (6)

  //这是一个全局条目。定义每个位域长度为8bit。

  //其实这里这个条目不要也是可以的,因为在前面已经有一个定义

  //长度为8bit的全局条目了。

  0x75, 0x08, // REPORT_SIZE (8)

  //这是一个全局条目,定义逻辑最小值为0。

  //同上,这里这个全局条目也是可以不要的,因为前面已经有一个

  //定义逻辑最小值为0的全局条目了。

  0x15, 0x00, // LOGICAL_MINIMUM (0)

  //这是一个全局条目,定义逻辑最大值为255。

  0x25, 0xFF, // LOGICAL_MAXIMUM (255)

  //这是一个全局条目,选择用途页为键盘。

  //前面已经选择过用途页为键盘了,所以该条目不要也可以。

  0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)

  //这是一个局部条目,定义用途最小值为0(0表示没有键按下)

  0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))

  //这是一个局部条目,定义用途最大值为0x65

  0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)

  //这是一个主条目。它说明这六个8bit的数据域是输入用的,

  //属性为:Data,Ary,Abs。Data说明数据是可以变的,Ary说明

  //这些数据域是一个数组,即每个8bit都可以表示某个键值,

  //如果按下的键太多(例如超过这里定义的长度或者键盘本身无法

  //扫描出按键情况时),则这些数据返回全1(二进制),表示按键无效。

  //Abs表示这些值是绝对值。

  0x81, 0x00, // INPUT (Data,Ary,Abs)

  //以下为输出报告的描述

  //逻辑最小值前面已经有定义为0了,这里可以省略。

  //这是一个全局条目,说明逻辑值最大为1。

  0x25, 0x01, // LOGICAL_MAXIMUM (1)

  //这是一个全局条目,说明数据域数量为5个。

  0x95, 0x05, // REPORT_COUNT (5)

  //这是一个全局条目,说明数据域的长度为1bit。

  0x75, 0x01, // REPORT_SIZE (1)

  //这是一个全局条目,说明使用的用途页为指示灯(LED)

  0x05, 0x08, // USAGE_PAGE (LEDs)

  //这是一个局部条目,说明用途最小值为数字键盘灯。

  0x19, 0x01, // USAGE_MINIMUM (Num Lock)

  //这是一个局部条目,说明用途最大值为Kana灯。

  0x29, 0x05, // USAGE_MAXIMUM (Kana)

  //这是一个主条目。定义输出数据,即前面定义的5个LED。

  0x91, 0x02, // OUTPUT (Data,Var,Abs)

  //这是一个全局条目。定义位域数量为1个。

  0x95, 0x01, // REPORT_COUNT (1)

  //这是一个全局条目。定义位域长度为3bit。

  0x75, 0x03, // REPORT_SIZE (3)

  //这是一个主条目,定义输出常量,前面用了5bit,所以这里需要

  //3个bit来凑成一字节。

  0x91, 0x03, // OUTPUT (Cnst,Var,Abs)

  //下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。

  0xc0, // END_COLLECTION

  //以下注释不包括第一字节报告ID。

  //通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。

  //第一字节的8个bit用来表示特殊键是否按下(例如Shift、Alt等键)。

  //第二字节为保留值,值为常量0。第三到第八字节是一个普通键键值的

  //数组,当没有键按下时,全部6个字节值都为0。当只有一个普通键按下时,

  //这六个字节中的第一字节值即为该按键的键值(具体的键值请看HID的

  //用途表文档),当有多个普通键同时按下时,则同时返回这些键的键值。

  //如果按下的键太多,则这六个字节都为0xFF(不能返回0x00,这样会让

  //操作系统认为所有键都已经释放)。至于键值在数组中的先后顺序是

  //无所谓的,操作系统会负责检查是否有新键按下。我们应该在中断端点1

  //中按照上面的格式返回实际的键盘数据。另外,报告中还定义了一个字节

  //的输出报告,是用来控制LED情况的。只使用了低7位,高1位是保留值0。

  //当某位的值为1时,则表示对应的LED要点亮。操作系统会负责同步各个

  //键盘之间的LED,例如你有两块键盘,一块的数字键盘灯亮时,另一块

  //也会跟着亮。键盘本身不需要判断各种LED应该何时亮,它只是等待主机

  //发送报告给它,然后根据报告值来点亮相应的LED。我们在端点1输出中断

  //中读出这1字节的输出报告,然后对它取反(因为学习板上的LED是低电平时

  //亮),直接发送到LED上。这样main函数中按键点亮LED的代码就不需要了。

[page]

/************************USB鼠标部分报告描述符**********************/

 

  /**************************************************************

*****/

  //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)

  0x05, 0x01, // USAGE_PAGE (Generic Desktop)

  //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标

  0x09, 0x02, // USAGE (Mouse)

  //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示

  //该集合是一个应用集合。它的性质在前面由用途页和用途定义为

  //普通桌面用的鼠标。

  0xa1, 0x01, // COLLECTION (Application)

  //报告ID,这里定义鼠标报告的ID为2

  0x85, 0x02, //Report ID (2)

  //这是一个局部条目。说明用途为指针集合

  0x09, 0x01, // USAGE (Pointer)

  //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个

  //物理集合,用途由前面的局部条目定义为指针集合。

  0xa1, 0x00, // COLLECTION (Physical)

  //这是一个全局条目,选择用途页为按键(Button Page(0x09))

  0x05, 0x09, // USAGE_PAGE (Button)

  //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。

  0x19, 0x01, // USAGE_MINIMUM (Button 1)

  //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。

  0x29, 0x03, // USAGE_MAXIMUM (Button 3)

  //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)

  //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。

  0x15, 0x00, // LOGICAL_MINIMUM (0)

  //这是一个全局条目,说明逻辑值最大为1。

  0x25, 0x01, // LOGICAL_MAXIMUM (1)

  //这是一个全局条目,说明数据域的数量为三个。

  0x95, 0x03, // REPORT_COUNT (3)

  //这是一个全局条目,说明每个数据域的长度为1个bit。

  0x75, 0x01, // REPORT_SIZE (1)

  //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度

  //由前面的两个全局条目所定义)用来做为输入,

  //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示

  //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。

  //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,

  //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示

  //按键3(中键)是否按下。

  0x81, 0x02, // INPUT (Data,Var,Abs)

  //这是一个全局条目,说明数据域数量为1个

  0x95, 0x01, // REPORT_COUNT (1)

  //这是一个全局条目,说明每个数据域的长度为5bit。

  0x75, 0x05, // REPORT_SIZE (5)

  //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,

  //数量为1个。它的属性为常量(即返回的数据一直是0)。

  //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据

  //而已,所以它是没有实际用途的。

  0x81, 0x03, // INPUT (Cnst,Var,Abs)

  //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)

  0x05, 0x01, // USAGE_PAGE (Generic Desktop)

  //这是一个局部条目,说明用途为X轴

  0x09, 0x30, // USAGE (X)

  //这是一个局部条目,说明用途为Y轴

  0x09, 0x31, // USAGE (Y)

  //这是一个局部条目,说明用途为滚轮

  0x09, 0x38, // USAGE (Wheel)

  //下面两个为全局条目,说明返回的逻辑最小和最大值。

  //因为鼠标指针移动时,通常是用相对值来表示的,

  //相对值的意思就是,当指针移动时,只发送移动量。

  //往右移动时,X值为正;往下移动时,Y值为正。

  //对于滚轮,当滚轮往上滚时,值为正。

  0x15, 0x81, // LOGICAL_MINIMUM (-127)

  0x25, 0x7f, // LOGICAL_MAXIMUM (127)

  //这是一个全局条目,说明数据域的长度为8bit。

  0x75, 0x08, // REPORT_SIZE (8)

  //这是一个全局条目,说明数据域的个数为3个。

  0x95, 0x03, // REPORT_COUNT (3)

  //这是一个主条目。它说明这三个8bit的数据域是输入用的,

  //属性为:Data,Var,Rel。Data说明数据是可以变的,Var说明

  //这些数据域是独立的,即第一个8bit表示X轴,第二个8bit表示

  //Y轴,第三个8bit表示滚轮。Rel表示这些值是相对值。

  0x81, 0x06, // INPUT (Data,Var,Rel)

  //下面这两个主条目用来关闭前面的集合用。

  //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。

  0xc0, // END_COLLECTION

  0xc0 // END_COLLECTION

  //以下注释不包括第一字节报告ID。

  //通过上面的报告描述符的定义,我们知道返回的输入报告具有4字节。

  //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。

  //第二字节表示X轴改的变量,第三字节表示Y轴的改变量,第四字节表示

  //滚轮的改变量。我们在中断端点1中应该要按照上面的格式返回实际的

  //鼠标数据。

  };

  // USB String Descriptors

  const u8 HID_StringLangID[HID_SIZE_STRING_LANGID]=

  {

  HID_SIZE_STRING_LANGID,

  USB_STRING_DESCRIPTOR_TYPE,

  0x09,

  0x04

  };

  const u8 HID_StringVendor[HID_SIZE_STRING_VENDOR]=

  {

  HID_SIZE_STRING_VENDOR,

  USB_STRING_DESCRIPTOR_TYPE,

  \'S\', 0, \'T\', 0, \'M\', 0, \'i\', 0, \'c\', 0, \'r\', 0, \'o\', 0, \'e\', 0,

  \'l\', 0, \'e\', 0, \'c\', 0, \'t\', 0, \'r\', 0, \'o\', 0, \'n\', 0, \'i\', 0,

  \'c\', 0, \'s\', 0

  };

  const u8 HID_StringProduct[HID_SIZE_STRING_PRODUCT] =

  {

  HID_SIZE_STRING_PRODUCT, /* bLength */

  USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */

  0x34, 0x6c, //水

  0x62, 0x97, //面

  0x4b, 0x4e, //之

  0x0b, 0x4e, //下

  0x84, 0x76, //的

  0x55, 0x00, //U

  0x53, 0x00, //S

  0x42, 0x00, //B

  0x4b, 0x6d, //测

  0xd5, 0x8b, //试

  };

  u8 HID_StringSerial[HID_SIZE_STRING_SERIAL] =

  {

  HID_SIZE_STRING_SERIAL, /* bLength */

  USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */

  0x73, 0x00, //s

  0x6e, 0x00, //n

  0x69, 0x00, //i

  0x63, 0x00, //c

  0x5f, 0x00, //_

  0x6b, 0x00, //k

  0x84, 0x76, //的

  0x55, 0x00, //U

  0x53, 0x00, //S

  0x42, 0x00, //B

  0x2e, 0x95, //键

  0xd8, 0x76, //盘

  };

关键字:STM32  USB键盘  鼠标例程 引用地址:STM32的USB键盘及鼠标例程

上一篇:基于STM32的交流永磁同步电机驱动器设计
下一篇:基于STM32F103R8T6的数字量度继电器设计

推荐阅读最新更新时间:2024-03-16 13:04

STM32速成笔记(2)—GPIO
一、什么是GPIO GPIO(英语:General-purpose input/output),通用型之输入输出的简称,可以用来输入高低电平或者输出高低电平。这里的高电平指的是3.3V,低电平指的是0V。通常称GPIO为IO口,或者引脚。 STM32F103ZET6有GPIOx_0~GPIOx_15,其中x = A,B,C,D,E,F,G。 二、GPIO的输入/输出模式 GPIO有多种输入输出模式,输入模式有 • 输入浮空 输入浮空指的是GPIO与外设之间既不接高电平,也不接低电平,呈高阻态。除了类似于在数据传输时将GPIO配置为输入浮空外,一般不配置为该模式。因为输入浮空状态的GPIO电压具有不确定性,可能是0V,
[单片机]
<font color='red'>STM32</font>速成笔记(2)—GPIO
STM32复位电路
** STM32复位电路 **
[单片机]
<font color='red'>STM32</font>复位电路
STM32—SPI读写FLASH
FLASH简介 FLASH俗称闪存,和EEPROM一样,都是掉电数据不丢失的非易失行存储器,但FLASH的存储容量普遍大于EEPROM,现在像如U盘、SD卡、SSD固态硬盘以及STM32芯片内部存储程序的设备都是FLASH类型的存储器。由此可见FLASH对于我们学习和工作的重要性,EEPROM可以实现单字节的擦写,而FLASH都是一大片的擦写,就像是大规模杀伤性武器,其最小擦除单位:扇区的大小也是4KB。 我们此次通过SPI对FLASH存储芯片W25Q64进行读写擦除的操作。 对于FLASH内部结构的详细说明博主会专门整理一篇博客来说明,所以关于FLASH芯片的相关原理,本文中只做简单说明,侧重代码部分。 FLASH详细说明的
[单片机]
<font color='red'>STM32</font>—SPI读写FLASH
STM32高级定时器死区时间的配置及计算
互补输出和死区插入 死区概念 高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟…)来调整死区时间 每路输出可以独立选择输出极性(主输出 OCx 或互补输出 OCxN)。可通过对 TIMx_CCER寄存器中的 CCxP 和 CCxNP 位执行写操作来完成极性选择。 TIM1 和 TIM8 断路和死区寄存器 (TIMx_BDTR) 寄存器功能展示 1.明确自己定时器系统时钟 系统时钟— AHB 预分频器 && APB2 预分频器值 得到自己定时器的系统时钟为168M 2.计算tDTS
[单片机]
<font color='red'>STM32</font>高级定时器死区时间的配置及计算
STM32_DAC输出三角波形
今天的软件工程下载地址(360云盘): https://yunpan.cn/cPi8GB2DyeKzI 访问密码 1a45 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 工程概要说明:该工程通过配置,输出固定三角波形,频率和幅度也是固定的,当然也是可以变化,如果有朋友需要可以微信公众号中留言。 关于“STM32F103 DAC输出三角波形” 我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“EmbeddDeveloper”查阅或留言。 一、RCC时钟配置 该函数位于在bsp.c文件下面; 使能RCC时钟:RC
[单片机]
STM32_DAC输出三角波形
STM32增强型微控制器访问NAND Flash学习笔记
一、了解NAND Flash 简单的理解就是,NORFlash具有随机存取和随字节执行写操作的能力,即可以访问到存储器内部的任意一个字节,且具有读取速度快等特点,它占据1MB—16MB闪存的大部分市场,根据其读取数据速度快的特点主要应用在代码存储;而NAND Flash以“页”为单位进行对数据的读写操作,且具有写入和擦除速度快等特点,它应用在8MB—256MB的产品中,根据其特点主要应用在数据存储上。 以型号HY27UF081G2A的NAND Flash芯片为例,其总线宽度为8bit,总内存大小为1Gbit(即128MB),共分为1024块(Block),每块又分为64页(Page),每页共2KB(main memo
[单片机]
<font color='red'>STM32</font>增强型微控制器访问NAND Flash学习笔记
关于STM32的 一个TIM1 的PWM程序和PWM简单使用
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有 死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*P
[单片机]
关于<font color='red'>STM32</font>的 一个TIM1 的PWM程序和PWM简单使用
STM32开发者社区:从这里开启你的STM32之旅!小白和PRO都友好
当面对STM32Cube生态系统这样一个庞大而丰富的开发世界时,工程师难免会产生疑问,从哪里开始才好? ST的许多合作伙伴和客户都希望有更多的产品能够利用STM32Cube开发环境。开发人员很享受开发环境的图形用户界面和工具的易用性,如STM32CubeMX、免费的STM32CubeIDE以及许多软件包、驱动程序和中间件,这些都有助于更快地将产品推向市场。随着越来越多的企业选择ST的产品,越来越多的工程师在ST的生态系统中迈出了第一步。为了降低开发人员的进入门槛,ST推出了STM32开发者社区。开发者社区如何为开发团队提供帮助,ST如何将STM32生态系统整合在一起?让我们详细聊聊。 STM32开发者社区 为开
[单片机]
<font color='red'>STM32</font>开发者社区:从这里开启你的<font color='red'>STM32</font>之旅!小白和PRO都友好
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved