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;
}
}