可持续发展的主动半解决方案
简体中文英语

Flash编程错误

技术问题 > 分类:一般 > Flash编程错误
罗伯特麦金托什 7在几个月前问过

我有单独的应用程序共享闪存写入算法。 在一个代码库中一切正常。 我可以用变量写入闪存页面并在上电后保存和调用。
在另一个代码库中,我遇到了一些问题。 页面不同,但我不认为这是一个问题。
问题是在第二种情况下,在提供四个32位字后,通常不会写入页面。 我知道需要4字才能触发保存到闪存。 如果触发保存到闪存,则单词的顺序不正确。 我提供的第一个32位字最终在4 dword部分的末尾。
我的数据:
0x20000e78(十六进制)
0x8d3d(十六进制)
0x8db7(十六进制)
0x8dbd(十六进制)
Flash表示:
00008D3D 00008DB7 00008DBD 20000E78
最后一个双字应该在第一个地址,但我最后找到它。
我的flash写算法非常简单,包括:

PAC5XXX_RAMFUNC void wait_for_flash_write(){volatile uint32_t i; if(PAC55XX_MEMCTL-> MEMSTATUS.WBUSY == 0)返回; while(PAC55XX_MEMCTL-> MEMSTATUS.WBUSY == 1); //必须延迟退出以允许闪存更新完成i = 0; while(i <100)i ++; } PAC5XXX_RAMFUNC空隙write_flash_words_to_pointer(uint32_t * flash_pointer,int32_t * data_buffer,uint32_t number_of_dwords){int32_t I; 对于(I = 0; I <number_of_dwords;我++){* flash_pointer ++ = data_buffer [I]; wait_for_flash_write(); } while(i%4!= 0){i ++; * flash_pointer ++ = i; wait_for_flash_write(); }} uint32_t flash_program_from_address(uint32_t * flash_address,uint16_t * word_buffer,uint32_t number_of_words){uint32_t * dword_buffer =(uint32_t *)word_buffer; 如果(!PAC55XX_MEMCTL->的FlashLock = FLASH_LOCK_ALLOW_WRITE_ERASE_FLASH)PAC55XX_MEMCTL->的FlashLock = FLASH_LOCK_ALLOW_WRITE_ERASE_FLASH; write_flash_words_to_pointer(flash_address,dword_buffer,number_of_words / 2); 返回0; }

我使用地址0x8000调用该函数,该地址应为32nd flash页面。 我使用eclipse和GNU编译器的Active-Semi实现。
谢谢你提供的所有帮助,
罗布姆

2答案
何塞·奎诺内斯 几个月前回答了7

罗伯特,
今天我将进一步研究这个问题。 在此期间,您可以尝试以下方法吗? 解锁FLASH后,可以将写字数设置为0吗? (PAC55XX_MEMCTL-> MEMCTL.WRITEWORDCNT = 0;)。 虽然复位后它应该是0,但我们想知道是否由于某种原因写入FLASH的函数被中断并且当字数与0不同时调用正在发生。

罗伯特麦金托什 几个月前回答了7

谢谢你,答案是WRITEWORDCNT。 当我将其重置为0时,闪光灯工作。