我们在IAP 升级程序中,需要初始化USB设备,然后调用 IAP_Main_Deal()函数检测U盘是不是插入,如果失败就再次调用这个函数,指导200次之后,升级没成功则跳转到APP执行。
这样浪费了大量的时间,大概2秒-4秒左右。这个200次还不能少,少于200次则有时候能成功有时候不能升级成功,有没有什么办法,能快速检测这个USB的接口是否有U盘插入呢?
int main() { //升级程序 for(int k=0;k<200;k++) { printf("Check UsB:%d\r\n",k); if(k%50==0) GPIOC->OUTDR^=(GPIO_Pin_10 | GPIO_Pin_11); Delay_Ms(1); //如果成功升级会直接跳转到APP IAP_Main_Deal(); } //升级没成功跳转到APP IAP_Jump_APP(); }
我想了个办法,就是先将USB_DM USB_DP这两根线设置为输入信号, 如果检测到这两根线上任意一根为高电平则说明有设备连接上来了,这时候我再重新初始化为USB主机设备升级。我的检测程序如下,但是没有成功。以下是我的检测程序。请问我这个程序哪里不对哈,该怎么修改哈?
int USB_DetectDevice(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; //端口配置 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); Delay_Ms(10); printf("USB_Detect:%8.8X\r\n",GPIOA->INDR & (GPIO_Pin_11 | GPIO_Pin_12)); //如果有U盘插入,由于1.5K上拉电阻的存在,PA11和PA12必有一根线为高电平, return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11 | GPIO_Pin_12); }