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

相关推荐
合作小小程序员小小店27 分钟前
SDN安全开发环境中常见的框架,工具,第三方库,mininet常见指令介绍
python·安全·生成对抗网络·网络安全·网络攻击模型
Dontla29 分钟前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化
后台开发者Ethan30 分钟前
Python需要了解的一些知识
开发语言·人工智能·python
北京_宏哥39 分钟前
Python零基础从入门到精通详细教程11 - python数据类型之数字(Number)-浮点型(float)详解
前端·python·面试
奶黄小甜包40 分钟前
C语言零基础第18讲:自定义类型—结构体
c语言·数据结构·笔记·学习
一支闲人1 小时前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白
盼小辉丶1 小时前
PyTorch生成式人工智能——使用MusicGen生成音乐
pytorch·python·深度学习·生成模型
常利兵1 小时前
Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决
android·开发语言·kotlin
幼稚园的山代王1 小时前
Kotlin-基础语法练习一
android·开发语言·kotlin
重生成为编程大王2 小时前
Java ConcurrentHashMap 深度解析
java·开发语言