본문 바로가기

WCH/CH32V035

CH32X035 SSM - USB Keyboard 테스트

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);
}

 

 

펌웨어 다운로드 후 키보드 장치가 잘 인식되고 스위치를 누를때 마다 키값이 전송된는 것을 확인 할 수 있다.

반응형