02.05.2017, 11:48
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
stm32 свой bootloader
Доброго всем дня! Пытаюсь сделать свой bootloader для STM32f103 через CAN. Но запнулся на конфиге линкера в Keil. Прога попросту не стартует. Перечитал кучу инфы, особо не помогло, в основном рассматривают IAR, а я в keil пишу.
Код:
|
int main (void)
{
__set_PRIMASK(1);
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8002000);
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0002000);
//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
jumpToApplication(0x8002000);
pll_init ();
pio_config ();
// ðàçáëîêèðîâàíèå ôëýøà
FLASH_Unlock();
// èíèò ôëýøà
EE_Init();
//__disable_irq();
for(i_tmp=0;i_tmp‹12;i_tmp++){set_sns_lines(i_tmp);}
USART1_Init(2); //9600
RTC_conf ();
while(1)
{
}
void jumpToApplication(uint32_t addr)
{
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
JumpAddress = *(uint32_t*) (addr + 4);
Jump_To_Application = (pFunction) JumpAddress;
// Initialize user application's Stack Pointer
__set_MSP (*(vu32*) addr);
Jump_To_Application();
} |
Может чего подскажите, куда копать. Просто с бутлоадерами ковыряюсь впервые.
__________________
То, что нас не убивает - делает нас сильнее
Последний раз редактировалось serb-radio; 02.05.2017 в 11:52.
|
|
|
|
02.05.2017, 14:11
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: stm32 свой bootloader
Если смещаете начальный адрес, не забывайте размер снижать на тот же объем данных. Иначе данные полезут туда, куда нельзя.
|
|
|
|
02.05.2017, 14:20
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: stm32 свой bootloader
Попробую, в примерах такого не узрел, думал, линкер автоматически это делает
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
02.05.2017, 14:53
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: stm32 свой bootloader
С 103им проблем нет. Там все логично. А вот с 003/005 придется выпить не одну бутылку, чтобы заставить его работать. Там надо вектора прерываний копировать в память, а потом их ремапить. Ой больно это было...
|
|
|
|
02.05.2017, 17:48
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: stm32 свой bootloader
а адреса векторов прерываний нужно помещать на величину памяти занимаемой бутлоадером от 0x00 или старта флэша? Т.е. по адресу 0x8002000
или 0x0002000?
Цитата:
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8002000);
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0002000);
|
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
02.05.2017, 17:54
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: stm32 свой bootloader
Сейчас так сделал:
Цитата:
|
pll_init ();
pio_config ();
// ðàçáëîêèðîâàíèå ôëýøà
FLASH_Unlock();
// èíèò ôëýøà
EE_Init();
//__disable_irq();
USART1_Init(2); //9600
RTC_conf ();
T8_config ();
set_led (50);
__set_PRIMASK(1);//îòêëþ÷èòü âñå ïðåðûâàíèÿ
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8002000);
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0002000);
__set_PRIMASK(0);//âêëþ÷èòü âñå ïðåðûâàíèÿ
// NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
jumpToApplication(0x8002000);
while(1)
{
}
|
Хочу помигать таймером светодиодиком в бутлоадере, но проц молчит. Что не так делаю. Размер в линкере скорректировал на величину бутлоадера
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
02.05.2017, 18:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: stm32 свой bootloader
Вы должны разместить свой будлоадер в том секторе, который не будет перезаписан загружаемой прогой. Лучше всего в последнем секторе. Документ PM0075 обязателен для прочтения!
Чтобы компилятор понимал, куда впихнуть каждую функцию, нужно в скрипте линкера создать секцию с адресом и размером последнего сектора, а все функции писать с атрибутом этой секции: __attribute__((section (".имя_секции"))) void Funct(void).
Теперь компилятор все функции бутлоадера разместит в последнем секторе флеша, причем, бутлоадер предварительно сам должен быть записан во флеш. А сама записываемая прога не должна превышать оставшегося размера.
Последний раз редактировалось NewWriter; 02.05.2017 в 18:50.
|
|
|
|
02.05.2017, 18:44
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: stm32 свой bootloader
Я кладу бутлодер всегда в начало флеши. Вектора копировать не надо.
|
|
|
|
02.05.2017, 18:54
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: stm32 свой bootloader
подскажите, в настройке линкера и в проге что я делаю не так? в такой настройке нач адреса проги, она не стартует. Где мне прописать начало бутлоадера а где начало рабочей программы? не пойму тогда или, если не жалко, пример скиньте, буду сам разбираться, спасибо
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
02.05.2017, 20:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: stm32 свой bootloader
Так все верно - вы смещаете код проги во флеше, и у вас весь код пишется не от начала флеша, а дальше. А МК стартует от начала флеша и не находит там ничего. Потому и не запускается. Если бутлоадер размещаете в начале, то пишите его как обычную прогу. То есть, начало флеша установите на его физическое начало (0ч8000000), и уменьшите размер секции до нескольких килобайт, которые и будут размером будлоадера
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:09.
|
|