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

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
   有时候已经解锁了,往你们写入数据的时候,还是进入中断,不知道怎么回事情
likang1202 回答时间:2019-11-25 09:16:29
把中断失能函数放在for程序前面试一试
mikecai 回答时间:2019-11-25 09:19:49
您的代码粗心了:
FLASHEx_DATAEEPROM_Lock,和FLASHEx_DATAEEPROM_UnLock 都是调用
__enable_irq()
不对啊,__enable_irq()应是您解锁的吧。

评分

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

查看全部评分

mikecai 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版