我正在尝试重新编程NVM(闪存库2),同时从STM32L071CB微控制器中的闪存库1运行代码。正如AN4808和AN4767所述,“存储器接口能够并行读取两个存储体,或者在写入另一个存储体时读取一个存储体 ......”,但我遇到了一些问题:- 调试显示闪存库2半页写入操作期间闪存状态寄存器中的FWWERR位变为高电平。这意味着由于代码获取,写入闪存库2已被停止。
- 通过库1中的代码擦除库2可正常工作。
- 库1中的代码通过单词bank2写入似乎正常工作(但我怀疑它是否只是巧合)。
- 半页写入以FLASH_SR中设置的FWWERR位结束,并且我正在尝试写入的内存中为零。
我知道我错过了一些东西,但我找不到它是什么。也许有人有类似的问题?我开始认为微控制器有问题(勘误表指出了双库切换机制的一些问题,但在我的情况下它应该不是问题,因为我现在没有切换银行)。从RAM内存执行时,我的功能正常工作,但我宁愿它从闪存库1运行。下面的函数(1)负责写半页。代码(2)显示了我正在调用的方式(2)。(1)- void nvm_prog_write_halfpages(uint32_t* addr, uint32_t* data, uint32_t length){
- // There can't be any previous alignment errors in the flash SR
- if ((FLASH->SR & FLASH_SR_PGAERR_Msk) == FLASH_SR_PGAERR){
- FLASH->SR = FLASH_SR_PGAERR; // clear any previous alignment errors
- }
- // Check if any operation was stopped previously due to code fetching
- if ((FLASH->SR & FLASH_SR_FWWERR_Msk) == FLASH_SR_FWWERR){
- FLASH->SR = FLASH_SR_FWWERR; // clear any previous fetch related errors
- }
- nvm_prog_unlock();
- FLASH->PECR |= FLASH_PECR_PROG | FLASH_PECR_FPRG;
- uint32_t cnt = 0;
- while (length > 0){
- *addr = *data; // Destination address will be increased by the hardware automatically
- data++;
- cnt++;
- // When a half-page has been written
- if (cnt == 16){
- while ((FLASH->SR & FLASH_SR_BSY_Msk) == FLASH_SR_BSY)
- ;
- cnt = 0;
- addr += 16; // Write the next half-page
- length--;
- }
- }
- FLASH->PECR &= ~(FLASH_PECR_PROG | FLASH_PECR_FPRG);
- nvm_prog_lock();
- }
复制代码(2)- nvm_prog_erase_page((uint32_t *) 0x08010000); // Erase flash bank 2; it starts at 0x08010000
- uint32_t dummydata[32], i;
- for (i=0; i<32; i++){
- dummydata[i] = i;
- }
- nvm_prog_write_halfpages((uint32_t *) 0x08010000, &dummydata[0], 2); // Write 2 half-pages at the beginning of flash bank 2
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
当半页操作开始时,存储器接口等待16个地址/数据,中止(带有硬故障)所有不是读取的读取访问(参见Fetch和prefetch)。提取将停止半页操作。存储器内容保持不变,FWWERR错误在FLASH_SR寄存器中设置。
这意味着闪存中不允许获取操作,同时向存储器接口提供16个字(无论代码在存储区1中运行,还是在存储区2中执行半页编程)。一旦将16个字发送到存储器接口,您就可以从闪存恢复执行,即在闪存库内物理写入数据期间(假设您的代码在另一个存储区中运行)。
简而言之,您需要从SRAM执行存储器接口的16个字的输入,并确保中断不会导致闪存中的取指(屏蔽所有中断或重新定位中断处理程序并中断SRAM中的向量)。
注意:单编程操作不存在此限制。
一周热门 更多>