Перейти к содержанию
    

Возможность записи во флеш есть. Ведь как-то этот bootloader должен записать во флеш вашу основную программу? И делается это вызовом функций встроенного заводского загрузчика (IAP). Что писать и куда писать - ему все равно. И на каком языке вы напишете вызов его функций - ему тоже все равно. Почему с REMAP ом не получится - непонятно. У всех получается. Посмотрите внимательно, на какие адреса попадает ваша команда ремапа. Я обращал внимание Артема в той ветке на этот момет - в момент ремапа содержимое первых 512 байтов флеш "накрывается" содержимым ОЗУ. И если следующая за ремапом команда вашего загрузчика попала в эту область - вместо нее будет выполнен мусор из соответствующих адресов ОЗУ. Поэтому если ваш загрузчик настолько мал, что команда находится в первых 512 байтах флеша - надо как-то ее оттуда отодвинуть. Либо поколдовать со скриптом линкера, либо добавить кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А IAP-команды переводятся же в ассемблерный код при компилляции? Это ведь не отдельный язык программирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А IAP-команды переводятся же в ассемблерный код при компилляции? Это ведь не отдельный язык программирования.

нет, конечно

 

в разные регистры заносятся команда, номер начального сектора, конечного сектора, адрес блока данных

вызывается IAP, адрес которого заранее известен

из еще одного регистра читается результат операции

 

какая разница, каким языком это дело описать?

 

а вот требования к выполнению IAP (как то - отключить PLL, например, или вызов IAP не из области FLASH) нужно выполнять обязательно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот требования к выполнению IAP (как то - отключить PLL, например

В UM10398 Chapter 26: LPC111x/LPC11Cxx Flash programming firmware PLL не упоминается (или я не нашёл). Ссылку приведёте?

 

 

вызов IAP не из области FLASH

В примере от NXP функции IAP вызываются из flash. Наверняка потому, что из bootloader не использует прерываний. В случае испоользования прерываний таблицу векторов и обработчики нужно поместить в RAM или запрещать прерывания на время стирания/записи flash.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ссылку приведёте?

 

(как то - отключить PLL, например,

 

где-то это требуется, где-то - нет. Здесь весь смысл в том, что требования выполнения IAP, если они есть, выполнять нужно, а вот на каком языке это делать - никакой принципиальной разницы нет

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь весь смысл в том, что требования выполнения IAP, если они есть, выполнять нужно,

Ну, если так...

Но всё равно спасибо - просмотрел ещё раз UM и обнаружил требование запрета прерываний на момент записи .

Хотя работало и без запрета - может функции IAP запрещают прерывания, если таблица не в ОЗУ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кхм...

Господа, а как обсуждение IAP от NXP относится к теме "STM32 bootloader"? :)

Может быть, выделить это обсуждение в отдельную тему? А то путаница получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, а как обсуждение IAP от NXP относится к теме "STM32 bootloader"? :)

да все как обычно :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include "LPC11xx.h"

#include "rom_drivers.h"

#include "gpio.h"

#include "string.h"

#include "type.h"

#include "core_cm0.h"

#include "system_LPC11xx.h"

#include "application_Flash.h"

 

 

__ASM void __copy_MSP_( )

{

ldr r0, =0x10000000

ldr r0, [r0]

mov sp, r0

}

 

__ASM void __copy_reset_handler_( )

{

ldr r0, =0x10000004

ldr r0, [r0]

bx r0

}

 

/********************************************************** Main function ********************************/

int main(void)

{

SystemInit();

 

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

 

uint32_t const * pSrc = (uint32_t const *)0x00001000; //копируем первые 200 байт флеша, начиная с адреса 0х1000 в ОЗУ

uint32_t * pDst = (uint32_t *)0x10000000;

#define VECTORS_COUNT 128

for(uint_fast8_t i = 0; i < VECTORS_COUNT; ++i)

*pDst++ = *pSrc++;

 

__copy_MSP_( ); //загружаем в стек

 

__disable_irq(); //запрещаем прерывания

LPC_SYSCON->SYSMEMREMAP = 0x01; // remap to ram

 

__copy_reset_handler_(); //прыгаем на Resrt_handler

 

while(1);

}

 

 

Работает только если в "рабочей программе" не используются прерывания. Если прерывания используются, то "Рабоча программа" нивкакую не стартует.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

Просьба откликнуться кто в теме. Пишу загрузчик для своего приложения (IAR 6.40, STM32F103VET). Как можно в процессе линковки вставить размер образа по конкретному адресу? Это точно можно сделать, тому пример пост Сергея Борща :

 

'У меня при сборке приложения линкер сразу за таблицей векторов вписывает размер образа, чтобы загрузчик мог просчитать контрольную сумму загруженного приложения (и только его, не учитывая свободную память).'

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тоже интересовал этот вопрос, но решил следующим образом: зафиксировал длину прошивки контроллера, просто принимаю за максимальный объем флешки контроллера (вернее то что остается от бутлоадера)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это точно можно сделать, тому пример пост Сергея Борща :
Я использую gcc. Про ИАР ничего не скажу. Должна быть какая-то директива размещения константы, надо читать описание линкера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы.

Пробовал следовать советам официальной техподдержки IAR

http://supp.iar.com/Support/?note=62709&from=note+65473

а именно пункта Alternative solution using checksum-start and checksum-end markers

Всё отлично, есть константы с адресами начала и конца проекта, считается CRC32, только в Нех файл значение CRC не заносится категорически, вместо него там нули. А в дизассемблере нормальное значение. Пока не победил это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу сделать загрузку прошивки через веб, но неполучается, не запускается основная программа.

 

Делаю на основе проекта с STM32CubeF4, LwIP_IAP. Манеул к этому проекту

http://www.st.com/st-web-ui/static/active/.../DM00103145.pdf

 

Среда Keil uVision, мк STM32f4

------------------------------------------

 

В бутлоадере выставил начальный адрес с которого будет стартовать основная программа

#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08020000

 

 

В основной программе изменил начальный адресс 0x08020000

В основной программе изменил смещение для таблици векторов #define VECT_TAB_OFFSET 0x20000

------------------------------------------

После загрузки прошивок, доходит до Jump_To_Application(); и все, дальше тишина.

Переменная JumpAddress = 0x080201A5

 

if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)

{

JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);

Jump_To_Application = (pFunction) JumpAddress;

__set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);

Jump_To_Application();

}

 

Основная программа начинается с адреса 0x08020000 смотрел через STM32 ST-LINK Utility

На скринах без смещения с со смещением, данные совпадаю, отличие только адресами.

 

В чем может быть причина?

Спасибо.

post-68026-1418287799_thumb.png

post-68026-1418288125_thumb.png

post-68026-1418288130_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем может быть причина?

Спасибо.

Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу. Вы блинк пробовали прошить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...