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