📄 bootldr.c
字号:
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 + -