打印
[STM32F1]

STM32实现带鼠标功能的USB键盘(方法一)的问题

[复制链接]
6335|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我参考圈圈的书,在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);
  }
}

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

可是按下板子上的按键,本来打算在记事本里打出一个1的,可是什么也没有。
请问高手,问题出在哪里?谢谢!
沙发
JY-DX-JY|  楼主 | 2016-1-16 11:49 | 只看该作者
现在有了进展。
主程序如下:
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再接低,鼠标不反应,键盘却可以。好像键盘功能
把鼠标功能覆盖了。

使用特权

评论回复
板凳
gejigeji521| | 2016-2-20 14:58 | 只看该作者
那说明没有配合好啊,要不重启功能怎么失效了呢,楼主研究出来讲讲啊。

使用特权

评论回复
地板
LONGSHEN1| | 2016-8-22 12:00 | 只看该作者
你好,可以分享一下stm32 usb键盘的例程吗

使用特权

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

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