OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11995|回复: 15

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第五十四章 触控USB鼠标实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-4-20 22:54:10 | 显示全部楼层 |阅读模式
 

第五十四章 触控USB鼠标实验

       STM32F103系列芯片都自带了USB,不过STM32F103USB都只能用来做设备,而不能用作主机。既便如此,对于一般应用来说已经足够了。本章,我们将向大家介绍如何在ALIENTEK战舰STM32开发板上虚拟一个USB鼠标。本章分为如下几个部分:

54.1 USB简介

54.2 硬件设计

54.3 软件设计

54.4 下载验证


54.1 USB简介

USB ,是英文Universal Serial BUS(通用串行总线)的缩写,而其中文简称为通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康柏、IBMMicrosoft等多家公司联合提出的。

USB发展到现在已经有USB1.0/1.1/2.0/3.0等多个版本。目前用的最多的就是USB1.1USB2.0USB3.0目前已经开始普及。STM32F103自带的USB符合USB2.0规范。

标准USB共四根线组成,VCC/GND,另外为D+,D-;  这两根数据线采用的是差分电压的方式进行数据传输的。在USB主机上,D-D+都是接了15K的电阻到低的,所以在没有设备接入的时候,D+D-均是低电平。而在USB设备中,如果是高速设备,则会在D+上接一个1.5K的电阻到VCC,而如果是低速设备,则会在D-上接一个1.5K的电阻到VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。接下来,我们简单介绍一下STM32USB控制器。

STM32F103MCU自带USB从控制器,符合USB规范的通信连接;PC主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区(专用的512字节,和CAN共用),最多可用于16个单向或8个双向端点。USB模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。

每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据并且端点已配置)随之发生相关的数据传输。USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断来处理。

USB的中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:

1USB低优先级中断(通道20):可由所有USB事件触发(正确传输,USB复位等)。固件在处理中断前应当首先确定中断源。

2USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。

3USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。

USB设备框图如图54.1.1所示:


54.1.1 USB设备框图

整个USB通信的详细过程是很复杂的,本书篇幅有限,这里我们就不再详细介绍其各个环节,感兴趣的读者,可以去看看电脑圈圈的《圈圈教你玩USB》这本书,该书对USB的讲解是很详细的。USB部分,ST提供了几个例程,这些例程对于我们了解STM32F103USB会有不少帮助,尤其在不懂的时候,看看ST的例程,会有意想不到的收获。本实验的USB部分就是移植STJoyStickMouse例程相关部分而来,再加上我们的触摸屏,做成一个触控鼠标。ST提供的USB例程在X\Keil3.80\ARM\Examples\ST\STM32F10xUSBLib\Demos文件夹下(X是你的安装盘)。

54.2 硬件设计

本章实验功能简介:开机的时候先检测触摸屏是否校准过,如果没有,则校准。如果校准过了,则开始触摸屏画图,然后将我们的坐标数据上传到电脑(假定USB已经配置成功了,DS1亮),这样就可以用触摸屏来控制电脑的鼠标了。我们用按键KEY0模拟鼠标右键,用按键KEY2模拟鼠标左键,用按键WK_UPKEY1模拟鼠标滚轮的上下滚动。同样我们也是用DS0来指示程序正在运行。

所要用到的硬件资源如下:

1)  指示灯DS0 DS1

2)  四个按键(KEY0/KEY1/KEY2/WK_UP

3)  串口

4)  TFTLCD模块

5)  USB接口

前面5部分,在之前的实例中都介绍过了,我们在此就不介绍了。接下来看看我们电脑USBSTM32USB连接口。ALIENTEK战舰STM32采用的是5PINMiniUSB接头,用来和STM32USB相连接,连接电路如图54.2.1所示:


54.2.1 MiniUSB接口与STM32的连接电路图

从上图可以看出,USB座没有直接连接到STM32上面,而是通过P13转接,所以我们需要通过跳线帽将PA11PA12分别连接到D-D+,如图54.2.2所示:


