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

相关推荐
wengqidaifeng18 分钟前
C++从菜鸟到强手:1.基础入门
开发语言·c++
我喜欢山,也喜欢海20 分钟前
Java和go在并发上的表现为什么不一样
java·python·golang
hhb_61820 分钟前
PHP 8.x 核心特性与工程化开发实践指南
开发语言·php
geovindu1 小时前
go: Flyweight Pattern
开发语言·设计模式·golang·享元模式
Wenzar_1 小时前
**零信任架构下的微服务权限控制:用Go实现基于JWT的动态访问策略**在现代云原生环境中,
java·python·微服务·云原生·架构
不是起点的终点1 小时前
【实战】Python 一键生成数据库说明文档(对接阿里云百炼 AI,输出 Word 格式)
数据库·python·阿里云
xyq20242 小时前
TypeScript中的String类型详解
开发语言
2301_813599553 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
--fancy7 小时前
股票预测情感分析研究案例分析
python
shughui7 小时前
PyCharm 完整教程(旧版本卸载+旧/新版本下载安装+基础使用,2026最新版附安装包)
ide·python·pycharm