手动写bootload程序的可能
1,根据ch552g的使用手册内容查看到
2,在下面的参考文件的IAP文件夹中看到IAP文件
参考
下面程序中并没有跳转到厂家bootload的过程,这是直接通过控制有关的寄存器对FLSH进行直接写入和修改,这样可以认为就是一个bootload程序了
void CH55X_IAPDownload( void )
{
UINT8 s;
UINT16 i;
UINT16 len,Data;
UINT32 addr;
switch( iap_cmd.other.buf[0] ) // 分析命令码
{
case CMD_IAP_PROM: // ISP 编程命令
Flash_Op_Check_Byte1 = DEF_FLASH_OP_CHECK1;
Flash_Op_Check_Byte2 = DEF_FLASH_OP_CHECK2;
len = iap_cmd.program.len>>1; //必须为2的整数倍,按照半字进行操作
addr = (iap_cmd.program.addr[0] | (UINT16)iap_cmd.program.addr[1]<<8);
if( Flash_Op_Unlock( bCODE_WE | bDATA_WE ) )
{
CH55X_Respond( 0xFF );
break;
}
for( i=0; i!=len; i++ )
{
Data = (iap_cmd.program.buf[2*i] | (UINT16)iap_cmd.program.buf[2*i+1]<<8);
s = ProgWord( addr,Data );
addr+=2;
if( s != 0x00 )
{
break;
}
}
Flash_Op_Check_Byte1 = 0x00;
Flash_Op_Check_Byte2 = 0x00;
Flash_Op_Lock( bCODE_WE | bDATA_WE );
CH55X_Respond( s ); //返回校验
break;
case CMD_IAP_ERASE: // ISP 擦除命令
Flash_Op_Check_Byte1 = DEF_FLASH_OP_CHECK1;
Flash_Op_Check_Byte2 = DEF_FLASH_OP_CHECK2;
if( Flash_Op_Unlock( bCODE_WE | bDATA_WE ) )
{
CH55X_Respond( 0xFF );
break;
}
addr = (iap_cmd.erase.addr[0] | (UINT16)iap_cmd.erase.addr[1]<<8);
for( i=0; addr < IAP_CODE_ADDR; i++ )
{
s = EraseBlock( addr );
addr+=1024;
if( s != 0 )
{
break;
}
}
Flash_Op_Check_Byte1 = 0x00;
Flash_Op_Check_Byte2 = 0x00;
Flash_Op_Lock( bCODE_WE | bDATA_WE );
CH55X_Respond( s );
break;
case CMD_IAP_VERIFY: // ISP 校验命令
addr = (iap_cmd.verify.addr[0] | (UINT16)iap_cmd.verify.addr[1]<<8);
len = iap_cmd.verify.len>>1; // 必须为2的整数倍,按照字进行操作
s = FlashVerify( addr,&(iap_cmd.verify.buf[0]),iap_cmd.verify.len );
CH55X_Respond( s );
break;
case CMD_IAP_END: // ISP 结束命令
SAFE_MOD = 0x55;
SAFE_MOD = 0xAA;
GLOBAL_CFG |= bSW_RESET; // 复位单片机,进入用户程序
break;
default:
CH55X_Respond( 0xfe ); // 未知的命令
break;
}
}
没有尝试编写bootload的原因
1.CH552g的手册中没有对ROM_CTRL控制器的详细描述
除了下面的内容没有更多内容