CH32Vx--配置工程从RAM启动调试笔记

       

本篇文章针对V系列芯片介绍从RAM中启动代码的方法,以及一些常见操作注意事项!

(精 髓 是 最 后 的 代 码)

操作流程:

1)需要配置BOOT为RAM启动(BOOT0接VCC,BOOT1接VCC)
(2)需要修改ld文件,使得编译器编译的代码位置为RAM,如下图,修改了FLASH的起始地址

 

(1)需要修改启动文件,如下图圈出位置。由于上电时内核的PC指针处于0,由于指令中会有利用当前PC取指的操作(auipc),所以需要在启动时就把PC偏移到正确

位置。RAM启动下,内核上电的前8个字节的指令不是通过存储器访问得到,而是从内部的寄存器得到,寄存器的值由硬件从RAM搬运过来。所以只要保证RAM中代码的

前两条能够将PC偏移过去即可,修改启动文件的前两条指令,如下图。

 

(2)此外,程序若要下载到RAM运行,需要进调试模式下载,勾选debug in RAM,且添加配置操作,如下图 -c "wlink_set_address 0x08000000"

 

 

 

  一般情况下,我们在 MRS中编写工程应用后,调试时都是把程序下载到芯片的内部 FLASH 运行测试的,代码的内容被写入到内部 FLASH 中存储。但在某些应用场合下
不希望或不能修改内部 FLASH 的内容,这时就可以使用 RAM 调试功能了,它的本质是把原来存储在内部 FLASH 的代码 (CODE RW-data 的内容) 改为存储到 SRAM

芯片复位后从 SRAM 中加载代码并运行

    把代码下载到 RAM 中调试有如下优点:

1,下载程序快

RAM 存储器的写入速度比在内部 FLASH 中要快得多,且没有了擦除的过程,因此

RAM 上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能

约很多时间,省去了烦人的擦除与写入 FLASH 过程。

2,延长flash寿命

flash是有寿命的,大约可以擦除一万次,虽然一般用不到这么多次,但也是应该

考虑到的一个因素。

 3,对于内部 FLASH 被锁定的芯片,可以把解锁程序下载到 RAM 上,进行解锁。


可能很多人尝试不成功,这里附上代码,具体操作看注释(参考上面操作下进去即可,有读保护不影响RAM的下载):

 (此时可能有客户会有疑问,我把代码下到RAM里,通过RAM来读取有读保护芯片的flash空间来破解芯片可不可以?,这个替大家试过了,不行的!什么都读不出来)

        FLASH_Unlock();//软件解除读保护涉及到用户选择字的操作,也需要像操作flash那样进行开锁关锁。
        printf("GetRead:%x\r\n", *(u16 *)0x1FFFF800);//打印读保护相应控制位,查看读保护情况。
        FLASH_ReadOutProtection(DISABLE);//解除读保护,库函数里直接调用即可
        Delay_Ms(10);
        printf("GetRead:%x\r\n", *(u16 *)0x1FFFF800);
        FLASH_Lock();//操作完后关锁
        if (*(u16 *)0x20008000!=0x1234) {//判断此RAM地址中数据是否已写入
            *(u16 *)0x20008000=0x1234;//如果没有此数据,则写入。以此来让芯片只复位一次,注意不能采用变量等来充当标志位,当执行到下面的复位时会清掉。
               NVIC_SystemReset();//必须复位,对于读保护的操作需要复位后生效!
            }
        FLASH_Unlock();
        FLASH_ProgramWord(0x08000400,0x12345678);//写入一位尝试能不能写入成功
        FLASH_Lock();                
        printf("GetRead:%x\r\n", *(u16 *)0x1FFFF800);
        printf("GetRead:%x\r\n", *(u32 *)0x08000400);
     /********************************************/

可能很多人不理解,为什么flash读保护会影响flash写入呢,这个其实是因为:

客户问题实例:

客户做了一段远程IAP+APP的代码,且板子都到了客户手上,但IAP有Bug,这就有了反向升级IAP的过程,客户做法是通过远程IAP接受升级代码并将代码放

至RAM中,并跳转至RAM,后反向来升级IAP,但升级过程中发现前面4K怎么也更新不了,最后发现是因为使能了代码读保护,导致前4K默认写保

护。于是就必须解除读保护才可以,且还需要再复位一次才能成功。

 

 

posted @ 2023-08-01 20:54  WCH_CH32  阅读(187)  评论(0编辑  收藏  举报