你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l011f4 写入eeprom为什么老是进入HardFault_Handler?

[复制链接]
xuyejin 提问时间:2019-11-24 14:59 /
各位大侠,您们好!

           我现在在使用stm32l011f4芯片,要用到eeprom写入保存的数据
为什么老是进入HardFault_Handler?

           程序如下:

uint8_t  FLASHEx_DATAEEPROM_Unlock(void)    //解锁
{
        while ((FLASH->SR & FLASH_SR_BSY) != 0)
        {
        }

        if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
        {  
                    /* Disable interrupts to avoid any interruption during unlock sequence */
                    __disable_irq();

                    /* Unlocking the Data memory and FLASH_PECR register access*/
                    FLASH->PEKEYR = FLASH_PEKEY1;
                    FLASH->PEKEYR = FLASH_PEKEY2;

                    /* Re-enable the interrupts */
                    __enable_irq();

                    if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET)
                    {
                              return 0;
                    }
          }

          return 1;  
}
uint8_t  FLASHEx_DATAEEPROM_Lock(void)        //加锁
{
        while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (1) */
        {
                 /* For robust implementation, add here time-out management */
        }
       
        /* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */
        FLASH->PECR |=  FLASH_PECR_PELOCK;

        /* Re-enable the interrupts */
            __enable_irq();

        return 1;
}


uint8_t  FLASHEx_DATAEEPROM_Erase(uint32_t Address)     //擦除
{

        /* Wait for last operation to be completed */
          while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (1) */
        {
                 /* For robust implementation, add here time-out management */
        }

        FLASH->PECR |= FLASH_PECR_ERASE | FLASH_PECR_DATA; /* (1) */
        *(__IO uint32_t *)(DATA_EEPROM_BASE+Address) = (uint32_t)0; /* (2) */
        __WFI(); /* (3) */
        FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_DATA); /* (4) */       
       
  return 1;
}


void   FLASHEx_DATAEEPROM_Program(uint32_t Address, uint32_t Data)          //写入
{

          /* Wait for last operation to be completed */
          while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (1) */
        {
                 /* For robust implementation, add here time-out management */
        }


         /* Program word (32-bit) at a specified address.*/
        *(__IO uint32_t *)(DATA_EEPROM_BASE+Address) = Data;


        /* Wait for last operation to be completed */
        while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (1) */
        {
                 /* For robust implementation, add here time-out management */
        }
}


uint8_t  FLASHEx_EEPROM_WRITE(uint32_t Address, uint32_t *Data, uint8_t len)
{       
        uint8_t i;
//        uint8_t status;
       
        FLASHEx_DATAEEPROM_Unlock();

        for(i=0;i<len;i++)
        {       
                FLASHEx_DATAEEPROM_Erase(Address+i*4);
                FLASHEx_DATAEEPROM_Program(Address+i*4,*Data);               
                Data++;       
        }       
       
        FLASHEx_DATAEEPROM_Lock();

        return 1;
}


     这个程序是在调用HAL_FLASH库写的程序也是出问题后,自己修改的,还是不行,一往EEPROM里写,还是会进入HardFault_Handler
到底怎么回事情?有大侠能指教一下么?还望大家不吝赐教。




收藏 评论5 发布时间:2019-11-24 14:59

举报

5个回答
xuyejin 回答时间:2019-11-24 15:02:19
   有时候已经解锁了,往你们写入数据的时候,还是进入中断,不知道怎么回事情
李康1202 回答时间:2019-11-25 09:16:29
把中断失能函数放在for程序前面试一试
慎微 回答时间:2019-11-25 09:19:49
您的代码粗心了:
FLASHEx_DATAEEPROM_Lock,和FLASHEx_DATAEEPROM_UnLock 都是调用
__enable_irq()
不对啊,__enable_irq()应是您解锁的吧。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

慎微 回答时间:2019-11-25 09:24:48
写EEPROM,用硬件 I2C, 少数几个读写,就不用禁止所有中断了,除非整段擦写。
butterflyspring 回答时间:2019-12-4 16:15:34
目前看来,手册上指出EEPROM只支持word, half-word ,byte programing. 所以连续赋值显然是不合适的。
另外对于EEPROM是不需要先擦除,再去写的。直接写就好了,而FLASH才需要。


EEPROM PROGRAMING WAY.PNG

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版