打印

请问 谁有STM32模拟USB键盘的例程啊!

[复制链接]
4844|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2016-2-20 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
gejigeji521| | 2016-2-20 14:55 | 只看该作者
STM32 USB键盘_源码+PCB文件:

     附: 1、STM32 USB键盘工程项目 源代码
           (注:部分是库文件,完全可以编译测试,测试时间小于5小时)
              测试时间大于5小时,自动删除程序,停机!!!                STM32_USB_Keyboard_lib.rar (540.11 KB, 下载次数: 593)  2012-8-22 21:59 上传
点击文件名下载附件






2、STM32 USB键盘_PCB文件:


                STM32_USB_KBC_NoNet.rar (230.95 KB, 下载次数: 546)

使用特权

评论回复
板凳
gejigeji521| | 2016-2-20 14:56 | 只看该作者
我参考圈圈的书,在STM32USB库的基础上成功移植了USB键盘。
现在,我想更进一步,移植带鼠标功能的USB键盘(方法一)。
我先修改了一下PID,把圈圈51例程的报告描述符考到STM32工程里,
报告描述符大小修改为121。
然后,usb_prop.c的下面的函数改为如下:
void Joystick_Reset(void)
{
   /* Set Joystick_DEVICE as not configured */
   pInformation->Current_Configuration = 0;
   pInformation->Current_Interface = 0;/*the default Interface*/

   /* Current Feature initialization */
   pInformation->Current_Feature = Joystick_ConfigDescriptor[7];

   SetBTABLE(BTABLE_ADDRESS);

   /* Initialize Endpoint 0 */
   SetEPType(ENDP0, EP_CONTROL);
   SetEPTxStatus(ENDP0, EP_TX_STALL);
   SetEPRxAddr(ENDP0, ENDP0_RXADDR);
   SetEPTxAddr(ENDP0, ENDP0_TXADDR);
   Clear_Status_Out(ENDP0);
   SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
   SetEPRxValid(ENDP0);

   /* Initialize Endpoint 1 */
   SetEPType(ENDP1, EP_INTERRUPT);
   SetEPTxAddr(ENDP1, ENDP1_TXADDR);
   SetEPTxCount(ENDP1, 9);
   //SetEPRxStatus(ENDP1, EP_RX_DIS);
   SetEPTxStatus(ENDP1, EP_TX_NAK);

   bDeviceState = ATTACHED;

   /* Set this device to response on default address */
   SetDeviceAddress(0);
}

发送键盘数据的函数如下:
void Task_USB_Scan(void *pdata)
{  
         u8 Buffer_Scan1[9] =  {1, 0, 0, 0,  0, 0, 0, 0,0};  
   u8 press_status_1=0;

   u8 press_status_8=0;   
   u8  chk_num1=3;

   pdata= pdata;

   while(1)
   {        

      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_13) == 0x00)
       {     
         if(press_status_1==0)
           {
              press_status_1=1;

              chk_num1=3;

              while((Buffer_Scan1[chk_num1]!=0)&&(chk_num1<8))
              {
                chk_num1++;
              }

              Buffer_Scan1[chk_num1]=0x59;    //KeyPad   ----> number--7              

              //KeyBoard_Send(Buffer_Scan1,8);               
              //CoTickDelay(2);
                                                         UserToPMABufferCopy(Buffer_Scan1, GetEPTxAddr(ENDP1), 9);   //?8???
                                                         /* enable endpoint for transmission */
                                                         SetEPTxValid(ENDP1);
           }                           
        }
       else
        {
          if(press_status_1==1)
          {
            Buffer_Scan1[chk_num1]=0;  

            UserToPMABufferCopy(Buffer_Scan1, GetEPTxAddr(ENDP1), 9);   //?8???
                                                         /* enable endpoint for transmission */
                                                         SetEPTxValid(ENDP1);
          }        

          press_status_1=0;      
        }      


}  
}   