54.2.2 硬件连接示意图

 

54.3 软件设计

本章,我们在第三十一章实验(实验26【这里指源码,下同】)的基础上修改,所以先打开第三十一章的工程,在HARDWARE文件夹所在的文件夹下新建一个USB的文件夹,然后在USB文件夹下面新建LIBCONFIG两个文件夹,分别用来存放与USB核相关的代码以及配置部分代码。这两部分代码我们就不细说了(详见光盘本例程源码),给大家看看在这两个文件夹内的代码都有哪些,如图54.3.1所示:


54.3.1 USB相关部分代码

以上代码,就是ST提供的USB固件库代码,LIB文件夹内的是固件库文件,而CONFIG文件夹内的是一些配置文件。LIB文件夹下的.c文件源码来自:X:\Keil3.80A\ARM\RV31\LIB\

ST\STM32F10x\USB目录下,而.h文件来自X:\Keil3.80A\ARM\INC\ST\STM32F10x\USB目录下。CONFIG文件夹下的.c.h文件源码来自X:\Keil3.80A\ARM\Examples\ST\STM32F10xUSBL

ib\Demos\JoyStickMouse下的sourceinclude文件夹(X为你安装MDK的磁盘)。

现在,我们先来介绍一下LIB文件夹下的几个.c文件。

usb_regs.c文件,该文件主要负责USB 控制寄存器的底层操作,里面有个中USB寄存器的底层操作函数。

usb_init.c文件,该文件里面只有一个函数:USB_Init,用于USB控制器的初始化,不过对USB控制器的初始化,是USB_Init调用用其他文件的函数实现的,USB_Init只不过是把他们连接一下罢了,这样使得代码比较规范。

usb_int.c文件,该文件里面只有两个函数CTR_LPCTR_HPCTR_LP负责USB低优先级中断的处理。而CTR_HP负责USB高优先级中断的处理。

usb_mem.c文件,该文件用于处理PMA数据,PMA全称为Packet memory area,是STM32内部用于USB/CAN的专用数据缓冲区,该文件内也只有2个函数即: PMAToUserBufferCopyUserToPMABufferCopy,分别用于将USB 端点的数据传送给主机和主机的数据传送到USB 端点。

usb_croe.c 文件,该文件用于处理USB2.0 协议。

以上几个文件具有很强的独立性,除特殊情况,不需要用户修改,直接调用内部的函数即可。接着我们介绍CONFIG文件夹里面的几个.c文件。

usb_pwr.c文件,该文件用于USB 控制器的电源管理;

usb_istr.c 文件,该文件用于处理USB 中断。

usb_prop.c文件,该文件用于处理Joystick的相关事件,包括Joystick的初始化、复位等等操作。

usb_desc.c文件,该文件用于Joystick描述符的处理。

hw_config.c文件,该文件用于硬件的配置,比如初始化USB时钟、USB中断、低功耗模式处理等。

另外stm32f10x_it.c就是中断服务函数的集合了,这里面我们只保留了两个函数,第一个函数是:USB_LP_CAN1_RX0_IRQHandler函数,我们在该函数里面调用USB_Istr函数,用于处理USB发生的各种中断,注意,这些代码,有些是经过修改了的,尤其是在stm32f10x_it.h文件里面,我们需要屏蔽一段代码,该段代码如下:

void NMI_Handler(void)        __attribute__ ((alias("NMIException")));

void HardFault_Handler(void)  __attribute__ ((alias("HardFaultException")));

void MemManage_Handler(void)  __attribute__ ((alias("MemManageException")));

void BusFault_Handler(void)   __attribute__ ((alias("BusFaultException")));

void UsageFault_Handler(void) __attribute__ ((alias("UsageFaultException")));

void DebugMon_Handler(void)   __attribute__ ((alias("DebugMonitor")));

