реклама на сайте
подробности

 
 
> Самописный бутлоадер STM32
yanvasiij
сообщение Dec 21 2016, 14:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Доброго времени суток!

Вроде бы тривиальная задача, а вот однако застрял не могу понять, где ошибся. Проц - 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 совпадают (за вычетом служебных данных). Я не могу понять, что я упустил. Есть у кого соображения, поделитесь если не трудно?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016