在主程序里,我怕乱,只发送键盘数据,鼠标先不管,先把键盘调好再加鼠标。
程序如下:
int main(void)
{
         unsigned int i;
#ifdef DEBUG
   debug();
#endif
         void *pdata;
   Set_System();
   USB_Interrupts_Config();

   Set_USBClock();
         uart1_init(115200);
   USB_Init();
         //Uart1_SendByte(0x55);
   while (1)
   {

//                if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
//    {
//      Joystick_Send(JoyState());
//    }
                 Task_USB_Scan(pdata);
   }
}

程序下到板子里,设备管理器里键盘和鼠标都出来了,如下图:


2.jpg (66.5 KB, 下载次数: 0)
下载附件  保存到相册
2016-1-16 10:40 上传





可是按下板子上的按键,本来打算在记事本里打出一个1的,可是什么也没有。
请问高手,问题出在哪里?谢谢!

使用特权

评论回复
地板
gejigeji521| | 2016-2-20 14:57 | 只看该作者
现在有了进展。
主程序如下:
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
                 {
                         if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
                         {
                                 Joystick_Send(JoyState());
                         }
           }
                 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==1)
                         Task_USB_Scan(pdata);
GPIOA2用来选择鼠标还是键盘。
当GPIOA2接高电平,选择键盘,否则选择鼠标。
测试结果如下:
一上电,GPIOA2接低,鼠标正常。然后GPIOA2高,键盘正常。
然后GPIOA2再接低,鼠标不反应,键盘却可以。好像键盘功能
把鼠标功能覆盖了。

原帖在:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=1272304

使用特权

评论回复
5
冰是睡着的冰| | 2016-2-20 15:02 | 只看该作者
usb键盘枚举的例子,网上很多的吧。

使用特权

评论回复
6
playergatsby| | 2016-2-21 17:11 | 只看该作者
有键盘和鼠标可以同时枚举的例子的,设备描述符弄好就没事了。

使用特权

评论回复
7
单片机菜菜| | 2016-2-21 23:03 | 只看该作者
gejigeji521 发表于 2016-2-20 14:57
现在有了进展。
主程序如下:
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)

这个问题解决了没呢,我以前也碰到过这个问题,但是用的别人的代码解决了。

使用特权

评论回复
8
gejigeji521| | 2016-2-26 21:35 | 只看该作者
/* Initialize Endpoint 0 */
   SetEPType(ENDP0, EP_CONTROL);
   SetEPTxStatus(ENDP0, EP_TX_STALL);
   SetEPRxAddr(ENDP0, ENDP0_RXADDR);
   SetEPTxAddr(ENDP0, ENDP0_TXADDR);
   Clear_Status_Out(ENDP0);
   SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
   SetEPRxValid(ENDP0);

使用特权

评论回复
9
東南博士| | 2016-3-18 20:32 | 只看该作者
搞定了没有?
你可以选择的是淘宝的一款芯片,串口转键盘的芯片!

使用特权

评论回复
10
wangjiahao88|  楼主 | 2016-3-19 15:09 | 只看该作者
找打了一款极其简单的USB键盘IC!

使用特权

评论回复
11
wangjiahao88|  楼主 | 2016-3-19 15:15 | 只看该作者
UI017
模拟 USB  键盘的 USB  接口芯片

使用特权

评论回复
12
wangjiahao88|  楼主 | 2016-3-21 21:43 | 只看该作者

UI017

淘宝买的!给大家推荐这个!

省掉很多额外的开发步骤!

使用特权

评论回复
13
mioc| | 2017-4-18 22:55 | 只看该作者
太牛X了 正是我所需要的东西

使用特权

评论回复
14
wangjiahao88|  楼主 | 2017-4-21 09:50 | 只看该作者
感觉 怎么说呢 这个成本 比较贵 但是 比较简单。

那个单芯片的 应该也非常稳定吧!

使用特权

评论回复
15
powermaker2568| | 2017-4-22 16:25 | 只看该作者
官方BSP里面有!

而且淘宝很多开发板的连接里面 也有!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

479

主题

7533

帖子

30

粉丝