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

 
 
> STM32 Bootloader
Jenya7
сообщение Apr 28 2016, 06:03
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я написал отдельную программу - бутлоадер. Чтоб разместить ее во флеш нужно изменить стартап файл и линкер файл. и тут у меня трудности. может кто нибудь рассказать как это делать?
под бутлоадер я хочу отвести первые две страницы. линкер и стартап в принципе изменять не надо.
насчет главной программы. в линкере заменил
Код
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

На
Код
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08001000, LENGTH = 1024K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

и в system_stm32f30x.c заменил
Код
#define VECT_TAB_OFFSET  0x0

На
Код
#define VECT_TAB_OFFSET  0x1000

а что еще надо поменять?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 28 2016, 06:17
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Apr 28 2016, 09:03) *
CODE
  FLASH (rx)      : ORIGIN = 0x08001000, LENGTH = 1024K

Вы уехали за границу доступной памяти. Осетра-то урежте wink.gif , в смысле LENGTH укоротите на размер загрузчика. И в загрузчике аналогично, чтобы получить ошибку если он вдруг налезет на приложение.
QUOTE (Jenya7 @ Apr 28 2016, 09:03) *
а что еще надо поменять?
Зависит от того, что и как вы наворотили в загрузчике. У меня линкер сразу после векторов добавляет размер прошивки в словах (чтобы загрузчик знал, до куда считать CRC), а также резервируется место под CRC.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 28 2016, 06:42
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Apr 28 2016, 12:17) *
Вы уехали за границу доступной памяти. Осетра-то урежте wink.gif , в смысле LENGTH укоротите на размер загрузчика. И в загрузчике аналогично, чтобы получить ошибку если он вдруг налезет на приложение.
Зависит от того, что и как вы наворотили в загрузчике. У меня линкер сразу после векторов добавляет размер прошивки в словах (чтобы загрузчик знал, до куда считать CRC), а также резервируется место под CRC.

спасибо. укоротил. вроде бежит главная программа но как то странно. запускаю через дебагер – пишет no source file named main.c. и через 30 секунд - это у меня таймаут в бутлоудере - бежит главная программа.

добавил в Startup Script
Код
# Reconfigure vector table offset register to match the application location
set *0xe000ed08 = 0x1000

# Get the application stack pointer (First entry in the application vector table)
set $sp = *(unsigned int*)0x1000

# Get the application entry point (Second entry in the application vector table)
set $pc = *(unsigned int*)0x1004

ничего не изменилось.

кстати а как линкер знает размер прошивки? Вы его изменяете после каждой копиляции?

вроде решил проблему. вот полный код скрипта.
Код
# Set flash parallelism mode to 32, 16, or 8 bit when using STM32 F2/F4 microcontrollers
# Uncomment next line, 2=32 bit, 1=16 bit and 0=8 bit parallelism mode
#monitor flash set_parallelism_mode 2

# Set character encoding
set host-charset CP1252
set target-charset CP1252

# Reset to known state
monitor reset

# Load the program executable
load        

# Reconfigure vector table offset register to match the application location
set *0xe000ed08 = 0x1000

# Get the application stack pointer (First entry in the application vector table)
set $sp = *(unsigned int*)0x1000

# Get the application entry point (Second entry in the application vector table)
set $pc = *(unsigned int*)0x1004

# Reset the chip to get to a known state. Remove "monitor reset" command
#  if the code is not located at default address and does not run by reset.
#monitor reset

# Enable Debug connection in low power modes (DBGMCU->CR)
set *0xE0042004 = (*0xE0042004) | 0x7

# Set a breakpoint at main().
tbreak main

# Run to the breakpoint.
continue


Сообщение отредактировал Jenya7 - Apr 28 2016, 08:11
Go to the top of the page
 
+Quote Post



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

 


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


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