本帖最后由 Lana636 于 2024-12-19 17:45 编辑
GW3323开发时常见报错代码:1.0 程序烧录不进去,提示“错误 芯片不支持功能请求”
原因:芯片供电不足。测试Vbat输入是否有3.3V,输出的电压Vddio是否有3.3V?
1.1、ERR: 2, EPC: 13e原因:指令跑飞异常。
1.2、ERR: 4原因:RAM溢出异常(野指针、空指针)。
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
原因:读取地址内容CRC检验结果不一样就报错。 解决方法:可能是你操作的时候把flash原来的程序破坏了,不然就是load flash的配置被改了"config.h"中更改#define FLASH_SIZE FSIZE_1M
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的值被改写。
|