FR8000 USB CDC



  • void usb_device_init(void)
    {
    /* USB 12M clock enable /
    /
    USB 48M clock enable /
    /
    USB HCLK enable */
    *(volatile uint32_t *)0x50000004 |= 0xE0000000;

    /* USB_IO_PS0     = 1 */
    /* OTG_VBUS_VAL_I = 1 */
    /* OTG_VBUS_SES_I = 1 */
    /* OTG_VBUSLO_I   = 1 */
    /* OTG_CID_I      = 1 */
    /* USB_STDBY_SEL  = 1 */
    *(volatile uint32_t *)0x5000003C = 0x000C4F09;
    

    #if 1 // 复用USB 需要添加这句
    USB_OTG_CTRL->USB_PHY_SEL = 1;
    #endif
    /* Disable USB all Interrupt except endpoint0 and Bus reset*/
    USB->IntrUSBE = 0x04; /* Enable Bus reset INT /
    USB->IntrTx1E = 0x01; /
    Enable Endpoint0 INT */
    USB->IntrTx2E = 0x00;
    USB->IntrRx1E = 0x00;
    USB->IntrRx2E = 0x00;
    }
    void usb_demo(void)
    {
    #if 0 // USB专用口
    pmu_usb_pad_ctrl(true);

    NVIC_ClearPendingIRQ(USBMCU_IRQn);
    NVIC_SetPriority(USBMCU_IRQn, 0);
    NVIC_EnableIRQ(USBMCU_IRQn);
    

    #else // io复用USB
    GPIO_InitTypeDef GPIO_Handle;
    __SYSTEM_USB_CLK_ENABLE();
    __SYSTEM_GPIO_CLK_ENABLE();

    NVIC_ClearPendingIRQ(USBMCU_IRQn);
    NVIC_SetPriority(USBMCU_IRQn, 2);
    NVIC_EnableIRQ(USBMCU_IRQn);
    
    pmu_usb_pad_ctrl(0);
    
    GPIO_Handle.Pin       = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_Handle.Mode      = GPIO_MODE_OUTPUT_PP;
    gpio_init(GPIO_A, &GPIO_Handle);
    gpio_write_pin(GPIO_A, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_CLEAR);
    co_delay_100us(100);
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_5, PORTA5_FUNC_USB_DM);
    system_set_port_mux(GPIO_PORT_A, GPIO_BIT_4, PORTA4_FUNC_USB_DP);
    

    #endif
    usb_device_init();
    usb_cdc_init();

    usb_DP_Pullup_Enable();
    

    }

    接收到的数据会在这个函数里面
    usb_cdc_OtherEndpoints_Handler(uint8_t RxStatus, uint8_t TxStatus)



  • USB 知识点 请参考



  • 【有道云笔记】FR8000-usb
    https://note.youdao.com/s/SfN8dW10