我們在IAP 升級程序中,需要初始化USB設(shè)備,然后調(diào)用 IAP_Main_Deal()函數(shù)檢測U盤是不是插入,如果失敗就再次調(diào)用這個函數(shù),指導(dǎo)200次之后,升級沒成功則跳轉(zhuǎn)到APP執(zhí)行。
這樣浪費了大量的時間,大概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); ????????????//如果成功升級會直接跳轉(zhuǎn)到APP ????????????IAP_Main_Deal(); ???????????? ????????} ????????//升級沒成功跳轉(zhuǎn)到APP ????????IAP_Jump_APP(); ????}
我想了個辦法,就是先將USB_DM USB_DP這兩根線設(shè)置為輸入信號, 如果檢測到這兩根線上任意一根為高電平則說明有設(shè)備連接上來了,這時候我再重新初始化為USB主機設(shè)備升級。我的檢測程序如下,但是沒有成功。以下是我的檢測程序。請問我這個程序哪里不對哈,該怎么修改哈?
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); }