void SVC_Handler(void)        __attribute__ ((alias("SVCHandler")));

void PendSV_Handler(void)     __attribute__ ((alias("PendSVC")));

void SysTick_Handler(void)    __attribute__ ((alias("SysTickHandler")));

这部分代码因为没有实现具体的函数,所以会报错,这里我们将它们全部屏蔽。后续只要有USB的实验,我们都需要屏蔽这段代码,或者你可以实现这些函数,就不需要屏蔽了。

另外一个函数就是USBWakeUp_IRQHandler函数,我们在该函数就做了一件事:清除中断标志。USB相关代码,就给大家介绍到这里。

接着我们在工程文件里面新建USBUSBCFG组,分别加入USB\LIB下面的代码和USB\CONFIG下面的代码。然后把LIBCONFIG文件夹加入头文件包含路径。

test.c里面,我们修改main函数如下:                                    

//装载画图界面                                       

void Load_Draw_Dialog(void)

{

       LCD_Clear(WHITE);//清屏  

      POINT_COLOR=BLUE;//设置字体为蓝色

       LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域

      POINT_COLOR=RED;//设置画笔蓝色

}      

//计算x1,x2的绝对值

u32 usb_abs(u32 x1,u32 x2)

{

       if(x1>x2)return x1-x2;

       else return x2-x1;

}

//设置USB 连接/断线

//enable:0,断开

//       1,允许连接      

void usb_port_set(u8 enable)

{

       RCC->APB2ENR|=1<<2;    //使能PORTA时钟           

       if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));//退出断电模式

       else

       {      

              _SetCNTR(_GetCNTR()|(1<<1));  // 断电模式

              GPIOA->CRH&=0XFFF00FFF;

              GPIOA->CRH|=0X00033000;

              PAout(12)=0;                      

       }

}       

int main(void)

{           

       u8 key;

       u8 i=0;

      s8 x0;                         //发送到电脑端的坐标值

       s8 y0;

       u8 keysta;                     //[0]:0,左键松开;1,左键按下;

                                          //[1]:0,右键松开;1,右键按下

                                          //[2]:0,中键松开;1,中键按下

       u8 tpsta=0;                   //0,触摸屏第一次按下;1,触摸屏滑动    

       short xlast;                    //最后一次按下的坐标值

       short ylast;                     

     Stm32_Clock_Init(9);    //系统时钟设置

       delay_init(72);                     //延时初始化

       uart_init(72,9600);       //串口1初始化      

       LCD_Init();                  //初始化液晶

       LED_Init();           //LED初始化

       KEY_Init();                  //按键初始化                                                                           

       TP_Init();                            //初始化触摸屏

       usmart_dev.init(72);      //usmart初始化    

       POINT_COLOR=RED;                                                            

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"USB Mouse TEST"); 

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/24");    

       LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL +");  

       LCD_ShowString(60,150,200,16,16,"KEY_DOWN:SCROLL -");    

       LCD_ShowString(60,170,200,16,16,"KEY_RIGHT:RIGHT BTN"); 

       LCD_ShowString(60,190,200,16,16,"KEY_LEFTEFT BTN");     

      delay_ms(1800); usb_port_set(0); //USB先断开

       delay_ms(300); usb_port_set(1);   //USB再次连接        

       //USB配置

      USB_Interrupts_Config();   

      Set_USBClock();  

      USB_Init();           

       Load_Draw_Dialog();   

      while(1)

       {    

              key=KEY_Scan(1);//支持连按

              if(key)

              {                                                                  

                     if(key==KEY_UP)Joystick_Send(0,0,0,1);        //发送滚轮数据到电脑    

                     else if(key==KEY_DOWN)Joystick_Send(0,0,0,(u8)-1); //发送滚轮数据到电脑  

                     else

                     {

                            if(key==KEY_LEFT)keysta|=0X01;                   //发送鼠标左键   

                            if(key==KEY_RIGHT)keysta|=0X02;                 //发送鼠标右键

                            Joystick_Send(keysta,0,0,0);                           //发送给电脑

                     }                               

              }else if(keysta)//之前有按下

              {

                     keysta=0;

                     Joystick_Send(0,0,0,0); //发送松开命令给电脑

              }

              tp_dev.scan(0);              

              if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下

              {

                     //最少移动5个单位,才算滑动

                    if(((usb_abs(tp_dev.x,xlast)>4)||(usb_abs(tp_dev.y,ylast)>4))&&tpsta==0)//滑动

                     {

                            xlast=tp_dev.x;              //记录刚按下的坐标

                            ylast=tp_dev.y;

                           tpsta=1;

                     }

                    if(tp_dev.x<lcddev.width&&tp_dev.y<lcddev.height)

                     {    

                            if(tp_dev.x>216&&tp_dev.y<16)Load_Draw_Dialog();//清除

                            else TP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED);     //画图      

                            if(bDeviceState==CONFIGURED)

                            {  

                                   if(tpsta)//滑动

                                   {

                                          x0=(xlast-tp_dev.x)*3;   //上次坐标值与新坐标值之差,扩大3

                                          y0=(ylast-tp_dev.y)*3;

                                          xlast=tp_dev.x;              //记录刚按下的坐标

                                          ylast=tp_dev.y;

                                          Joystick_Send(keysta,-x0,-y0,0); //发送数据到电脑 

                                          delay_ms(5);     

                                   }      

                            }                            

                     }

              }else { tpsta=0;delay_ms(1);}//清除    

              if(bDeviceState==CONFIGURED)LED1=0;//USB配置成功,LED1亮,否则,灭

              else LED1=1;   

              i++;

              if(i==200) {i=0; LED0=!LED0;}

       }                                                                                                      

