⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootldr.c

📁 ATMEGA128自己用的BOOT程序
💻 C
📖 第 1 页 / 共 2 页
字号:
											write_flag_pgm();
										}
								   }
								   else
								   {//ACK
									    //cmd_buf[0]=0xcb;
										cmd_buf[1]=0x80;
										cmd_buf[2]=pack_save>>8;
										cmd_buf[3]=pack_save;
										put_data_to_arm(cmd_buf,4);
								   }
								}
								else//出错
								{
									//cmd_buf[0]=0xcb;
								    cmd_buf[1]=0x8f;
								    cmd_buf[2]=pack_save>>8;
									cmd_buf[3]=pack_save;
									put_data_to_arm(cmd_buf,4);
								}
								break;
							case 0xcc://EOT
								if(pgm_ptr!=0)
								{
									if( xiazai_mode==0xf0)
									{
										xiazai_mode=0x55;
									}
									goto pgm_loop1;
								}
								else
								{
									//cmd_buf[0]=0xcb;
								    cmd_buf[1]=0x80;
								    cmd_buf[2]=pack_save>>8;
									cmd_buf[3]=pack_save;	
									put_data_to_arm(cmd_buf,4);	
									
									if(xiazai_mode==0xf0)//下载程序,标志
									{
										pgm_buf[0]=0x55; 
										pgm_buf[1]=0xaa; 
										pgm_buf[2]=0x11; 
										pgm_buf[3]=0x22;
										pgm_buf[4]=0x33;
										pgm_buf[5]=0x44;
										pgm_buf[6]=0x55;
										write_flag_pgm();
									}
								}
								break;
							case 0xcd:
								cmd_buf[1]=read_flag_pgm();	
								
								cmd_buf[0]=0xcd;
								if(cmd_buf[1]==1)
								{
									cmd_buf[1]=0x8f;
								}
								else 
								{
									cmd_buf[1]=0x80;
								}
								put_data_to_arm(cmd_buf,2);	
								if(cmd_buf[1]==0x80)
								{
									quit();//运行程序
								}	
								break;
							case 0xce:								boot_flag=1;
								cmd_buf[0]=0xce;
								cmd_buf[1]='b';
								cmd_buf[2]='o';
								cmd_buf[3]='o';
								cmd_buf[4]='t';
								put_data_to_arm(cmd_buf,5);
								break;
							case 0xcf:
								boot_flag=1;
								switch(cmd_buf[1])
								{
									case 0://小针步
										FlashAddr = 0x11b00;										
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x11f00;										
										xiazai_mode=0;
										break;
									case 1://f1
										FlashAddr = 0x11f00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x13f00;
										xiazai_mode=1;
										break;
									case 2://f2
										FlashAddr = 0x13f00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x15f00;
										xiazai_mode=2;
										break;
									case 3://f3
										FlashAddr = 0x15f00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x17f00;
										xiazai_mode=3;
										break;
									case 4://f4
										FlashAddr = 0x17f00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x19f00;
										xiazai_mode=4;
										break;
									case 5://f5
										FlashAddr = 0x19f00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x1bf00;
										xiazai_mode=5;
										break;
									case 6://f6
										FlashAddr = 0x1bf00;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x1df00;
										xiazai_mode=6;
										break;
									case 0xff://程序
										pgm_buf[0]=0;//x55; 
										pgm_buf[1]=0;//xaa; 
										pgm_buf[2]=0;//x11; 
										pgm_buf[3]=0;//x22;
										pgm_buf[4]=0;//x33;
										pgm_buf[5]=0;//x44;
										pgm_buf[6]=0;//x55;
										write_flag_pgm();
										
										FlashAddr = 0;
										pgm_addr_start=FlashAddr;
										pgm_addr_end=0x11b00;
										xiazai_mode=0xf0;
										break;
								}
								
								pack_save=0;
								pgm_ptr=0;
								
								//cmd_buf[0]=0xcf;
								cmd_buf[1]=0x80;
								put_data_to_arm(cmd_buf,2);
								break;
							default:
								cmd_buf[0]=cmd_buf[0];
								cmd_buf[1]=0x8f;
								put_data_to_arm(cmd_buf,2);
								break;
						}						
					}
					else
					{
						cmd_buf[0]=0xfd;
 	  	  	 	        cmd_buf[1]=0x8f;
 	  	  	 	        put_data_to_arm(cmd_buf,2);	
					}
				}
				else
				{
					cmd_buf_check^=data_tmp;
				}				
			}
			else if(boot_first==0)
			{
				xhj_arm_boot:;
				if(data_tmp==0x7e)boot_first=1;				
			}
			else if(boot_first==1)
			{
				if(data_tmp==0x81)boot_first=0x2;
				else boot_first=0x0;
			}
			else if(boot_first==2)
			{
				cmd_long=data_tmp;
				boot_first=3;
			}
			else if(boot_first==3)
			{
				if(cmd_long==data_tmp)boot_first=4;
				else boot_first=0;
				
				cmd_buf_i=0;
				cmd_buf_check=0;
			} 
			//
		}
	}
