打印
[APM32F1]

极海APM32F103 USB无法识别问题

[复制链接]
909|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hexbei|  楼主 | 2024-4-19 18:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hexbei 于 2024-4-22 09:50 编辑

项目中遇到一个问题,主程序需要用usb,但bootloader中不需要usb,所以usb的初始化代码是放主程序里面的。如果在bootloader消耗的时间长一点,等到主程序初始化usb的时候,就会出现usb无法识别的问题
排查后发现,用极海的开发板在跑没有用到usb的例程时,连接电脑也会有类似弹框。于是拿极海usb cdc例程来尝试复现问题。

修改例程,在usb初始化前增加延时来模拟实际情况。编译下载工程,果然问题复现。
 void Delay(void)
{
    volatile uint32_t delay = 0xfffff;

    while(delay--);
}


int main(void)
{
    APM_MINI_LEDInit(LED2);
    APM_MINI_LEDInit(LED3);
    APM_MINI_LEDOff(LED2);
    APM_MINI_LEDOff(LED3);
    for (int i = 0; i < 30; i++)
    {
        Delay();
    }
    CDC_Init();
    while(1)
    {
        Delay();
        APM_MINI_LEDToggle(LED2);
        APM_MINI_LEDToggle(LED3);
    }
}

仔细观察发现,弹框是在usb初始化前的延时循环时出现的。初步怀疑问题原因是usb的引脚电平不稳导致电脑误识别,之后等到usb初始化后也不会重新连接设备。

尝试修改,上电时就将DM DP 这两个引脚拉低。再测试,问题解决
void gpio_init(void)
{
    GPIO_Config_T gpio_config;
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
    gpio_config.pin = GPIO_PIN_11 | GPIO_PIN_12;
    gpio_config.mode = GPIO_MODE_OUT_PP;
    gpio_config.speed = GPIO_SPEED_2MHz;
    GPIO_Config(GPIOA, &gpio_config);
   
    GPIO_ResetBit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12);
}

void Delay(void)
{
    volatile uint32_t delay = 0xfffff;

    while(delay--);
}


int main(void)
{
    APM_MINI_LEDInit(LED2);
    APM_MINI_LEDInit(LED3);
    gpio_init();
   
    APM_MINI_LEDOff(LED2);
    APM_MINI_LEDOff(LED3);
    for (int i = 0; i < 30; i++)
    {
        Delay();
    }
    CDC_Init();
    while(1)
    {
        Delay();
        APM_MINI_LEDToggle(LED2);
        APM_MINI_LEDToggle(LED3);
    }
}
最后回到实际项目里,在boot loader初始化增加拉低usb的两个引脚电平,问题迎刃而解。

使用特权

评论回复
沙发
SUNKE9| | 2024-4-21 08:46 | 只看该作者
谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

21

帖子

2

粉丝