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