在Renesas RA系列微控制器(如Vision Board使用的RA6M5)中,USB的配置通常涉及FSP配置器生成底层驱动代码和用户工程中的USB协议栈代码两部分。以下是具体原因和配置流程:
为什么在FSP中看不到USB配置?
FSP的USB模块分工:
- FSP主要处理硬件抽象层(HAL)配置(如时钟、引脚复用、中断)。
- USB的协议栈(如CDC/ACM虚拟串口)需要用户通过代码实现,或依赖额外的中间件(如USBX、TinyUSB)。
OpenMV示例工程的特殊性:
- OpenMV通常使用自定义USB协议栈(非FSP自带),例如修改过的TinyUSB或专用库。
- 这些代码直接集成在工程中(如
usb_*.c/h文件),因此FSP仅配置底层硬件。
USB配置生成步骤
1. FSP硬件层配置
- 启用USB外设:
- 在FSP Configurator的 "Stacks" 选项卡添加USB模块(如
USB Peripheral (r_usb_basic))。
- 设置
USB Mode为Peripheral(设备模式)。
- 时钟配置:
- 在 "Clocks" 选项卡确保USB时钟源(通常为PLL)输出 48MHz。
- 引脚复用:
- 在 "Pins" 选项卡分配
USB_VBUS、USB_OVERCUR、USB_D-、USB_D+引脚。
- 中断配置:
- 在 "Interrupts" 中启用USB中断(如
USBI0)。
2. 用户工程中的协议栈代码
- USB协议栈通常位于以下位置:
src/usb/descriptors.c:定义设备描述符、配置描述符等。
src/usb/usb_init.c:初始化USB核心、注册回调函数。
src/usb/usb_cdc_acm.c:实现CDC/ACM类(虚拟串口)。
关键初始化流程(示例):
void usb_init(void) {
// 初始化FSP生成的USB驱动
R_USB_Open(&g_usb_cfg, &usb_ctrl);
// 注册回调:连接事件、端点数据传输等
R_USB_EventSet(&usb_ctrl, USB_STATUS_CONFIGURED, usb_configured_callback);
// 配置端点(CDC需BULK IN/OUT + INTERRUPT IN)
R_USB_ConfigureEp(&usb_ctrl, EP_ADDR_CDC_BULK_IN, USB_EP_BULK, 64);
// ...其他端点
}
3. 描述符配置(关键)
- USB设备的行为由描述符定义,需在代码中硬编码,例如:
const uint8_t g_usb_device_descriptor[] = {
0x12, // bLength
USB_DT_DEVICE, // bDescriptorType
0x0200, // bcdUSB (USB 2.0)
0xEF, // bDeviceClass (Misc)
// ...其他字段
};
验证配置位置
FSP生成代码:
- 检查
ra_gen目录下的文件:
hal_data.c: 包含usb_cfg_t结构体(引脚、中断配置)。
r_usb_basic_cfg.h: USB模块的参数(如缓冲区大小)。
用户代码:
- 搜索工程中的USB关键字:
usb_init(), tud_init()(TinyUSB函数)。
g_usb_descriptor, USBD_AddInterface()(协议栈接口)。
解决方案
补全FSP配置:
- 确保FSP中已正确添加USB外设堆栈(步骤见上文)。
检查协议栈完整性:
- OpenMV示例可能依赖
libtf/tensorflow/lite/micro/tools/make/targets/renesas中的定制代码,需确认是否包含USB实现。
参考官方示例:
- 用Renesas的 USB CDC示例工程 对比:
- 导入FSP示例:
File > Import > Renesas Example > USB_Device_CDC。
手动添加缺失组件:
- 若协议栈缺失,可集成TinyUSB:
- 复制
src/tinyusb到工程。
- 在
hal_entry.c调用tusb_init()并实现tud_cdc_rx_cb()等回调。
通过以上步骤,USB配置是由FSP硬件配置 + 用户协议栈代码共同完成的。若仍有问题,请检查工程中是否包含完整的USB中间件实现。
在Renesas RA系列微控制器(如Vision Board使用的RA6M5)中,USB的配置通常涉及FSP配置器生成底层驱动代码和用户工程中的USB协议栈代码两部分。以下是具体原因和配置流程:
为什么在FSP中看不到USB配置?
FSP的USB模块分工:
- FSP主要处理硬件抽象层(HAL)配置(如时钟、引脚复用、中断)。
- USB的协议栈(如CDC/ACM虚拟串口)需要用户通过代码实现,或依赖额外的中间件(如USBX、TinyUSB)。
OpenMV示例工程的特殊性:
- OpenMV通常使用自定义USB协议栈(非FSP自带),例如修改过的TinyUSB或专用库。
- 这些代码直接集成在工程中(如
usb_*.c/h文件),因此FSP仅配置底层硬件。
USB配置生成步骤
1. FSP硬件层配置
- 启用USB外设:
- 在FSP Configurator的 "Stacks" 选项卡添加USB模块(如
USB Peripheral (r_usb_basic))。
- 设置
USB Mode为Peripheral(设备模式)。
- 时钟配置:
- 在 "Clocks" 选项卡确保USB时钟源(通常为PLL)输出 48MHz。
- 引脚复用:
- 在 "Pins" 选项卡分配
USB_VBUS、USB_OVERCUR、USB_D-、USB_D+引脚。
- 中断配置:
- 在 "Interrupts" 中启用USB中断(如
USBI0)。
2. 用户工程中的协议栈代码
- USB协议栈通常位于以下位置:
src/usb/descriptors.c:定义设备描述符、配置描述符等。
src/usb/usb_init.c:初始化USB核心、注册回调函数。
src/usb/usb_cdc_acm.c:实现CDC/ACM类(虚拟串口)。
关键初始化流程(示例):
void usb_init(void) {
// 初始化FSP生成的USB驱动
R_USB_Open(&g_usb_cfg, &usb_ctrl);
// 注册回调:连接事件、端点数据传输等
R_USB_EventSet(&usb_ctrl, USB_STATUS_CONFIGURED, usb_configured_callback);
// 配置端点(CDC需BULK IN/OUT + INTERRUPT IN)
R_USB_ConfigureEp(&usb_ctrl, EP_ADDR_CDC_BULK_IN, USB_EP_BULK, 64);
// ...其他端点
}
3. 描述符配置(关键)
- USB设备的行为由描述符定义,需在代码中硬编码,例如:
const uint8_t g_usb_device_descriptor[] = {
0x12, // bLength
USB_DT_DEVICE, // bDescriptorType
0x0200, // bcdUSB (USB 2.0)
0xEF, // bDeviceClass (Misc)
// ...其他字段
};
验证配置位置
FSP生成代码:
- 检查
ra_gen目录下的文件:
hal_data.c: 包含usb_cfg_t结构体(引脚、中断配置)。
r_usb_basic_cfg.h: USB模块的参数(如缓冲区大小)。
用户代码:
- 搜索工程中的USB关键字:
usb_init(), tud_init()(TinyUSB函数)。
g_usb_descriptor, USBD_AddInterface()(协议栈接口)。
解决方案
补全FSP配置:
- 确保FSP中已正确添加USB外设堆栈(步骤见上文)。
检查协议栈完整性:
- OpenMV示例可能依赖
libtf/tensorflow/lite/micro/tools/make/targets/renesas中的定制代码,需确认是否包含USB实现。
参考官方示例:
- 用Renesas的 USB CDC示例工程 对比:
- 导入FSP示例:
File > Import > Renesas Example > USB_Device_CDC。
手动添加缺失组件:
- 若协议栈缺失,可集成TinyUSB:
- 复制
src/tinyusb到工程。
- 在
hal_entry.c调用tusb_init()并实现tud_cdc_rx_cb()等回调。
通过以上步骤,USB配置是由FSP硬件配置 + 用户协议栈代码共同完成的。若仍有问题,请检查工程中是否包含完整的USB中间件实现。
举报