手动写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控制器的详细描述
除了下面的内容没有更多内容