在此部分代码用于实现我们在硬件设计部分提到的功能,USB的配置通过三个函数完成:USB_Interrupts_Config()Set_USBClock()USB_Init(),第一个函数用于设置USB唤醒中断和USB低优先级数据处理中断,Set_USBClock函数用于       配置USB时钟,也就是从72M的主频得到48MUSB时钟(1.5分频)。最后USB_Init()函数用于初始化USB,最主要的就是调用了Joystick_init函数,开启了USB部分的电源等。这里需要特别说明的是,USB配置并没有对PA11PA12这两个IO口进行设置,是因为,一旦开启了USB电源(USB_CNTRPDWN位清零)PA11PA12将不再作为其他功能使用,仅供USB使用,所以在开启了USB电源之后不论你怎么配置这两个IO口,都是无效的。要在此获取这两个IO口的配置权,则需要关闭USB电源,也就是置位USB_CNTRPDWN位,我们通过usb_port_set函数来禁止/允许USB连接,在复位的时候,先禁止,再允许,这样每次我们按复位电脑都可以识别到USB鼠标,而不需要我们每次都拔USB线。

USB数据发送,我们采用Joystick_Send来实现,我们将得到的鼠标数据,在Joystick_Send函数里面打包,并通过USB端点1发送到电脑。

软件设计部分,就给大家介绍到这里。

54.4 下载验证

在代码编译成功之后,我们下载代码到ALIENTEK战舰STM32开发板上,在USB没有配置成功的时候,其界面同第三十一章的实验是一模一样的,如图54.4.1所示:


54.4.1 USB无连接时的界面

此时DS1不亮,DS0闪烁,其实就是一个触摸屏画图的功能,而一旦我们将USB连接上(将USB线接到USB接头上,而不是USB_232接头上,如果你有两根USB线,则可以两个同时都接上,他们不会相互影响),则可以看到DS1亮了,而且在电脑上会提示发现新硬件如图54.4.2所示:


54.4.2 电脑提示找到新硬件

