CH552的bootload程序IAP直接对ROM-flash修改数据(未尝试)

手动写bootload程序的可能

1,根据ch552g的使用手册内容查看到

2,在下面的参考文件的IAP文件夹中看到IAP文件

参考

下面程序中并没有跳转到厂家bootload的过程,这是直接通过控制有关的寄存器对FLSH进行直接写入和修改,这样可以认为就是一个bootload程序了

c 复制代码
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控制器的详细描述

除了下面的内容没有更多内容

2,对于下载来说有USB和串口的内容,涉及文件太多

3,厂家已经给了bootload程序,没太多必要花费时间重新造轮子

相关推荐
im_AMBER32 分钟前
学习日志19 python
python·学习
励志要当大牛的小白菜2 小时前
ART配对软件使用
开发语言·c++·qt·算法
mortimer3 小时前
安装NVIDIA Parakeet时,我遇到的两个Pip“小插曲”
python·github
@昵称不存在4 小时前
Flask input 和datalist结合
后端·python·flask
爱装代码的小瓶子4 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
赵英英俊4 小时前
Python day25
python
东林牧之4 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django
何双新5 小时前
基于Tornado的WebSocket实时聊天系统:从零到一构建与解析
python·websocket·tornado
Maybe_ch5 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨5 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发