Flash 通过软件编程PIC32内部闪存
我正在尝试对PIC32MX360F512L上的一块内部闪存进行编程和验证。我有一个功能,一次擦除、编程和验证4096字节的块。当我运行它时,函数挂起,试图验证第一个字节Flash 通过软件编程PIC32内部闪存,flash,pic,pic32,Flash,Pic,Pic32,我正在尝试对PIC32MX360F512L上的一块内部闪存进行编程和验证。我有一个功能,一次擦除、编程和验证4096字节的块。当我运行它时,函数挂起,试图验证第一个字节 BOOL Loader_ProgramFlashBlock(unsigned long int adr, unsigned int *p ) { unsigned long int CurrentAddress; unsigned long int PageEndAddress; unsigned int *pData;
BOOL Loader_ProgramFlashBlock(unsigned long int adr, unsigned int *p )
{
unsigned long int CurrentAddress;
unsigned long int PageEndAddress;
unsigned int *pData;
unsigned int nvmResult;
// Calculate the beginning and ending addresses of the page.
CurrentAddress = adr;
PageEndAddress = CurrentAddress + FLASH_BLOCK_SIZE;
pData = (unsigned int *)p;
// Check to see if the page has been erased
{
// If not, erase the page & log track it
nvmResult = NVMErasePage((void *)CurrentAddress);
if (nvmResult != 0)
{
// Error erasing Flash page
return FALSE;
}
}
// Program the block to Flash
while (CurrentAddress < PageEndAddress)
{
if ( NVMWriteWord( (void *)CurrentAddress, *pData ) != FALSE )
{
// Error Writing Flash
return FALSE;
}
pData++;
CurrentAddress += sizeof(unsigned int);
}
// Verify that the block was written correctly
// (This check will identify writes to a Flash block that was not fully erased.)
CurrentAddress = adr;
pData = (unsigned int *)p;
while (CurrentAddress < PageEndAddress)
{
// Compare buffer contents to Flash contents
if (*((unsigned int *)PA_TO_KVA1(CurrentAddress)) != *pData)
{
// Flash and buffer did not match.
return FALSE;
}
pData++;
CurrentAddress += sizeof(unsigned int);
}
return TRUE;
} // Loader_ProgramFlashBlock
BOOL Loader\u ProgramFlashBlock(无符号长整数adr,无符号整数*p)
{
无符号长整数当前地址;
无符号长整型PageEndAddress;
无符号int*pData;
无符号整数nvmResult;
//计算页面的起始地址和结束地址。
CurrentAddress=adr;
PageEndAddress=当前地址+闪存块大小;
pData=(无符号整数*)p;
//检查页面是否已被擦除
{
//如果没有,请删除页面并记录跟踪它
nvmResult=NVMErasePage((void*)当前地址);
如果(nvmResult!=0)
{
//删除闪存页时出错
返回FALSE;
}
}
//将块编程为闪存
while(CurrentAddress
函数挂起,尝试在以下行验证闪存的第一个字:
如果(*(unsigned int*)PA_TO_KVA1(CurrentAddress))!=*pData)
擦除和数据写入似乎已起作用。有什么建议导致这种情况吗
此代码在另一个应用程序中工作。您要覆盖哪个内存块?那里有什么数据?难道您不重写加载程序或中断处理程序使用的某些函数,这些函数在您编写时可能会出错吗 我正在从应用程序编写一个新的引导加载程序。中断被禁用。