- enum
- {
- LED_NO_1 = 0,
- LED_NO_2,
- LED_NO_3,
- LED_NO_4,
- LED_NUM,
- };
- enum
- {
- KEY_NO_1 = 0,
- KEY_NO_2,
- KEY_NO_3,
- KEY_NO_4,
- KEY_NUM,
- };
- GPIO_Type *led_ports[] = {GPIOB,GPIOB,GPIOC,GPIOC};
- uint16_t led_pins[] = {GPIO_PIN_11,GPIO_PIN_10,GPIO_PIN_7,GPIO_PIN_6};
- GPIO_Type *key_ports[] = {GPIOC,GPIOC,GPIOB,GPIOB};
- uint16_t key_pins[] = {GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_1,GPIO_PIN_2};
- const uint8_t key_press_states[] = {1,0,0,0};
- uint8_t key_press_counts[KEY_NUM];
- uint8_t key_pressed = 0xFF;
- char *key_msg1 = "Hello World!\n";
- char *key_msg2 = "MM32F5330\n";
- uint8_t key_send_index = 0;
- const uint8_t conv_table[128][2] = { HID_ASCII_TO_KEYCODE };
- void APP_LedInit(void)
- {
- uint8_t i = 0;
- GPIO_Init_Type cfg;
- RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
- RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOC, true);
- cfg.PinMode = GPIO_PinMode_Out_PushPull;
- cfg.Speed = GPIO_Speed_50MHz;
- while(i < LED_NUM)
- {
- cfg.Pins = led_pins[i];
- GPIO_Init(led_ports[i],&cfg);
- GPIO_SetBits(led_ports[i],led_pins[i]);
- i += 1;
- }
- }
- void APP_LedOnOff(uint8_t led,uint8_t on)
- {
- if(on)
- GPIO_ClearBits(led_ports[led], led_pins[led]);
- else
- GPIO_SetBits(led_ports[led], led_pins[led]);
- }
- void APP_KeysInit(void)
- {
- GPIO_Init_Type cfg;
- RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
- RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOC, true);
- cfg.PinMode = GPIO_PinMode_In_PullUp;
- cfg.Pins = GPIO_PIN_5;
- GPIO_Init(GPIOC,&cfg);
- cfg.Pins = GPIO_PIN_1|GPIO_PIN_2;
- GPIO_Init(GPIOB,&cfg);
-
- cfg.PinMode = GPIO_PinMode_In_Floating;
- cfg.Pins = GPIO_PIN_4;
- GPIO_Init(GPIOC,&cfg);
- memset(key_press_counts,0,KEY_NUM);
- }
- void APP_KeyStateCheck(void)
- {
- uint8_t i = 0;
- while(i < KEY_NUM)
- {
- if(GPIO_ReadInDataBit(key_ports[i], key_pins[i]) == key_press_states[i])
- {
- if(key_press_counts[i] < 0xFF)
- key_press_counts[i] += 1;
- }
- else
- key_press_counts[i] = 0;
- if(key_press_counts[i] == 20)
- {
- APP_LedOnOff(i,1);
- key_send_index = 0;
- key_pressed = i;
- }
- i += 1;
- }
- }
来了解一下键盘HID消息格式
实现发送方法
- void APP_SendKeyMsg(void)
- {
- uint8_t keycode[6] = { 0 };
- if ( !tud_hid_ready() )
- return;
- if(tud_suspended())
- tud_remote_wakeup();
- switch(key_pressed)
- {
- case KEY_NO_1:
- if(key_send_index/2 < strlen(key_msg1))
- {
- if(key_send_index%2 == 0)
- {
- keycode[0] = conv_table[key_msg1[key_send_index/2]][1];
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, conv_table[key_msg1[key_send_index/2]][0]?KEYBOARD_MODIFIER_LEFTSHIFT:0, keycode);
- }
- else
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
- key_send_index += 1;
- }
- else
- key_pressed = 0xFF;
- break;
- case KEY_NO_2:
- if(key_send_index/2 < strlen(key_msg2))
- {
- if(key_send_index%2 == 0)
- {
- keycode[0] = conv_table[key_msg2[key_send_index/2]][1];
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, conv_table[key_msg2[key_send_index/2]][0]?KEYBOARD_MODIFIER_LEFTSHIFT:0, keycode);
- }
- else
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
- key_send_index += 1;
- }
- else
- key_pressed = 0xFF;
- break;
- case KEY_NO_3:
- keycode[0] = HID_KEY_C;
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, KEYBOARD_MODIFIER_LEFTCTRL, keycode);
- key_pressed = 0xFF;
- break;
- case KEY_NO_4:
- keycode[0] = HID_KEY_V;
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, KEYBOARD_MODIFIER_LEFTCTRL, keycode);
- key_pressed = 0xFF;
- break;
- default:
- tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
- APP_LedOnOff(LED_NO_1,0);
- APP_LedOnOff(LED_NO_2,0);
- APP_LedOnOff(LED_NO_3,0);
- APP_LedOnOff(LED_NO_4,0);
- break;
- }
- }
- void APP_MyTask(void)
- {
- APP_KeyStateCheck();
- APP_SendKeyMsg();
- }
运行效果