龙芯1C300B白菜板提示PANIC Unexpected TLB refill exception!或PANIC Unexpected General exception

目录

问题描述

分析问题

解决办法

板子上SDRAM型号与初始化代码中的型号保持一致

虚焊


 

问题描述

白菜板每次重启后,串口只打印以下内容

asm uart2 init ok!

PANIC! Unexpected TLB refill exception!

CAUSE=4000800c
STATUS=00400002
ERRORPC=00000000
EPC=80011ecc
BADADDR=7ffffffc

或者

asm uart2 init ok!

PANIC! Unexpected General exception!

CAUSE=40008028
STATUS=00400002
ERRORPC=00000000
EPC=a03483ac
BADADDR=00000000

或者打印类似的内容,复位后,会仍然也是打印这些字符串。

分析问题

从这个打印看,cpu(龙芯1C300B)已经正常工作了,打印的第一行字符串“asm uart2 init ok!”就是证据,这个字符串是在最开始的启动汇编里面打印出来的,在汇编中,用汇编语言初始化了串口后,就会打印这个字符串,表示串口初始化完成,可以用串口打印调试信息(即用串口来调试)了。

后面的字符串“PANIC! Unexpected TLB refill exception!”的意思是,出现了异常(可以类似简单的理解为中断)。

如果这个中断不是你有意产生的,那么多半是SDRAM没有正常工作

可能有很多网友都遇到过这个情况。可是为什么会出现SDRAM不正常工作的情况呢?因为白菜板是开源硬件,原理图和PCB的所有源文件都开源了,所以有很多网友都是自己去嘉立创打板,自己买元器件,自己焊。如果SDRAM出现虚焊的话,你说SDRAM还能正常工作吗?这是一种情况,还有一种情况是,板子上的SDRAM型号与初始化代码中的型号不符。理论上,只要引脚兼容,就可以根据自己需要随意换SDRAM型号。如果使用的型号不是代码中默认的型号,那么需要修改代码。

解决办法

经过上面的分析,已经知道大概原因了,那就按照思路改呗。

板子上SDRAM型号与初始化代码中的型号保持一致

源码src->lib->sdram_cfg.h中,如下

#if 1
// 白菜板8MB
/*
    以型号为IS42S16400的SDRAM为例,
    物理参数为,
    容量:8MB
    位宽:16位
    列宽:8位,即2的8次方,即256
    行宽:12位,即2的12次方,即4K

    所以,
    颗粒的位宽=WIDTH_16
    颗粒的列数=COL_256
    颗粒的行数=ROW_4K

    再结合宏SD_PARA0和芯片手册中寄存器SD_CONFIG,相信一看就能明白
    替换宏SD_PARA0中的行宽、列宽和位宽
*/
#define SDRAM_WIDTH         (WIDTH_16)
#define SDRAM_COL           (COL_256)
#define SDRAM_ROW           (ROW_4K)

#else

// 智龙32MByte
#define SDRAM_WIDTH         (WIDTH_16)
#define SDRAM_COL           (COL_512)
#define SDRAM_ROW           (ROW_8K)

#endif

两种SDRAM型号,分别为ISSI的8M的IS42S16400,另外一个是智龙使用的32M的SDRAM。如果是这两种中的其中一种,则根据情况使用#if 0,或者#if 1。如果是其它型号,则参考这个格式,根据SDRAM的行列宽修改这三个参数即可。

比如,如果是8M的SDRAM,则使用#if 1。如果是32M的SDRAM,则使用#if 0。

修改代码后,一定要make clean,然后再make。汇编文件的依赖关系检测貌似有bug,如果不make clean,就算修改了sdram_cfg.h,执行make时也不会重新编译汇编文件start.S。

虚焊

再拖焊一次,然后仔细检查

 

 

你可能感兴趣的:(龙芯1c裸机编程,龙芯1c库)