Thông báo

Collapse
No announcement yet.

giúp đỡ về Keyboard HID với Stm32f103c8t6

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • giúp đỡ về Keyboard HID với Stm32f103c8t6

    Chào mọi người, hiện tại e đang làm một project về Keyboard HID trên con Stm32f103c8t6.
    Hiện tại thì khi e cắm kit với pc thì pc đã nhận kit là một keyboardClick image for larger version

Name:	1.png
Views:	1
Size:	19.1 KB
ID:	1422441
    Nhưng khi bấm nút (giả sử kí tự A) thì lại ko được. em dùng Mikroc
    Code:
    #include "USB_DSC.c"
    char readbuff[64];
    char writebuff[64];
    unsigned long int InterruptCount = 0;
    
    
    
    void USB0Interrupt() iv IVT_INT_USB_LP_CAN_RX0
    {
      //GPIOB_ODR.B2 = 1;
      USB_Interrupt_Proc();
      InterruptCount++;
    
      //GPIOB_ODR.B2 = 0;
    }
    
    
    void usb_init1()
    {
      GPIO_Digital_Output(&GPIOA_BASE, _GPIO_PINMASK_8);    // USB Control
      GPIOA_ODR.B8 = 1;                   // activate USB
      HID_Enable(&readbuff,&writebuff);
    }
    
    void readKeyboard()
    {
     char modifier=0;
     char keycode[6];
    
                   //Some Keyboard Buttons
     keycode[0]=0;
     if (InterruptCount > 10)
     {
    
      if (GPIOA_IDR.B0==1) keycode[0]=0x04;    //A or a
      if (GPIOB_IDR.B4==1) keycode[0]=0x16;    //S or s
      if (GPIOB_IDR.B5==1) keycode[0]=0x07;    //D or d
      if (GPIOB_IDR.B6==1) keycode[0]=0x09;    //F or f
      if (GPIOB_IDR.B7==1) keycode[0]=0x0A;    //G or g
      if (GPIOB_IDR.B8==1) keycode[0]=0x0B;    //H or h
      if (GPIOB_IDR.B9==1) keycode[0]=0x0D;    //J or j
      if (GPIOB_IDR.B10==1)keycode[0]=0x0E;    //K or k
    
      keycode[1]=0;
      keycode[2]=0;
      keycode[3]=0;
      keycode[4]=0;
      keycode[5]=0;
      writebuff[0]=0x01;
      writebuff[1]=0b00000000;
      writebuff[2]=0x00;
      writebuff[3]=keycode;
      writebuff[4]=0;
      writebuff[5]=0;
      writebuff[6]=0;
    
    
     while(!HID_Write(&writebuff, 7));
     writebuff[1] = 0;                       // No modifiers now
     writebuff[3] = 0;                       // No key pressed now
     while(!HID_Write(&writebuff, 7));       // Copy to USB buffer and try to send
    
     }
    
    }
    
    void main()
    {       
            GPIO_digital_input(&GPIOB_BASE, _GPIO_PINMASK_ALL );
            GPIO_digital_output(&GPIOB_BASE, _GPIO_PINMASK_2);
            GPIO_digital_input(&GPIOA_BASE, _GPIO_PINMASK_0 );
            usb_init1();
            UART1_init(115200);
            delay_ms(100);
            while(1)
            {        
                     readKeyboard();
                     delay_ms(100);
            }
    }
    còn đây là thư viện

    Code:
    const unsigned int USB_VENDOR_ID = 0x1234;
    const unsigned int USB_PRODUCT_ID = 0x0001;
    const char USB_SELF_POWER = 0x80;            // Self powered 0xC0,  0x80 bus powered
    const char USB_MAX_POWER = 50;               // Bus power required in units of 2 mA
    const char HID_INPUT_REPORT_BYTES = 64;
    const char HID_OUTPUT_REPORT_BYTES = 64;
    const char USB_TRANSFER_TYPE = 0x03;         //0x03 Interrupt
    const char EP_IN_INTERVAL = 1;
    const char EP_OUT_INTERVAL = 1;
    
    const char USB_INTERRUPT = 1;
    const char USB_HID_EP = 1;
    const char USB_HID_RPT_SIZE = 63;
    
    /* Device Descriptor */
    const struct {
        char bLength;               // bLength         - Descriptor size in bytes (12h)
        char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)
        unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)
        char bDeviceClass;          // bDeviceClass    - Class Code
        char bDeviceSubClass;       // bDeviceSubClass - Subclass code
        char bDeviceProtocol;       // bDeviceProtocol - Protocol code
        char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0
        unsigned int idVendor;      // idVendor        - Vendor ID
        unsigned int idProduct;     // idProduct       - Product ID
        unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)
        char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer
        char iProduct;              // iProduct        - Index of string descriptor for the product.
        char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.
        char bNumConfigurations;    // bNumConfigurations - Number of possible configurations
    } device_dsc = {
          0x12,                   // bLength
          0x01,                   // bDescriptorType
          0x0200,                 // bcdUSB
          0x00,                   // bDeviceClass
          0x00,                   // bDeviceSubClass
          0x00,                   // bDeviceProtocol
          8,                      // bMaxPacketSize0
          USB_VENDOR_ID,          // idVendor
          USB_PRODUCT_ID,         // idProduct
          0x0001,                 // bcdDevice
          0x01,                   // iManufacturer
          0x02,                   // iProduct
          0x00,                   // iSerialNumber
          0x01                    // bNumConfigurations
      };
    
    /* Configuration 1 Descriptor */
    const char configDescriptor1[]= {
        // Configuration Descriptor
        0x09,                   // bLength             - Descriptor size in bytes
        0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)
        0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors
        1,                      // bNumInterfaces      - Number of interfaces in the configuration
        1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests
        0,                      // iConfiguration      - Index of string descriptor for the configuration
        USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings
        USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA
    
        // Interface Descriptor
        0x09,                   // bLength - Descriptor size in bytes (09h)
        0x04,                   // bDescriptorType - The constant Interface (04h)
        0,                      // bInterfaceNumber - Number identifying this interface
        0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.
        2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero
        0x03,                   // bInterfaceClass - Class code
        0,                      // bInterfaceSubclass - Subclass code
        0,                      // bInterfaceProtocol - Protocol code
        0,                      // iInterface - Interface string index
    
        // HID Class-Specific Descriptor
        0x09,                   // bLength - Descriptor size in bytes.
        0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
        0x01,0x01,              // bcdHID - HID specification release number (BCD).
        0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
        1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
        0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
        USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.
    
        // Endpoint Descriptor
        0x07,                   // bLength - Descriptor size in bytes (07h)
        0x05,                   // bDescriptorType - The constant Endpoint (05h)
        USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
        USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information    
        0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
        EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate
    
        // Endpoint Descriptor
        0x07,                   // bLength - Descriptor size in bytes (07h)
        0x05,                   // bDescriptorType - The constant Endpoint (05h)
        USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
        USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
        0x40,0x00,              // wMaxPacketSize - Maximum packet size supported    
        EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
    };
    
    const struct {
      char report[];
    }hid_rpt_desc =
      {
        0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
        0x09, 0x06,                    // USAGE (Keyboard)
        0xa1, 0x01,                    // COLLECTION (Application)
        0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
        0x19, 0xe0,                    //   USAGE_MINIMUM 224(Keyboard LeftControl)
        0x29, 0xe7,                    //   USAGE_MAXIMUM 231(Keyboard Right GUI)    (left and right: alt, shift, ctrl and win)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x95, 0x08,                    //   R EPORT_COUNT (8)
        0x81, 0x02,                    //   INPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
        0x95, 0x05,                    //   REPORT_COUNT (5)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x05, 0x08,                    //   USAGE_PAGE (LEDs)
        0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
        0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
        0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x03,                    //   REPORT_SIZE (3)
        0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
        0x95, 0x06,                    //   REPORT_COUNT (6)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
        0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
        0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
        0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
        0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
        0xc0                           // END_COLLECTION
    
      };
    
    //Language code string descriptor
    const struct {
      char bLength;
      char bDscType;
      unsigned int string[1];
      } strd1 = {
          4,
          0x03,
          {0x0409}
        };
    
    
    //Manufacturer string descriptor
    const struct{
      char bLength;
      char bDscType;
      unsigned int string[10];
      }strd2={
        22,           //sizeof this descriptor string
        0x03,
        {'T','U',' ','G','a','b','r','o','v','o'}
      };
    
    //Product string descriptor
    const struct{
      char bLength;
      char bDscType;
      unsigned int string[15];
    }strd3={
        32,          //sizeof this descriptor string
        0x03,
        {'U','S','B',' ','M','a','n','i','p','u','l','a','t','o','r'}
     };
    
    //Array of configuration descriptors
    const char* USB_config_dsc_ptr[1];
    
    //Array of string descriptors
    const char* USB_string_dsc_ptr[3];
    
    void USB_Init_Desc(){
      USB_config_dsc_ptr[0] = &configDescriptor1;
      USB_string_dsc_ptr[0] = (const char*)&strd1;
      USB_string_dsc_ptr[1] = (const char*)&strd2;
      USB_string_dsc_ptr[2] = (const char*)&strd3;
    }

Về tác giả

Collapse

phamtuantnt Tìm hiểu thêm về phamtuantnt

Bài viết mới nhất

Collapse

  • Andrea14
    Vấn đề về tốc độ quay
    bởi Andrea14
    Chào mọi người,

    Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
    Hôm qua, 12:42
  • bqviet
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi bqviet
    Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
    06-12-2025, 17:17
  • nguyendinhvan
    Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
    bởi nguyendinhvan
    Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
    05-12-2025, 19:59
  • afrendly
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi afrendly
    Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
    04-12-2025, 01:27
Đang tải...
X