Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 通过软件编程PIC32内部闪存_Flash_Pic_Pic32 - Fatal编程技术网

Flash 通过软件编程PIC32内部闪存

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;

我正在尝试对PIC32MX360F512L上的一块内部闪存进行编程和验证。我有一个功能,一次擦除、编程和验证4096字节的块。当我运行它时,函数挂起,试图验证第一个字节

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)

擦除和数据写入似乎已起作用。有什么建议导致这种情况吗


此代码在另一个应用程序中工作。

您要覆盖哪个内存块?那里有什么数据?难道您不重写加载程序或中断处理程序使用的某些函数,这些函数在您编写时可能会出错吗

我正在从应用程序编写一个新的引导加载程序。中断被禁用。