在硬件安装完成之后,我们在设备管理器里面可以发现多出了一个人体学输入设备,如图54.4.3所示:


54.4.3 USB人体学输入设备

此时我们按动触摸屏,就可以发现电脑屏幕上的光标随着你在触摸屏上的移动而移动了,同时可以通过按键KEY0KEY2模拟鼠标左键和右键,通过按键WK_UPKEY1模拟鼠标滚轮。

 

《STM32开发指南》第五十四章 USB鼠标实验.rar

568.71 KB, 下载次数: 1644

实验49 触控USB鼠标实验.rar

198.48 KB, 下载次数: 1829

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 11:31:13 | 显示全部楼层
原子哥,我在移植时候hw_config.c总是出现问题,很奇怪。
..\User\USB\USBApp-Source\hw_config.c(39): error:  #20: identifier "RCC_USBCLKSource_PLLCLK_1Div5" is undefined

..\User\USB\USBApp-Source\hw_config.c(101): error:  #20: identifier "USB_LP_CAN1_RX0_IRQn" is undefined

..\User\USB\USBApp-Source\hw_config.c(108): error:  #20: identifier "USBWakeUp_IRQn" is undefined

我的头文件看看没有改动也没少啊。
昨天移植官方例程就出现了这三个错误,今天尝试用你的文件来做还是这个错误。很困惑
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 12:49:48 | 显示全部楼层
这不会是人品问题吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-5-21 13:44:00 | 显示全部楼层
回复【2楼】wwjdwy:
---------------------------------
找这几个东西,没有定义,估计是要包含stm32f10x.h这个头文件才可以。
不过加入这个,其他的很多代码又得去掉stm32f10x_map.h了。
或者干脆简单点,直接自己定义这几个东西(前提是你找到他们的原型)。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 13:46:28 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
包含stm32f10x.h这个头文件也没用。
试了几个例程,大家写法都一样。真没琢磨出我的是怎么回事这里找不到定义了。

看来只能自己定义那几个常量了。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 13:53:10 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
自己定义了那些常量之后:
Test.axf: Error: L6218E: Undefined symbol FLASH_PrefetchBufferCmd (referred from hw_config.o).

Test.axf: Error: L6218E: Undefined symbol FLASH_SetLatency (referred from hw_config.o).

Test.axf: Error: L6218E: Undefined symbol RCC_USBCLKConfig (referred from hw_config.o).

怎么在这一个小地方被卡成这样
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-5-21 13:59:35 | 显示全部楼层
库文件的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 14:34:47 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥能说的详细点么
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-21 14:49:04 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
搞定了,搞定了。编译都过去了呼呼。晚上试试通信。
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2013-6-13 11:13:42 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
有视频没。。。我想看看。关键这个触摸屏连接电脑。。。咋连接了??双USB头连?还是单片部USB。。。。 电脑那头是圆头的那种了
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-6-13 21:41:57 | 显示全部楼层
回复【10楼】敌害:
---------------------------------
没.
是一头接单片机
一头接电脑
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2013-6-14 08:24:16 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
大概明白,但我看我的WARSHIP板子上,左下1是USB  左下2是USB_232;中上有一个那种老式的PS/2的头是用来那个实验的呢?
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2013-6-14 11:09:16 | 显示全部楼层
回复【12楼】敌害:
---------------------------------
PS/2实验,可以接鼠标键盘这些东西.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2014-8-22
在线时间
0 小时
发表于 2014-8-22 15:35:29 | 显示全部楼层
好东西!下载了!
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-5
在线时间
1 小时
发表于 2015-11-9 18:26:56 | 显示全部楼层
亲 你能不能回答下我的问题啊!!我用的是迷你的开发板  接了usb之后连接电脑总显示 这个设备工作不正常  不知道是哪里出了问题
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-11-2
在线时间
18 小时
发表于 2020-12-2 21:49:13 | 显示全部楼层
MD5编译找不到头文件,新手求教
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表