CH32X035의 USB 기능을 이용하여 USB HID Keyboard를 구현 해 보자.
WCH에서 제공하는 예제는 Keyboard/Mouse 예제 인데 usb_desc.c 파일을 수정해서 Keyboard만 인식하도록 했다.
스위치를 누르면 정의된 키보드 값을 전송하는 간단한 예제를 작성 하였다.
ch32x035_usbfs_device.c 에 정의 되어 있는 USBFS_DevEnumStatus 변수로 장치의 인식여부를 확인 할 수 있다.
int main(void)
{
int sw_flag = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
GPIO_INIT();
Led1On();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
/* Initialize USART2 for receiving the specified keyboard data */
USART2_Init( 115200 );
printf( "USART2 Init OK!\r\n" );
/* Usb Init */
USBFS_RCC_Init( );
USBFS_Device_Init( ENABLE , PWR_VDD_SupplyVoltage());
USB_Sleep_Wakeup_CFG( );
while(1)
{
if(USBFS_DevEnumStatus)
{
if(GetSw1())
{
if(!sw_flag)
{
sw_flag = 1;
Led1On();
//SendKeyDataBuffer("Test ", 5);
SendKeyPress(0, KEY_ENTER, 1);
}
}
else {
if(sw_flag)
{
sw_flag = 0;
Led1Off();
SendKeyPress(0, KEY_ENTER, 0);
}
}
}
}
}
CH32X035 USB로 키값을 전송하는 코드
void SendKeyPress(unsigned char Func, unsigned char KeyValue, unsigned int Status)
{
memset( KB_Data_Pack, 0x00, sizeof( KB_Data_Pack ) );
if(Status)
{
KB_Data_Pack[0] = Func;
KB_Data_Pack[2] = KeyValue;
USBFS_Endp_DataUp( DEF_UEP1, KB_Data_Pack, sizeof( KB_Data_Pack ), DEF_UEP_CPY_LOAD );
}
else
{
USBFS_Endp_DataUp( DEF_UEP1, KB_Data_Pack, sizeof( KB_Data_Pack ), DEF_UEP_CPY_LOAD );
}
//Delay 10ms to ensure that the key value is successfully uploaded, and prepare the data packet indicating the key release.
//Delay_Ms(_KEY_SEND_DELAY);
}
펌웨어 다운로드 후 키보드 장치가 잘 인식되고 스위치를 누를때 마다 키값이 전송된는 것을 확인 할 수 있다.
반응형