游者幻魂 发表于 2018-10-10 18:35:12

原子的例程,写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出错,但是不知道怎么解决!

查表是“精确的数据访问违例”


游者幻魂 发表于 2018-10-11 20:32:45

        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)));

正点原子-122954 发表于 2018-10-11 20:52:58

你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。

游者幻魂 发表于 2018-10-11 21:19:03

空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。

游者幻魂 发表于 2018-10-11 21:20:24

正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...


空间是足够的,STM32F105VCT6B,256KB的ROM空间,设置里面的起始地址是0x0800 0000 ,SIZE是0x4 0000,FLASH开始读取的地址是0x0803 FC00,后面的1K数据就是作为模拟EEPROM使用。

游者幻魂 发表于 2018-10-11 21:29:23

正点原子-122954 发表于 2018-10-11 20:52
你的MCU flash空间是够的吧?
另外,如果有我们开发板的话,直接在我们例程基础上修改看看。 ...

在原子的开发板上开发例程里面调试没有发现这个问题,移植到我的工程里面才有这个问题,已经移植了一段时间了,没有用到就没发现,现在用到了才发现这个问题。解决不了就把我的工程文件一个个移出去、屏蔽不需要的变量,只保留读写FALSH的文件,还是一样出错,另外设置保持和你们原子的设置一样的

游者幻魂 发表于 2018-10-11 21:37:00

本帖最后由 游者幻魂 于 2018-10-12 15:06 编辑

出问题的工程

xiaoshen-372360 发表于 2018-10-17 09:03:58

你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不是这个函数,你重新定问一下问题应该不难,而且Flash操作本来也很简单。

游者幻魂 发表于 2018-10-19 16:15:58

xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...

我使用的是HAL库,不是标准库,然后出错的函数是正点原子编写读取FALSH状态的函数,在写FALSH前第一次读取CR是OK,写完FLASH第二次读取CR状态就报错!困扰我的问题是找不到第二次读取CR的值时出错的原因,使用HaedFault_handler中断函数调试出来的寄存器原因是“精准的数据访问违例”,如果是HAL库出问题应该是直接进报错中断函数了!或者是库函数出来的时候FALSH的访问地址就出错了,导致下一次的FALSH读取时出错!我想这个问题不能定性为越界或者内存出错的问题,应该是指针出错,而且是在库函数出来的那一刻FLASH地址被串改了!下一次用到时就报错

游者幻魂 发表于 2018-10-19 16:17:08

xiaoshen-372360 发表于 2018-10-17 09:03
你说的出错的得放是引用的光放的库,而这个函数只是获取了状态而已,所以出错应当是调用该函数之前,而并不 ...

现在移植到标准库了,没有报错!
页: [1]
查看完整版本: 原子的例程,写FLASH时读取SR状态报错,进入HardFault_Handler