这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-11 | gingko | 初次建立 |
int main(void) { /* MCU配置 */ /* 重置所有外设, 初始化Flash接口和Systick. */ HAL_Init(); /* 系统时钟配置 */ SystemClock_Config(); /* 初始化所有已配置的外设 */ MX_GPIO_Init(); MX_USB_HOST_Init(); MX_FATFS_Init(); if(ARM_KEY_STATE == KEY_UP) goto start; while (1) { MX_USB_HOST_Process(); } start: //测试用户代码是否从APPLICATION_ADDRESS被编程 if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){ //跳转至用户程序 JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; //初始化用户程序的堆栈指针 __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); //跳转至应用程序 Jump_To_Application(); }else{ led_trade(); } }
void MX_USB_HOST_Init(void) { /* 初始化主机库,添加支持的类并启动该库*/ USBH_Init(&hUsbHostHS, USBH_UserProcess, HOST_HS); USBH_RegisterClass(&hUsbHostHS, USBH_MSC_CLASS); USBH_Start(&hUsbHostHS); } /*初始化HOST 内核 */ USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t ), uint8_t id) { /* 检查USB主机句柄是否有效 */ if(phost == NULL) { USBH_ErrLog("Invalid Host handle"); return USBH_FAIL; } /* 设置 DRiver ID */ phost->id = id; /* 取消连结类*/ phost->pActiveClass = NULL; phost->ClassNumber = 0; /* 恢复默认状态并准备EP0 */ DeInitStateMachine(phost); /* 分配用户进程 */ if(pUsrFunc != NULL) { phost->pUser = pUsrFunc; } #if (USBH_USE_OS == 1) /* 创建USB主机队列 */ osMessageQDef(USBH_Queue, 10, uint16_t); phost->os_event = osMessageCreate (osMessageQ(USBH_Queue), NULL); /*创建USB HOST任务 */ #if defined (USBH_PROCESS_STACK_SIZE) osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, USBH_PROCESS_STACK_SIZE); #else osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, 8 * configMINIMAL_STACK_SIZE); #endif phost->thread = osThreadCreate (osThread(USBH_Thread), phost); #endif /*初始化底层驱动 */ USBH_LL_Init(phost); return USBH_OK; } /*启动USB Host内核*/ USBH_StatusTypeDef USBH_Start (USBH_HandleTypeDef *phost) { /* 启动底层驱动 */ USBH_LL_Start(phost); /* 在端口上激活VBUS */ USBH_LL_DriverVBUS (phost, TRUE); return USBH_OK; }
void MX_USB_HOST_Process(void) { /* USB主机后台任务 */ USBH_Process(&hUsbHostHS); } /*用户回调定义 */ static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) { int k; int cnt; unsigned int counter; unsigned long int ncounter = 0; unsigned char buffer[1024]; FIL fil; static FRESULT res; unsigned long int *p; switch(id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: Appli_state = APPLICATION_DISCONNECT; break; case HOST_USER_CLASS_ACTIVE: Appli_state = APPLICATION_READY; LED_BLUE_ON; //解锁内存,擦除扇区 HAL_FLASH_Unlock(); for(cnt = FLASH_SECTOR_2;cnt < FLASH_SECTOR_11;cnt ++){ FLASH_Erase_Sector(cnt,OB_BOR_LEVEL3); } LED_BLUE_OFF; LED_RED_ON; //f_mount res = f_mount(&fatfs,"0:",1); //给磁盘分配盘符 if(res != RES_OK){ LED_RED_OFF; led_trade(); } //f_open res = f_open(&fil,"0:/app.bin",FA_READ); //打开app.bin文件 if(res != RES_OK){ LED_RED_OFF; led_trade(); } //f_lseek res = f_lseek(&fil,0); //将指针移动到第一个位置 if(res != RES_OK){ LED_RED_OFF; led_trade(); } //写Flash while(ncounter < fil.fsize) { res = f_read(&fil,buffer,1024,&counter); //读文件 if(res != RES_OK){ LED_RED_OFF; led_trade(); } p = (unsigned long int *)buffer; for(k = 0; k < counter / 4; k++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,APPLICATION_ADDRESS + ncounter,*(p + k)); ncounter += 4; } } HAL_FLASH_Lock(); //ARM更新升级成功,绿色LED灯点亮 LED_BLUE_OFF; LED_RED_OFF; LED_GREEN_ON; break; case HOST_USER_CONNECTION: Appli_state = APPLICATION_START; break; default: break; } }