Я делаю загрузчик USB для PIC24FJ. Сейчас я пишу в память fla sh шестнадцатеричный файл кода приложения через программное обеспечение и без использования ICD3. После загрузки шестнадцатеричного файла кода приложения я проверил программную память PI C, используя PI C Memory Views панели инструментов окна MPLAB, и вот как это выглядит. PIC24_BOOT_APP_VECTOR_AREA Как вы можете видеть на картинке, код операции не записывается непрерывно в каждый адрес. Он чередуется с 000000.
Также я сравнил коды операций загруженного кода приложения с использованием загрузчика с кодом приложения без использования загрузчика. Я обнаружил, что в кодах операций есть данные, которых нет только в приложении. Фотографии прилагаются. Application_Code_Alone_User_Area , PIC24_Boot_App_User_Area Это может создать проблему при переходе к приложению.
Ниже мой код для хранения данных в буфере и записи в память fla sh. (Я использую программирование одним словом для fla sh)
#define WRITE_FLASH_BLOCK_SIZE 0x04
#define USER_MEM_START_ADDRESS 0x004002
unsigned long rxBuff[60];
int rxIndexer;
int xfer;
lineStart = rxBuff[ 0 ];
positionAddress = (rxBuff[ 2 ] << 8) + (rxBuff[ 3 ]); // THIS IS THE ADDRESS WHERE THE DATA SHOULD BE ADDRESSED
numberOfData = rxBuff[ 1 ]; // THIS IS THE TOTAL NUMBER OF DATA RECEIVED IN THE STREAM
recordType = rxBuff[ 4 ];
rxIndexer = 5; //Start of data index in a INTEL Hex file format
for(xfer = 0; xfer < numberOfData; xfer += WRITE_FLASH_BLOCK_SIZE) // THIS SECTION CONTAINS THE PROCESS OF COMBINING THE INFORMATION
{ // FROM THE DATA STREAM TO THIS FORMAT - 0x00AA, 0xBBCC
rxBuff[rxIndexer] = ((rxBuff[START_OF_DATA_INDEX + xfer]) &0x00FF);
rxBuff[rxIndexer] |= ((rxBuff[START_OF_DATA_INDEX + xfer + 1] << 8) &0xFF00); //end of lower word
rxIndexer++;
rxBuff[rxIndexer] = ((rxBuff[START_OF_DATA_INDEX + xfer + 2]) &0x00FF); //start of upper byte
rxBuff[rxIndexer] |= ((0x00 << 8) & 0xFF00); // phantom byte (0x00)
rxIndexer++;
}
if(lineStart == ':')
{
if(recordType == 0x00 && data_checksum == 0)
{
for(xfer = 0; xfer < numberOfData; xfer += 2)
{
FlashWrite_Word(programAddress + positionAddress, rxBuff[5 + xfer], rxBuff[5 + xfer + 1]);
positionAddress += 2;
}
}
else if(recordType == 0x04 && data_checksum == 0)
{
programAddress = USER_MEM_START_ADDRESS;
}
else if( recordType == END_OF_FILE_RECORD)
{
jumpTo_App();
}