본문 바로가기

WCH/CH32V035

CH32X035 SSM - USB CDC 테스트

CH32X035의 가장 큰 특징으로 저렴(300원대)하고 소형에 USB 기능이 있는 MCU인데 USB 기능을 테스트 해보자.

가장 많이 사용되고 간단한 CDC 테스트를 해보자.

 

WHC에서 제공하는 CDC 예제는 USB2UART를 구현해 두었다. 실제 어플리케이션에 적용하려면 UART 기능은 빼고 USB로 데이터를 전송하거나 수신받은 데이터를 처리하는 예제가 필요할 것 같다.

 

그래서 코드를 수정해서 간단히 USB CDC로 ADC값을 전송하는 예제를 작성하였다.

char str_buf[64];

int main(void)
{
	unsigned int adc_Value = 0;
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();

	Delay_Init();
    USART_Printf_Init(115200);
    
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    RCC_Configuration( );

    /* Usb Init */
    USBFS_RCC_Init( );
    USBFS_Device_Init( ENABLE , PWR_VDD_SupplyVoltage());
    
    while(1)
    {
        //USB 인식 되어 있으면
        if(USBFS_DevEnumStatus)
        {
        	adc_Value = Get_ADC_Val(ADC_Channel_8);
            sprintf(str_buf, "%d\r\n", adc_value);
            
            SendCdcData(str_buf, str_len(str_buf));
            Delay_Ms(100);
        }
    }
}

 

 

기본 제공 예제는 USB UART 에뮬레이션 기능이기 때문에 USB 인터럽트 핸들러도 수정해 주어야 한다.

ch32x035_usbfs_device.c

void USBFS_IRQHandler( void )
{
 : 
    /* end-point 1 data out interrupt */
    case USBFS_UIS_TOKEN_OUT | DEF_UEP2:
        USBFSD->UEP2_CTRL_H ^= USBFS_UEP_R_TOG;
        Uart.Tx_PackLen[ Uart.Tx_LoadNum ] = USBFSD->RX_LEN;
        Uart.Tx_LoadNum++;
        USBFSD->UEP2_DMA = (uint32_t)(uint8_t *)&UART2_Tx_Buf[ ( Uart.Tx_LoadNum * DEF_USB_FS_PACK_LEN ) ];
        if( Uart.Tx_LoadNum >= DEF_UARTx_TX_BUF_NUM_MAX )
        {
            Uart.Tx_LoadNum = 0x00;
            USBFSD->UEP2_DMA = (uint32_t)(uint8_t *)&UART2_Tx_Buf[ 0 ];
        }
        Uart.Tx_RemainNum++;
        if( Uart.Tx_RemainNum >= ( DEF_UARTx_TX_BUF_NUM_MAX - 2 ) )
        {
            USBFSD->UEP2_CTRL_H &= ~USBFS_UEP_R_RES_MASK;
            USBFSD->UEP2_CTRL_H |= USBFS_UEP_R_RES_NAK;
            Uart.USB_Down_StopFlag = 0x01;
        }
        break;
: 
}

 

반응형