Вроде бы тривиальная задача, а вот однако застрял не могу понять, где ошибся. Проц - stm32f429. Суть такая "верхнее" приложение парсит hex-файл, выбрасывая из него все служебные данные, и данные не относящиеся к flash. Далее полученное подобие bin отправляется байт за байтом по последовательному порту в микроконтроллер. Микроконтроллер принимает, зашивает и переключается. Так вот после переключения ничего не происходит, проц зависает непонятно где.
Прошивку принятой программы я делаю так:
CODE
#define AVALIABLE_SECTORS_NUM 17 /**< @brief Общее количество доступных мне секторов */
#define USER_APP_START_ADR 0x08020000 /**< @brief Адрес куда шить программу */
/** Сектора, которые мне доступны */
static const u16 sectors [AVALIABLE_SECTORS_NUM] =
{
FLASH_Sector_5, FLASH_Sector_6, FLASH_Sector_7, FLASH_Sector_8, FLASH_Sector_9,
FLASH_Sector_10, FLASH_Sector_11, FLASH_Sector_12, FLASH_Sector_13, FLASH_Sector_14,
FLASH_Sector_15, FLASH_Sector_16, FLASH_Sector_17, FLASH_Sector_18, FLASH_Sector_19,
FLASH_Sector_20, FLASH_Sector_21
};
/** Тут лежит принятая прошивка (массив в SDRAM) */
static u8 __attribute__((section ("._sdram"))) userApp[MAX_BIN_FILE_LEN];
/** Это счетчик принятых байт */
static u32 byteCount = 0;
void programmUserApp (void)
{
u32 numOfPages = byteCount / PAGE_LEN;
if (byteCount % PAGE_LEN) numOfPages++;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
/** Стираю необходимые мне сектора */
for (u32 i = 0; i < numOfPages; i++)
{
if (FLASH_EraseSector(sectors[i], VoltageRange_3) != FLASH_COMPLETE)
{
FLASH_Lock();
while (1); /* Стопор на всякий случай */
}
}
/** Далее шью по 4 байта */
u32 * word = (u32*)userApp;
u32 wordCount = byteCount/4;
if (byteCount%4) wordCount++;
u32 adr = USER_APP_START_ADR;
for (u32 i = 0; i < wordCount; i++)
{
if (FLASH_ProgramWord(adr, *(word++)) != FLASH_COMPLETE)
{
FLASH_Lock();
while (1); /* Стопор на всякий случай */
}
adr += 4;
}
FLASH_Lock();
}
Далее, чтобы удостовериться, что я зашил, то что хотел, я считываю и вывожу в последовательный порт данные, которые оказались во flash в результате моих манипуляций:
CODE
void showProgram (void)
{
u8 * p = (u8*) USER_APP_START_ADR;
printf ("\r\n");
for (u32 i = 0, j = 0; i < byteCount; i++, j++)
{
if ( (j>0) && ((j%16) == 0) )
printf ("\r\n");
printf ("%02X", p[i]);
}
printf ("\r\n");
printf ("End\r\n");
}
Переключаю программу вот так:
CODE
typedef void(*VoidFunction)(void);
void jumpToUserApp (void)
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH, (USER_APP_START_ADR & (~(0x08000000))));
u32 jumpAddress = *(__IO uint32_t*) (USER_APP_START_ADR + 4);
VoidFunction jumpToApp = (VoidFunction) jumpAddress;
__set_MSP(*(__IO uint32_t*) USER_APP_START_ADR);
jumpToApp();
}
Так вот, после считыания я вижу, что зашилось именно то, что лежит в hex-файле в полях данных. То есть данные в hex и во flash совпадают (за вычетом служебных данных). Я не могу понять, что я упустил. Есть у кого соображения, поделитесь если не трудно?