原子的例程,写FLASH时读取SR状态报错,进入HardFault_Handler
本帖最后由 游者幻魂 于 2019-2-26 17:48 编辑使用正点原子的例程写代码,发现有如下的问题:
1、读取 Flash的内容时,读到最后0x0803 FFFE的值为0xFFFF AAAA ,结果报错进入HardFault_Handler死循环;#define FLASH_USER_EEROM 0x0803fc00
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);后来把 FLASH_USER_EEROM由0x0803fc00改为0x0803f400,结果才不会报错。
2、改完后继续运行又有报错,单步调试发现是如下红色的代码时出错,一时找不到出问题的地方。
FLASHSRSTATUS STMFLASH_GetStatus(void)
{
u32 Flash_SR_Temp;
<font color="#ff0000">Flash_SR_Temp=FLASH->SR; //出错的地方</font>
if(Flash_SR_Temp&FLASH_SR_BSY_Msk)
return Flash_SR_Busy;
else if(Flash_SR_Temp&FLASH_SR_PGERR_Msk)
return Flash_SR_PgErr;
else if(Flash_SR_Temp&FLASH_SR_WRPRTERR_Msk)
return Flash_SR_WrPrtErr;
else
return Flash_SR_EOP;
}寄存器状态如下:
查了一天时间,知道是读取flash地址0X0803FFFE出错,但是不知道怎么解决!
查表是“精确的数据访问违例”
static unsigned int stacked_r0;
static unsigned int stacked_r1;
static unsigned int stacked_r2;
static unsigned int stacked_r3;
static unsigned int stacked_r12;
static unsigned int stacked_lr;
static unsigned int stacked_pc;
static unsigned int stacked_psr;
static unsigned int SHCSR;
static unsigned char MFSR;
static unsigned char BFSR;
static unsigned short int UFSR;
static unsigned int HFSR;
static unsigned int DFSR;
static unsigned int MMAR;
static unsigned int BFAR;
stacked_r0 = ((unsigned long) hardfault_args);
stacked_r1 = ((unsigned long) hardfault_args);
stacked_r2 = ((unsigned long) hardfault_args);
stacked_r3 = ((unsigned long) hardfault_args);
stacked_r12 = ((unsigned long) hardfault_args);
stacked_lr = ((unsigned long) hardfault_args);
stacked_pc = ((unsigned long) hardfault_args);
stacked_psr = ((unsigned long) hardfault_args);
SHCSR = (*((volatile unsigned long *)(0xE000ED24)));
MFSR = (*((volatile unsigned char *)(0xE000ED28)));
BFSR = (*((volatile unsigned char *)(0xE000ED29)));
UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));
HFSR = (*((volatile unsigned long *)(0xE000ED2C)));
DFSR = (*((volatile unsigned long *)(0xE000ED30)));
MMAR = (*((volatile unsigned long *)(0xE000ED34)));
BFAR = (*((volatile unsigned long *)(0xE000ED38))); 你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。 正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...
空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。 正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...
在原子的开发板上开发例程里面调试没有发现这个问题,移植到我的工程里面才有这个问题,已经移植了一段时间了,没有用到就没发现,现在用到了才发现这个问题。解决不了就把我的工程文件一个个移出去、屏蔽不需要的变量,只保留读写FALSH的文件,还是一样出错,另外设置保持和你们原子的设置一样的 本帖最后由 游者幻魂 于 2018-10-12 15:06 编辑
出问题的工程 你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不是这个函数,你重新定问一下问题应该不难,而且Flash操作本来也很简单。 xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...
我使用的是HAL库,不是标准库,然后出错的函数是正点原子编写读取FALSH状态的函数,在写FALSH前第一次读取CR是OK,写完FLASH第二次读取CR状态就报错!困扰我的问题是找不到第二次读取CR的值时出错的原因,使用HaedFault_handler中断函数调试出来的寄存器原因是“精准的数据访问违例”,如果是HAL库出问题应该是直接进报错中断函数了!或者是库函数出来的时候FALSH的访问地址就出错了,导致下一次的FALSH读取时出错!我想这个问题不能定性为越界或者内存出错的问题,应该是指针出错,而且是在库函数出来的那一刻FLASH地址被串改了!下一次用到时就报错 xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...
现在移植到标准库了,没有报错!
页:
[1]