双库读写时是否在STM32L071中正常工作?

2019-07-14 17:15发布

我正在尝试重新编程NVM(闪存库2),同时从STM32L071CB微控制器中的闪存库1运行代码。正如AN4808和AN4767所述,“存储器接口能够并行读取两个存储体,或者在写入另一个存储体时读取一个存储体 ......”,但我遇到了一些问题:
  • 调试显示闪存库2半页写入操作期间闪存状态寄存器中的FWWERR位变为高电平。这意味着由于代码获取,写入闪存库2已被停止。
  • 通过库1中的代码擦除库2可正常工作。
  • 库1中的代码通过单词bank2写入似乎正常工作(但我怀疑它是否只是巧合)。
  • 半页写入以FLASH_SR中设置的FWWERR位结束,并且我正在尝试写入的内存中为零。
我知道我错过了一些东西,但我找不到它是什么。也许有人有类似的问题?我开始认为微控制器有问题(勘误表指出了双库切换机制的一些问题,但在我的情况下它应该不是问题,因为我现在没有切换银行)。从RAM内存执行时,我的功能正常工作,但我宁愿它从闪存库1运行。下面的函数(1)负责写半页。代码(2)显示了我正在调用的方式(2)。(1)
  1. void nvm_prog_write_halfpages(uint32_t* addr, uint32_t* data, uint32_t length){

  2.     // There can't be any previous alignment errors in the flash SR
  3.     if ((FLASH->SR & FLASH_SR_PGAERR_Msk) == FLASH_SR_PGAERR){
  4.          FLASH->SR = FLASH_SR_PGAERR; // clear any previous alignment errors
  5.     }

  6.     // Check if any operation was stopped previously due to code fetching
  7.     if ((FLASH->SR & FLASH_SR_FWWERR_Msk) == FLASH_SR_FWWERR){
  8.         FLASH->SR = FLASH_SR_FWWERR; // clear any previous fetch related errors
  9.     }

  10.     nvm_prog_unlock();

  11.     FLASH->PECR |= FLASH_PECR_PROG | FLASH_PECR_FPRG;

  12.     uint32_t cnt = 0;
  13.     while (length > 0){
  14.         *addr = *data; // Destination address will be increased by the hardware automatically
  15.         data++;
  16.         cnt++;

  17.         // When a half-page has been written
  18.         if (cnt == 16){
  19.             while ((FLASH->SR & FLASH_SR_BSY_Msk) == FLASH_SR_BSY)
  20.                 ;
  21.             cnt = 0;
  22.             addr += 16; // Write the next half-page
  23.             length--;
  24.         }
  25.     }

  26.     FLASH->PECR &= ~(FLASH_PECR_PROG | FLASH_PECR_FPRG);

  27.     nvm_prog_lock();
  28. }
复制代码(2)
  1. nvm_prog_erase_page((uint32_t *) 0x08010000); // Erase flash bank 2; it starts at 0x08010000

  2. uint32_t dummydata[32], i;
  3. for (i=0; i<32; i++){
  4.     dummydata[i] = i;
  5. }

  6. nvm_prog_write_halfpages((uint32_t *) 0x08010000, &dummydata[0], 2); // Write 2 half-pages at the beginning of flash bank 2
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
adcmvp
1楼-- · 2019-07-14 23:18
Read-While-Write在多编程操作的情况下有一些限制。请参阅RM0377§3.3.4写入/擦除NVM - 闪存程序存储器页面82中的程序半页:

当半页操作开始时,存储器接口等待16个地址/数据,中止(带有硬故障)所有不是读取的读取访问(参见Fetch和prefetch)。提取将停止半页操作。存储器内容保持不变,FWWERR错误在FLASH_SR寄存器中设置。

这意味着闪存中不允许获取操作,同时向存储器接口提供16个字(无论代码在存储区1中运行,还是在存储区2中执行半页编程)。一旦将16个字发送到存储器接口,您就可以从闪存恢复​​执行,即在闪存库内物理写入数据期间(假设您的代码在另一个存储区中运行)。

简而言之,您需要从SRAM执行存储器接口的16个字的输入,并确保中断不会导致闪存中的取指(屏蔽所有中断或重新定位中断处理程序并中断SRAM中的向量)。

注意:单编程操作不存在此限制。

一周热门 更多>