分享自己写的USART IAP之Bootloader更新程序的三种方式

Engineer:邓工
注:代码中已包含注释
第一种方式:

#if( UPDATE_FIRMWARE_WAY_SELECT == TIMEKEEPING )
		/*new APP program receive finish,start update firmware*/
		if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH)
		{
			if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
			{
				printf("开始更新固件...\r\n");
				printf("value = %x\r\n",*(vu32*)(0X20000800+4));
 				if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
				{	 
					iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码   
					printf("固件更新完成!\r\n");
					G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
				}
				else 
				{
					printf("非FLASH应用程序!\r\n");
				}
 			}
			else 
			{
				printf("没有可以更新的固件!\r\n");
			}
		}
		
		/*ten seconds countdown.
			if usart not receive app program after ten seconds,not update firmware,start to run old APP program*/
		G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt++;
		delay_ms(10);
		if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt%100 == 0)
		{
			printf("倒计时 %d s......\r\n",11-G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt/100);
		}
		
		if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt >= 1000)
		{
			G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt = 1000;
		}
		
		if(G_UPDATE_FIRMWARE_InitStructure.u16_time_cnt == 1000 && G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)
		{
			G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = NO_FIRMWARE_UPDATE;
			printf("没有可以更新的固件!\r\n");
		}
			
		if((G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH)||(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == NO_FIRMWARE_UPDATE))
		{
			printf("开始执行FLASH用户代码!!\r\n");
			if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
			{	 
//				__disable_irq();
				iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
				//g_u8_update_firmware_flag = 0;
			}
			else 
			{
				printf("非FLASH应用程序,无法执行!\r\n");
			}	
		}

第二种方式:

#elif( UPDATE_FIRMWARE_WAY_SELECT == KEY_SCAN)
			GetKeyVal();
			/*keys are not pressed*/
			if((G_KEY_InitStructure.u8_key1_val == 0)&&(G_KEY_InitStructure.u8_key2_val == 0))
			{
				//printf("没有按键按下,等待固件更新......,等待用户程序开始执行......\r\n");
				printf("等待用户按键按下......\r\n按下KEY1:更新固件。按下KEY2:开始执行用户程序\r\n");
				//delay_ms(500);
				printf("\r\n");
			}
			
			/*press key1*/
			if(G_KEY_InitStructure.u8_key1_val == 1)
			{
				G_KEY_InitStructure.u8_key1_val = 0;
				/*new app program had received, update firmware*/
				if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH)
				{
					if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
					{
						printf("开始更新固件...\r\n");
						printf("value = %x\r\n",*(vu32*)(0X20000800+4));
						if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
						{	 
							iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码   
							printf("固件更新完成!\r\n");
							G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
						}
						else 
						{
							printf("非FLASH应用程序!\r\n");
						}
					}
					else 
					{
						printf("没有可以更新的固件!\r\n");
					}
				}
				/*new app program had not received, not update firmware*/
				else if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)
				{
					printf("没有可以更新的固件!\r\n");
				}
			}
			
			/*press key2*/
			if(G_KEY_InitStructure.u8_key2_val == 1)
			{
				G_KEY_InitStructure.u8_key2_val = 0;	
				//if((G_UPDATE_firmware_InitStructure.u8_update_flag == firmware_UPDATE_FINISH)||(G_UPDATE_firmware_InitStructure.u8_update_flag == 0))
				/*firmware updates finishion, start to run new app program*/
				if(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH)
				{
					printf("开始执行FLASH用户代码!!\r\n");
					if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
					{	 
//						__disable_irq();
						iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
						//g_u8_update_firmware_flag = 0;
					}
					else 
					{
						printf("非FLASH应用程序,无法执行!\r\n");
					}	
				}
				/*if usart is not receiving new app program or usart has received new app program,
					but is not updating firmware, start to run old app program*/
				else if((G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0)||(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
				{
					printf("没有可以更新的固件!\r\n");
					printf("开始执行FLASH用户代码!!\r\n");
					if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
					{	 
//						__disable_irq();
						iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
						//g_u8_update_firmware_flag = 0;
					}
					else 
					{
						printf("非FLASH应用程序,无法执行!\r\n");
					}	
				}
			}

第三种方式:

#elif( UPDATE_FIRMWARE_WAY_SELECT == USART_CMD )
			/*usart has received new app program, and then it has received a char of 'u',start to update firmware*/
			if((USART_RX_CMD == 'u')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
			{
				USART_RX_CMD = 0;
				if(G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth)
					{
						printf("开始更新固件...\r\n");
						printf("value = %x\r\n",*(vu32*)(0X20000800+4));
						if(((*(vu32*)(0X20000800+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
						{	 
							iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,G_UPDATE_FIRMWARE_InitStructure.u16_rx_app_lenth);//更新FLASH代码   
							printf("固件更新完成!\r\n");
							G_UPDATE_FIRMWARE_InitStructure.u8_update_flag = FIRMWARE_UPDATE_FINISH;
						}
						else 
						{
							printf("非FLASH应用程序!\r\n");
						}
					}
					else 
					{
						printf("没有可以更新的固件!\r\n");
					}
			}
			
			/*if firmware has updated, and then usart has received a char of 'a', start to run new app program*/
			if((USART_RX_CMD == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == FIRMWARE_UPDATE_FINISH))
			{
				USART_RX_CMD = 0;
				printf("开始执行FLASH用户代码!!\r\n");
				if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
				{	 
//					__disable_irq();
					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
					//g_u8_update_firmware_flag = 0;
				}
				else 
				{
					printf("非FLASH应用程序,无法执行!\r\n");
				}	
			}
			
			/*usart not receive new app program,but it has received a char of 'a', start to run old app program*/
			if((USART_RX_BUF[0] == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
			{
				USART_RX_BUF[0] = 0;
				printf("没有可以更新的固件!\r\n");
				printf("开始执行FLASH用户代码!!\r\n");
				if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
				{	 
//					__disable_irq();
					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
					//g_u8_update_firmware_flag = 0;
				}
				else 
				{
					printf("非FLASH应用程序,无法执行!\r\n");
				}	
			}
			/*usart has received new app program, but not update firmware, and then it has received a char of 'a',start to old app program*/
			else if((USART_RX_CMD == 'a')&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == APP_RX_FINISH))
			{
				USART_RX_CMD = 0;
				printf("没有可以更新的固件!\r\n");
				printf("开始执行FLASH用户代码!!\r\n");
				if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
				{	 
//					__disable_irq();
					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
					//g_u8_update_firmware_flag = 0;
				}
				else 
				{
					printf("非FLASH应用程序,无法执行!\r\n");
				}	
			}
			/*usart not receive a char of 'a',but it is receiving new app program*/
			else if((USART_RX_BUF[0] != 'a' && USART_RX_CNT != 0)&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
			{
				printf("正在接收APP程序,请勿在此期间发送其他字符,等待APP程序接收完成......\r\n");
			}
			/*usart not receive a char of 'a', and it also is not receiving new app program, waiting user send usart cmd*/
			else if((USART_RX_BUF[0] != 'a' && USART_RX_CNT == 0)&&(G_UPDATE_FIRMWARE_InitStructure.u8_update_flag == 0))
			{
				printf("等待用户发送字符......\r\n发送字符'u':更新固件。发送字符'a':开始执行用户程序\r\n");
				delay_ms(500);
				printf("\r\n");
			}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值