main.c 2.25 KB
/**************************************************************************
* STM32F407ZET6芯片有512K的FLASH,有192K的RAM(128K SRAM和64K CCM)
* 
* Bootloader功能介绍:
*	在芯片上电之后,首先运行的是Bootloader,Bootloader引导程序根据Flash上Flag段
*	的数据选择将哪一部分的固件加载到运行区间。
*
* BootLoader预留空间为16K
****************************************************************************/
#include "delay.h"  
#include "string.h" 
#include "usart1.h"    
#include "uart5.h" 
#include "iap.h"   
#include "flash.h"	


int main(void)
{ 
	uint32_t	handle; 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	
	delay_init();
	uart1_init();
	uart5_init();
	
	Detection_Update();				//本地升级
	
	handle = STMFLASH_ReadWord(FLAG_BASE_ADDR);
	
	//检测是否OTA
	//检测是否本地
	//执行
	switch(handle)				//选择加载那一部分的固件
	{
		case BOOTLOADER_RUN:		//运行段
			printf("\r\n**********Runing Firmware **********\r\n");
		
			delay_ms(20);
			Run_Flash_App(APP_RUN_ADDR);
			break;
		
		case BOOTLOADER_LOAD:		//升级段
			printf("\r\n**********Loading Firmware **********\r\n");
	
		#if 0 
			handle = APP_RUN_ADDR;
			STMFLASH_Write(APP_BACK_ADDR,(uint32_t *)handle,128*1024);
			delay_ms(10);
		#endif
		
			handle = APP_LOAD_ADDR;
			STMFLASH_Write(APP_RUN_ADDR,(uint32_t *)handle,192*1024);
			delay_ms(10);
		
			handle = BOOTLOADER_RUN;
			STMFLASH_Write(FLAG_BASE_ADDR,(uint32_t *)&handle,4);
			
			Run_Flash_App(APP_RUN_ADDR);
			break;
	
	#if 0 
		case BOOTLOADER_BACK:		//回滚段
			printf("\r\n**********Backup Firmware **********\r\n");
		
			handle = APP_BACK_ADDR;  
			STMFLASH_Write(APP_RUN_ADDR,(uint32_t *)handle,128*1024);
			delay_ms(10);
		
			handle = BOOTLOADER_RUN;
			STMFLASH_Write(FLAG_BASE_ADDR,(uint32_t *)&handle,4);
			delay_ms(10);
		
			Run_Flash_App(APP_RUN_ADDR);
			break;
	#endif
		
		case BOOTLOADER_DEFAULT:			//利于出厂(默认加载这一段)
			printf("\r\n**********Default Firmware **********\r\n");
		
			handle = BOOTLOADER_RUN;
			STMFLASH_Write(FLAG_BASE_ADDR,(uint32_t *)&handle,4);
			
			Run_Flash_App(APP_RUN_ADDR);
			break;
		
		default :
			printf("\r\n**********Don^t Having Firmware **********\r\n");
			break;
	}
	
	while(1)		//预留通过网口升级的接口(CH395Q)
	{
		printf("\r\n********IDLE********\r\n");
		delay_ms(5000);
	}
}