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程序,没太多必要花费时间重新造轮子

相关推荐
AI数据皮皮侠2 小时前
中国博物馆数据
大数据·人工智能·python·深度学习·机器学习
张晓~183399481212 小时前
碰一碰发视频 系统源码 /PHP 语言开发方案
开发语言·线性代数·矩阵·aigc·php·音视频·文心一言
代码不停3 小时前
Java前缀和算法题目练习
java·开发语言·算法
豆沙沙包?3 小时前
2025年--Lc200- 414. 第三大的数(大根堆)--Java版
java·开发语言
一念&3 小时前
每日一个C语言知识:C 指针
c语言·开发语言
涤生z3 小时前
list.
开发语言·数据结构·c++·学习·算法·list
xxxxxxllllllshi3 小时前
Java中Elasticsearch完全指南:从零基础到实战应用
java·开发语言·elasticsearch·面试·职场和发展·jenkins
wu_jing_sheng03 小时前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
程序员大雄学编程3 小时前
「用Python来学微积分」2. 函数图像的变换
python·数学·微积分
励志不掉头发的内向程序员3 小时前
【Linux系列】掌控 Linux 的脉搏:深入理解进程控制
linux·运维·服务器·开发语言·学习