本帖最后由 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的两个引脚电平,问题迎刃而解。
|