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

STM32L072RB写Bank2 EEPROM不响应中断

[复制链接]
fufufuchi 提问时间:2020-3-31 16:37 /
STM32L072RB有两个BANK, 搜狗截图20å¹´03月31日1628_1.png
按参考手册的说法,在对一个Bank进行擦写的时候不会影响到另一个Bank的写。
搜狗截图20年03月31日1631_2.png
也就是说可以在写Bank2的EEPROM时可以响应中断(中断服务函数等都是放在Bank1的Flash中),对吗?
http://www.eemaker.com/stm32l0-eeprom-nvm.html这份帖子也是这么认为的。
但是我实际测试的时候发现写Bank2的EEPROM,串口RX中断会使MCU死机。
Why?????
int main(void)
{
  uint32_t primask_bit;
        uint32_t i;
        uint32_t *wAddr;
  /* Configure the system clock to 16 MHz */
  SystemClock_Config();

  /* Initialize LED2 */
  LED_Init();

  /* Set LED2 Off */
  LED_Off();

  /* Initialize button in EXTI mode */
  UserButton_Init();

  /* Configure USARTx (USART IP configuration and related GPIO initialization) */
  Configure_USART();
               
        primask_bit = __get_PRIMASK();
  __disable_irq();
        FLASH->PEKEYR = FLASH_PEKEY1;
  FLASH->PEKEYR = FLASH_PEKEY2;
  __set_PRIMASK(primask_bit);
               
  /* Infinite loop */
  while (1)
  {
                wAddr=(uint32_t *)(DATA_EEPROM_BANK2_BASE);
                LL_mDelay(1000);
                LED_On();
                for(i=0;i<100;i++)
                {               
                        *wAddr++=0x99887766;
                }
                LED_Off();
  }
}

收藏 评论13 发布时间:2020-3-31 16:37

举报

13个回答
fufufuchi 回答时间:2020-4-1 11:34:11
请大神们支援
pxforever 回答时间:2020-4-1 15:11:00
抱歉,首先你得注意了,有一句别忽略了,就是在flash中,若你写的ROM区域,该内存数值非FF时,会报硬件错误。所以,你的代码操作实在过于不严谨。操作flash是一次一个section,并且在操作时应先erase,再写入。

评分

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

查看全部评分

yklstudent 回答时间:2020-4-1 16:49:12
EEPROM写数据是像你这么写的?
fufufuchi 回答时间:2020-4-1 17:28:19
yklstudent-1794 发表于 2020-4-1 16:49
EEPROM写数据是像你这么写的?

没问题吧
fufufuchi 回答时间:2020-4-1 17:35:45
pxforever 发表于 2020-4-1 15:11
抱歉,首先你得注意了,有一句别忽略了,就是在flash中,若你写的ROM区域,该内存数值非FF时,会报硬件错误 ...

我写的地址是EEPROM
pxforever 回答时间:2020-4-1 18:27:23
可以看到,在写入eerom前,至少做状态检测才写入的。
1585736743(1).jpg

评分

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

查看全部评分

fufufuchi 回答时间:2020-4-2 08:44:47
大神们,麻烦支援一下,感激不尽
fufufuchi 回答时间:2020-4-2 14:11:50
pxforever 发表于 2020-4-1 18:27
可以看到,在写入eerom前,至少做状态检测才写入的。

谢谢大神!
pxforever 回答时间:2020-4-2 20:23:18
可以了?
yklstudent 回答时间:2020-4-5 17:15:17

/* 芯片内部EEPROM地址数据写操作 */
bool sST_EEPROM_WriteBytes(uint16_t addr, uint8_t *buffer, uint16_t length)
{
        bool result = true;
        uint8_t *address;
       
        if( (addr + length) > ST_EEPROM_BYTE_SIZE)
        {
                return false;
        }
       
        address = (uint8_t *)(ST_EEPROM_BASE_ADDR + addr);
       
        DIS_INT();
       
        /* unlock */
        FLASH->PEKEYR = FLASH_PEKEY1;
        FLASH->PEKEYR = FLASH_PEKEY2;
        while(FLASH->PECR & FLASH_PECR_PELOCK);
        for(; length > 0; length--)
        {
                *address++ = *buffer++;
                while(FLASH->SR & FLASH_SR_BSY);
        }
        /* lock */
        FLASH->PECR |= FLASH_PECR_PELOCK;
       
        EN_INT();
       
        return result;
}
你试试这样的
butterflyspring 回答时间:2020-4-8 17:32:09
对于EEPROM的编程,手册是有一定要求的,不应该连续写入的。
EEPROM PROGRAM L0.PNG

评分

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

查看全部评分

fufufuchi 回答时间:2020-4-18 10:59:39

可以了
李康1202 回答时间:2020-4-18 11:27:08
顶一顶
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版