CH32V103 关闭优化后,读FLASH硬件故障?

正常优化体积,没问题。  但是调试发现有部分地方观察不到,于是关闭优化。


结果报硬件故障中断,调试发现是读FLASH的时候触发的。 简简单单几行代码,只读,没有写的操作,怎么会触发中断呢?

void Read_ConfigData(void)
{
    ConfigInfo.iMaxVoltage = *(u32 *)(FLASH_POWERDATA_ADDR);
    ConfigInfo.iMaxCurrent = *(u32 *)(FLASH_POWERDATA_ADDR+0x04);
    ConfigInfo.iTime1 = *(u32 *)(FLASH_POWERDATA_ADDR+0x08);
    ConfigInfo.iTime2 = *(u32 *)(FLASH_POWERDATA_ADDR+0x0B);

	if(0xFFFF == ConfigInfo.iMaxVoltage)
	{
	    InitPowerInfo();
	}
}


您好,仿真时不建议代码中有flash操作,因为涉及flash操作会有对flash上锁,影响仿真。至于关闭优化为什么会报hardfault中断,可以看一下mepc  mcause  mtval几个寄存器看看是啥值,mepc可以定位出错的位置,mcause可以查看出错的原因,mtval可以查看引起出错的值。可以直接调用函数查看这几个寄存器的值,如下图。关于这几个寄存器的具体介绍,可参考我们

QingKeV4 微处理器手册,下载链接如下:


image.png



mepc=6700, HEX,1A2C 对应代码段,刚好是我最后一句读Flash的操作。

28            ConfigInfo.iTime2 = *(u32 *)(FLASH_POWERDATA_ADDR+0x0B);
00001a26:   lui     a5,0x800e
00001a2a:   addi    a5,a5,11
00001a2c:   lw      a5,0(a5)

mcause=4   断点?

mtval = 0x800e00b   这个就不知道啥意思了。 



我刚试了下,关闭优化是要报。 但是选其它优化,哪怕是调试优化,程序也能正常运行。  对实际却是没啥影响,可以不用管。


您好,mepc表示异常的返回地址;mcause表示异常的原因,4表示下载地址错位,不对齐;mtval表示引起异常的存储器访问地址或指令编码,即0x800e00b这个地址不对齐。原因应该是你用32位指针访问一个不是四字节对齐的地址,导致异常,你可以按照下图修改试一下。

image.png


只有登录才能回复,可以选择微信账号登录