STM32——IAP

        解決要如何從IAP的APP程序中返回BootLoader重新更新固件:

  1. 在APP執行的循環中加入一個外部中斷,當觸發中斷使觸發系統軟件復位
while(1)
{					
	key=KEY_Scan(0);
	if(key==KEY1_PRES)
	{
		//軟件復位
		NVIC_SystemReset();
	}
	//APP功能程序
	//user  conde
}
  1. 以正點原子戰艦IAP例程爲例,當串口接受完成數據,autoflag=1,更新.bin文件到FLASH,然後startflashflag=1,執行APP程序,在執行APP的功能程序中,當檢測到KEY1按下,系統復位,從新加載BootLoader,這時要麼重新從串口接收一個APP程序,要麼再次按下KEY1運行APP程序。
int main(void)
{		
	u8 t;
	u8 key;
	u16 oldcount=0;				//老的串口接收數據值
	u16 applenth=0;				//接收到的app代碼長度
	u8 clearflag=0;  
	u8 autoflag=0;				//用於自動更新固件
	u8 startflashflag=0;	//用於自動執行APP
	
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶佔優先級,2位響應優先級
	uart_init(115200);	//串口初始化爲115200
	delay_init();	   	 	//延時初始化 
 	LED_Init();		  			//初始化與LED連接的硬件接口
	KEY_Init();					//初始化按鍵
	LCD_Init();			   		//初始化LCD  
	POINT_COLOR=RED;//設置字體爲紅色 
	LCD_ShowString(30,50,200,16,16,"Warship STM32");	
	LCD_ShowString(30,70,200,16,16,"IAP TEST");	  
	LCD_ShowString(30,150,200,16,16,"KEY2:Erase SRAM APP");
	LCD_ShowString(30,170,200,16,16,"KEY1:Run FLASH APP");
	POINT_COLOR=BLUE;
	//顯示提示信息
	POINT_COLOR=BLUE;//設置字體爲藍色	  
	while(1)
	{
	 	if(USART_RX_CNT)
		{
			if(oldcount==USART_RX_CNT)//新週期內,沒有收到任何數據,認爲本次數據接收完成.
			{
				applenth=USART_RX_CNT;
				oldcount=0;
				USART_RX_CNT=0;
				printf("用戶程序接收完成!\r\n");
				printf("代碼長度:%dBytes\r\n",applenth);
				autoflag=1;
			}else oldcount=USART_RX_CNT;			
		}
		t++;
		delay_ms(10);
		if(t==30)
		{
			LED0=!LED0;
			t=0;
			if(clearflag)
			{
				clearflag--;
				if(clearflag==0)LCD_Fill(30,210,240,210+16,WHITE);//清除顯示
			}
		}	  	 
		key=KEY_Scan(0);
		if(autoflag)
		{
			if(applenth)
			{
				printf("開始更新固件...\r\n");	
				LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");
 				if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判斷是否爲0X08XXXXXX.
				{	 
					iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代碼   
					LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");
					printf("固件更新完成!\r\n");
					startflashflag=1;
				}else 
				{
					LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!  ");	   
					printf("非FLASH應用程序!\r\n");
					startflashflag=0;
				}
 			}else 
			{
				printf("沒有可以更新的固件!\r\n");
				LCD_ShowString(30,210,200,16,16,"No APP!");
				startflashflag=0;
			}
			autoflag=0;
			clearflag=7;//標誌更新了顯示,並且設置7*300ms後清除顯示									 
		}
		if(key==KEY2_PRES)
		{
			if(applenth)
			{																	 
				printf("固件清除完成!\r\n");    
				LCD_ShowString(30,210,200,16,16,"APP Erase Successed!");
				applenth=0;
			}else 
			{
				printf("沒有可以清除的固件!\r\n");
				LCD_ShowString(30,210,200,16,16,"No APP!");
			}
			clearflag=7;//標誌更新了顯示,並且設置7*300ms後清除顯示									 
		}
		if(startflashflag||key==KEY1_PRES)
		{
			printf("開始執行FLASH用戶代碼!!\r\n");
			if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否爲0X08XXXXXX.
			{	 
				iap_load_app(FLASH_APP1_ADDR);//執行FLASH APP代碼
			}else 
			{
				printf("非FLASH應用程序,無法執行!\r\n");
				LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!");	   
			}									 
			clearflag=7;//標誌更新了顯示,並且設置7*300ms後清除顯示	  
		}
	}   	   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章