目录

头文件路径添加

目标文件类型输出设置

调试代码擦除问题

数学库包含

 软件开发技巧总结:


进入编译设置

头文件路径添加

目标文件类型输出设置

调试代码擦除问题

RSIC-V IDE MRS使用笔记(五):调试前代码擦除问题
【代码页擦】在调试IAP+APP的程序时,一般IAP的程序固定后就不需要再去调试了,只需要关注APP程序本身就可以了,但是直接调试APP的时候会默认使用全擦指令,导致IAP程序被擦除。这个时候我们只需要在APP程序调试配置页面添加如下图所示命令行参数,就可以在IAP程序已经下载进去的情况下,每次只修改APP部分的代码。OTA升级也可以使用类似的方式,即把非APP的程序合成一个bin文件下载进去,其他操作与IAP+APP下载方式一致。

-c page_erase 


【调试前不重新下载代码】有时候我们在查找问题时发现只有重新上电才能复现,但是每次重新上电去复现问题时,代码没有改变,调试还是会去下载程序浪费时间,这个时候可以打开调试配置页面,勾选调试不擦除不下载选项,来解决此类问题。

将警告信息全部进行显示

勾选ENABLE all common warnings

const修饰的只读数据放在指定flash区域中

参考:Mounriver分配FLASH空间(CH573) - SweetTea_lllpc - 博客园

在KEIL中修改地址比较方便,在KEIL的Target中直接分配;  在MRS中无法这样修改,MRS中定义数组之后是由程序主动分配地址的,而无法达到自行分配的效果,因此需要通过修改LD文件进行分配FLASH地址。修改的办法是开辟一段空间,然后将数组放进去。例如:现在定义一个数组的大小为8K,那么我可以将原来的FLASH分区为FLASH1(440K)和FLASH2(8K),把数组放在FLASH2中。注意:如果FLASH2定义为8K,数组定义为9K,那么将该定义放入FLASH2中程序会报错

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 400K
    FLASH2 (rx) : ORIGIN = 400K, LENGTH = 20K
    FLASH3 (rx) : ORIGIN = 420K, LENGTH = 28K
    RAM (xrw) : ORIGIN = 0x20003800, LENGTH = 18K
}
    .consumer_flash2 :
    {
        . = ALIGN(4); 
    }AT>FLASH2
    
    .consumer_flash3 :
    {
        . = ALIGN(4); 
    }AT>FLASH3

FLASH修改完成,已成功分配3块空间,接下来验证并对每个空间使用。

2、分别使用FLASH2和FLASH3:

const uint8_t __attribute__((section(".consumer_flash2"))) user_data1[20] = {4,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0x0};
const uint8_t __attribute__((section(".consumer_flash3"))) user_data2[20] = {5,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0x0};

加上打印(记得换行)

注:进行后编译会显示对应FLASH空间已经使用到,否则出现FLASH已经成功分配,但是没有占用空间,这里笔者的使用是加上打印。

    PRINT("%x\r\n", user_data1);
    PRINT("%d\r\n", user_data1[0]);
 
    PRINT("%x\r\n", user_data2);
    PRINT("%d\r\n", user_data2[0]);

常量定义在指定FLASH区域:

在ld文件的SECTIONS段添加如下:

    .flash_test_address :
	{
		. = ALIGN(4);              /*4字节对齐*/
		. = ORIGIN(FLASH)+0x14000;  /*ORIGIN(FLASH)为 MEMORY定义的FLASH的起始地址,指定到从FLASH起始的0x14000长度的位置*/
		KEEP(*(SORT_NONE(.test_address_1)))  /*链接时*KEEP()可以使得被标记段的内容不被清除*/
		. = ALIGN(4);
	} >FLASH AT>FLASH

定义:

__attribute__((section(".test_address_1"))) const uint8_t buf_1[] = {0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*地址为0x00014000*/

查看二进制文件:

数学库包含

有时候就算加了include“math.h”,也找不到数学函数,这个时候就需要包含数学库。

 软件开发技巧总结:

在项目开发过程中需要有远程升级功能

首先我们需要添加工具,

在test.bat中我们只需要修改与本次项目bootloder程序的地址即可,此后编译就会生成boot与app的合并文件,与app的单独bin文件

这是test.bat的几段指令

set "bootloaderDir=C:\Users\shi\Desktop\CH32X035G8U6\CH32X03X_BootLoader\obj"

set "target=CH32X035G8U6"



 

del ..\obj\*_app.*

cmd/c ..\tool\mergehex -m %bootloaderDir%\ch32x03x_bootLoader.hex ..\obj\%target%.hex -o %target%_bootloader_app.hex

cmd/c ..\tool\hex2bin -m 0x100 ..\obj\%target%.hex

ren ..\obj\%target%.bin %ModelNumber%_app.bin

cmd/c ..\tool\hex2bin -m 0x100 ..\obj\%target%_bootloader_app.hex

copy ..\obj\%target%_bootloader_app.bin ..\obj\%ModelNumber%_bootloader_app.bin

del ..\obj\%target%_bootloader_app.hex %target%.hex

如果出现编译不过去就需要添加C++环境:下载安装链接如下:

Latest supported Visual C++ Redistributable downloads | Microsoft Learn

 下载设置,生成多个bin文件和HEX文件我们可以在APP中进行下载选择设置。如下图所示

沁恒烧录器使用

点击DIPubTool_N_V3.50.exe,制作烧录工具的烧录文件

生成之后将,生成的文件放入SS文件夹里面

用TypeC连接烧录工具,点击运行exe文件

就可以将烧录文件下载到烧录器了。

烧录完成后使用烧录器电源供电,将USB连接到烧录器的Type_A上,点击s3按键即可下载

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