举报
针对CherryUSB + STM32F103C8 USB CDC设备不识别的问题(特别是USB中断未进入____usbd_event_ep0_setup_complete_handler),以下是逐步排查方案和解决方法:
0x08000000,但中断向量表需对齐到512字节(0x200)system_stm32f1xx.c中修改向量表偏移: SCB->VTOR = 0x08000000 | 0x200; // 对齐到0x08000200stm32f1xx_it.c中注册了正确的USB中断处理函数: #include "cherryusb.h"
void USB_LP_CAN1_RX0_IRQHandler(void) {
usbd_irq_handler(0); // CherryUSB的中断入口
}HAL_PCD_IRQHandler()调用(与CherryUSB冲突)。usbd_configure()函数中启用中断: __HAL_RCC_USB_CLK_ENABLE(); // 使能USB时钟
HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);PLL_USB_DIV_1.5)→ 输出48MHz SystemClock_Config()中确认:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz * 9 = 72MHz
RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3); // 72MHz / 1.5 = 48MHzPA11 (USB_DM) 和PA12 (USB_DP):VBUS_Sensing为Disable)。MX_USB_DEVICE_Init()调用 HAL_PCD_MspInit()中的时钟和引脚配置(但删除HAL中断相关代码)。usbd_descriptor.c中设备描述符正确: const uint8_t usbd_device_descriptor[0x12] = {
0x12, // bLength
DESC_TYPE_DEVICE, // bDescriptorType
0x0200, // bcdUSB (USB 2.0)
CLASS_CDC, // bDeviceClass
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
0x40, // bMaxPacketSize0 (64 bytes)
0x0416, // idVendor (Custom VID)
0x0483, // idProduct (Custom PID)
...
};usb_config.h中开启日志: #define CONFIG_USBDEV_DESC_LOG
#define CONFIG_USBDEV_SETUP_LOG_PRINT
#define CONFIG_USBDEV_REQUEST_LOG_PRINT // 在 usbd_core.c 中手动初始化端点缓存
usbd_ep_buffer_config(EP_IN_ADDR(0x81), 64); // CDC端点1 IN
usbd_ep_buffer_config(EP_OUT_ADDR(0x01), 64); // CDC端点1 OUTUSB D+ 上拉电阻:
Blue Pill板需确认1.5kΩ上拉电阻是否连接到PA12(USB_DP)。若无,需在代码中启用内部上拉:
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 启用内部上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);供电问题:
#include "cherryusb.h"
#include "usb_cdc.h"
int main(void) {
// 1. 初始化系统和时钟(CubeMX生成)
HAL_Init();
SystemClock_Config();
// 2. 初始化USB引脚(CubeMX生成)
MX_GPIO_Init(); // 保留PA11/PA12配置
// 3. 初始化CherryUSB核心
usbd_init();
usbd_cdc_acm_init();
usbd_connect(1); // 连接USB
while (1) {
usbd_polling_loop(); // CherryUSB主循环
}
}uint16_t istatus = USB->ISTR; // ISTR寄存器值
uint16_t cntr = USB->CNTR; // 控制寄存器CONFIG_USBDEV_SETUP_LOG_PRINT的日志,确认Setup包是否被接收。USB_DEVICE文件夹和usbd_conf.c/h文件 通过以上步骤,重点解决中断触发问题并确保CubeMX配置与CherryUSB兼容性,设备应能正确识别。
举报
更多回帖