//--------------------------------------------------------------------------------------
xmoden_down_loop:;//XMODEN 下载程序	
uart0_init1();//无校验
while(1)
{
	putstr("\r\n消息:>请选择下载的地址 0-6 等于 F0-F6 ,7=下载程序,8=运行程序...");
	while(1)
	{		
		if(++led_cnt>=20000)
		{	led_cnt=0;						
			if(++boot_start_cnt>=10)
			{    boot_start_cnt=0;
			     RUN_lED_CPL;
			}
		}
		
		if(wait_char())
		{   
			xiazai_mode=0xff;
			data_tmp=get_char();
			switch(data_tmp)
			{
				case '0'://小针步
					FlashAddr = 0x11b00;										
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x11f00;					
					xiazai_mode=0;
					putstr("\r\n消息:>下载F0... ");
					break;
				case '1'://f1
					FlashAddr = 0x11f00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x13f00;
					xiazai_mode=1;
					putstr("\r\n消息:>下载F1... ");
					break;
				case '2'://f2
					FlashAddr = 0x13f00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x15f00;
					xiazai_mode=2;
					putstr("\r\n消息:>下载F2... ");
					break;
				case '3'://f3
					FlashAddr = 0x15f00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x17f00;
					xiazai_mode=3;
					putstr("\r\n消息:>下载F3... ");
					break;
				case '4'://f4
					FlashAddr = 0x17f00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x19f00;
					xiazai_mode=4;
					putstr("\r\n消息:>下载F4... ");
					break;
				case '5'://f5
					FlashAddr = 0x19f00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x1bf00;
					xiazai_mode=5;
					putstr("\r\n消息:>下载F5... ");
					break;
				case '6'://f6
					FlashAddr = 0x1bf00;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x1df00;
					xiazai_mode=6;
					putstr("\r\n消息:>下载F6... ");
					break;
				case '7'://程序
					pgm_buf[0]=0;//x55; 
					pgm_buf[1]=0;//xaa; 
					pgm_buf[2]=0;//x11; 
					pgm_buf[3]=0;//x22;
					pgm_buf[4]=0;//x33;
					pgm_buf[5]=0;//x44;
					pgm_buf[6]=0;//x55;
					write_flag_pgm();//
					
					FlashAddr = 0;
					pgm_addr_start=FlashAddr;
					pgm_addr_end=0x11b00;
					xiazai_mode=0xf0;
					putstr("\r\n消息:>下载 程序... ");
					break;
				case '8'://程序
					putstr("\r\n消息:>运行 程序... \r\n");
					quit();
					break;
				default:
					putstr("\r\n消息:>请选择下载的地址 0-6 等于 F1-F6 ,d 等于下载程序... ");
			}		
			
			if(xiazai_mode!=0xff){break;}							
		}	
	}
	//下载
	while(1)
	{		
		if(++led_cnt>=20000)
		{	led_cnt=0;						
			if(++boot_start_cnt>=10)
			{    boot_start_cnt=0;
				 WriteCom('C');
			     RUN_lED_CPL;
			}
		}
		
		if(wait_char())
		{   
			data_tmp=get_char();
			if( data_tmp== XMODEM_SOH )break;						
		}		
	}	
	
	//开始接受数据
	ch=0,cl=0,pack_no=0;
	pgm_ptr=0;
	while(1)
	{
		pack_no++;
		ch= get_char();
		cl=~get_char();
		
		if ((pack_no == ch) && (pack_no == cl))
		{			
			for(cnt = 0;cnt<128;cnt++)
			{
				pgm_buf[pgm_ptr++]=get_char();
			}
			
	        ch=get_char();
			cl=get_char();
			
			RUN_lED_CPL;
			
			if(pgm_ptr>128)
			{
				pgm_ptr=0;
				error_tmp=write_one_page_addr(FlashAddr,pgm_buf);
				FlashAddr+=256;
			}
			if(error_tmp==0)WriteCom(XMODEM_ACK);
			else WriteCom(XMODEM_CAN);
		}
		else
		{			
			WriteCom(XMODEM_NAK);			
		}
		
		while(1)
		{
			data_tmp=get_char();
			if( data_tmp==XMODEM_EOT ){break;}
		    if( data_tmp==XMODEM_SOH ){break;}
		}

		if( data_tmp==XMODEM_SOH ){continue;}
		if( data_tmp==XMODEM_EOT ){break;}
	}
	WriteCom(XMODEM_ACK);	
	
	if(xiazai_mode==0xf0)//标记已经下载程序
	{
		pgm_buf[0]=0x55;//&& 
		pgm_buf[1]=0xaa;//&& 
		pgm_buf[2]=0x11;//&& 
		pgm_buf[3]=0x22;//&& 
		pgm_buf[4]=0x33;//&& 
		pgm_buf[5]=0x44;//&& 
		pgm_buf[6]=0x55;//

		write_flag_pgm();
	}
}
return 0;}

//End of file: bootldr.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -