本帖最后由 Lana636 于 2025-5-9 17:14 编辑
#申请原创# GW3323开发时常见报错代码:1.0 程序烧录不进去,提示“错误 芯片不支持功能请求”

原因1:芯片供电不足。测试Vbat输入是否有3.3V,输出的电压Vddio是否有3.3V?
原因2:软件有没有开芯片不支持的功能,用downloader复核;
原因3:上个版本程序把芯片改写了,即使全擦芯片,仍显示“错误 芯片不支持功能请求”;让主板完全断电,等待十分钟后,再烧录试试。
1.1、ERR: 2, EPC: 13e原因:指令跑飞异常。
1.2、ERR: 4原因:RAM溢出异常(野指针、空指针)。ERR:4 ,EPC:87302
原因:升级完固件后,wav文件地址放生了变化,导致升级重启后调用相同地址文件出现错误。
解决方法:启用20250327及以后的libplatform.a、res_user.xm、ui.xm、prebulid.bat及路径设置等文件。
此版本固件可以通过setresmode设置音频文件的位置。
$compiler $options $includes -E -P -x c -c "$(PROJECT_DIR)output\bin\res.xm" -o "$(PROJECT_DIR)output\bin\res.bat"
$compiler $options $includes -E -P -x c -c "$(PROJECT_DIR)output\bin\res_user.xm" -o "$(PROJECT_DIR)output\bin\res_user.bat"
1.3、ERR: 20原因:除0异常。
2、ERROR ======> GIE-DIS in Flash: 1, EPC=19602 MISS=1005a452
原因:关中断临界区内调用flash函数产生异常,1005a452是调用的位置。
内存报错,变量非法访问,函数调用异常,解决方法:
2.1、中断中的打印函数要用printk函数,里面的全局变量要用volatile申明,中断函数要放到com_text区域;即添加AT(.com_text.isr)。以下为示例: AT(.com_rodata.isr) const char str_1[] = "Tim3 done\r\n "; AT(.com_rodata.isr) const char str_2[] = "Tim3 %d\r\n "; volatile u32 duty_n; AT(.com_text.isr) void timer3_isq(void) { if (tmr_get_flag(TMR3, TMR_FLAG_UPDATE2) != RESET) { tmr_clear_flag(TMR3, TMR_FLAG_UPDATE2); func_A();//例如:gpio_toggle_bits(GPIOB_REG, GPIO_PIN_2); printk(str_1); printk(str_2,TMR3CON); } } 例如func_A()中调用了func_B(),那么func_B()也要放入AT(.com_text.isr)区。
2.2、关中断程序及其在开中断前的操作都要放到flash中执行,否则会报此类错误。 备注:u32 isq_ALL; void ARMDisableInt(void) { isq_ALL = PICEN; PICEN = 0; }
void ARMEnableInt(void) { PICEN = isq_ALL; }
2.3、函数内某些变量没有初始化,导致运行时读到的是随机地址数据,也会出现ERROR异常
2.4、强制执行非对齐访问可能导致硬件错误中断,异常区域在.ld中添加. = ALIGN(512)或. = ALIGN(4);
3、ERROR ======> thread suspend: thread disorder, 2 原因:中断问题导致线程挂起
解决方法:中断中的打印函数要用printk函数,里面的全局变量要用volatile申明,中断函数要放到com_text区域;即添加AT(.com_text.isr)。
4、“ERROR ======> timer_thread miss: 178a2, 4c624” 原因:系统timer函数中调用了flash函数,在.map文件中找到“178a2”即可定位发生异常的函数。
解决方法:把timer函数中flash函数加AT(.com_text),改到公共区。中断里面建议少跑点东西。
5、ERROR ======> CRC: 5085 c29f
原因1:读取地址内容CRC检验结果不一样就报错。 解决方法1:可能是你操作的时候把flash原来的程序破坏了,不然就是load flash的配置被改了"config.h"中更改#define FLASH_SIZE FSIZE_1M
ERROR ======> CRC: db5c acd5
原因2:执行fot_write()函数(函数地址0x10005726)时,仍在执行wav_res_play_user_kick()函数(函数地址0x1920a,comm区). 解决方法2:把PICEN=0x47832e改成PICEN=0x47802e,暂时关掉音频播放功能;因为wav_res_isplay()返回0,实际上有可能还在处理音频,要把当前8ms音频处理完后才不会继续处理。 ERROR ======> CRC 原因3:在app.xm中执行setfotaddr(FLASH_CODE2_OFFSET);但是未起作用. 解决方法3:把工程的header.bin换成2024.02.28的及以后得版本。查看strong_symbol.c文件中是否添加了以下函数。 #if FOT_EN u8 is_fot_update_en(void) { return 1; } #endif
原因4:变量在其他地方被调用,导致数据被改写。在调用前打印相关的所有变量,看看是否被改写 解决方法4:变量控制好,用良好的代码编写习惯。
6、riscv32-elf-ld.exe:Output\obj\ram.o:1: syntax error 原因:工程路径中含括号()或中文 解决方法:检查路径名称并修改
7、appxm.o unrecognize function"setfotaddr"
解决方法:在app.xm添加地址设置setfotaddr(addr); 注意,此命令需在setflash后进行设置,且在make命令之前,此时第二份代码实际存放的地址为 0x2000 + addr。举个例子,如果要将第二份代码存放在1M的位置,设置如下:setfotaddr(0xFE000); 若设置后编译报错,请将编译链(RV32-Toolchain-Setup)更新到最新版本(v1.3.9及以上)。
8、程序卡死在delay_ms()这个函数中
原因:TMR0CON寄存器由0x85变成0x10,故无法正常执行延时的功能。
解决方法:打印异常前TMR0CON的值,找到出现变化的位置,即可定位问题。例如未插入USB,就调用ude_rx_ack(),会造成TMR0CON的值被改写。
8.2程序调用delay_ms(),查看串口时间戳看没有起作用
原因:delay_ms()不起作用。
解决方法:delay_5ms()是系统库,起作用。
9、错误 不支持的目标设备型号
原因:SDK有其他设置
解决方法:用downloader_V3.3.0及以上的版本
10、报“FOT_ERR_CRC_VERIFY”错误解决方法:header.bin是否是2024.02.28及以后版本,文件大小是否是4KB.有些公司有加密系统,会把header.bin文件加密。生成fot文件的工程,要有setuserbin和setfotaddr函数。
11、其他报错解决方法:把工程中的warning变成0,因为有可能是用户代码问题,造成变量不是同一个变量(地址不同),导致逻辑并不按照用户的逻辑来。
12、 memcpy(fot_data,pMsg->data,pMsg->package_len);//这个函数不起作用了。原因:spi1等时钟未打开,is_fot_update_en未添加。
13、setresmode、register_spi_read_function、nanos_var_init函数报错,皆是因为libdrivers.a,libbtstack.a,libplatform库不是20241030日之后的版本。
此类函数是用于设置音频地址,音频数据和代码数据分开,音频算作了数据区,而非代码区。对升级固件,升级音频文件有用。
14、setuserbin仅能有一个起作用,多次调用时,以最后一次调用的参数实现。
15、升级时最后一包fot_get_err()报11,说明CRC不正确。
解决方法:检查是否中间数据出现了断包、跳包、重复包的现象?
例程中蓝牙或USB升级,都是处理完1包后写下1包。不会出现重复包的现象。
但是wifi等网络执行时,会ack后网络有延时,导致云端以为网络有问题,又重复的现象,所以执行fot_write前要检查收到的数据是否连续或者重发了。
16、程序卡在fot_write()原因:CLKGAT1的bit5(SBCEC)和bit12(SPI1)未置1.因为芯片的SPI1和内部合封的flash进行通信,升级代码会对flash地址数据进行操作,所以要打开相关的时钟。
17、“错误 无效的存储设备”,Vbat电压正常,VDDIO也能输出3.2V,仅擦除也报“错误 无效的存储设备”
解决方法:芯片坏了,换个芯片。
|
GW3323开发记录,介绍开发时常见的报错现象并给出相应解决方法。