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

AtmelStudio как разместить данные в конкретном месте bin файла

Требуется прошить партию изделий на базе микросхемы ATSAME70 с уникальными номерами.

Прошивка создана в  AtmelStudio.

Нужно брать прошивку из архива модифицировать номер и прошивать.

 

Можно ли так слинковать исходник, чтобы секция содержащая только номер изделия получилась в конце файла?

Чтобы потом менять эти значения внешней программой?

 

Или если я просто увеличу исходник до 128кБ и в конце положу номер - он будет и во флеш лежать в конце 128кБ?

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


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

В составе AtmelStudio есть консольная программа atprogram.

У меня с ней написан батник которым я сначала прошиваю elf файл, а затем по известному мне заранее смещению записываю заводской номер. Правда это для контроллера AT32UC3C.

Скрытый текст

@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

chcp 1251 >NUL

rem Если нет параметров - переходим к сообщению и на выход
if '%1'=='' goto msg

set path=C:\Program Files (x86)\Atmel\Studio\7.0;C:\Program Files (x86)\Atmel\Studio\7.0\atbackend;%path%

echo.
echo Проверяем подключение программатора
atprogram list | findstr "jtagicemkii jtagice3" >nul
if %errorlevel% GTR 0 goto no_ice

echo.
echo Проверяем включение напряжение питания контроллера
rem Если напряжение на программаторе с платы меньше 3.1 В - напряжение не включено.
rem Запуск atprogram parameters --voltage возвращает две строки. Первая: "Firmware check OK", вторая: "3.30 V".
rem Игнорируем первую строку, ставим разделитель точку, запятую и пробел. Первый параметр %%a значение до точки (запятой). 
rem Второй параметр %%b от точки(запятой) до пробела. Если %%a%%b < 310 - напряжение не включено.
for /F "skip=1 usebackq tokens=1,2 delims=., " %%a in (`atprogram parameters --voltage`) do if %%a%%b LSS 310 goto no_vcc

echo.
echo Проверяем подключение JTAG цепочки с контроллером at32uc3c2512c
rem Запрашиваем первым попавшимся в системе поддерживаемым программатором по интерфейсу JTAG инфпормацию о контроллере at32uc3c2512c
rem Проверяем в возвращаемом тексте наличие строки at32uc3c2512c. Если строка есть, то errorlevel будет 0.
atprogram -i jtag -d at32uc3c2512c -xr info | findstr "at32uc3c2512c" >nul
if %errorlevel% GTR 0 goto no_chain

rem call :Decode_Err_Code %Errorlevel%

echo.
echo Записываем файл %1 в флэш память контроллера
atprogram -i jtag -d at32uc3c2512c -xr chiperase program -f %1 verify -f %1

call :Decode_Err_Code %errorlevel%

rem echo Читаем bin файл обратно 
rem atprogram -i jtag -d at32uc3c2512c -xr read -fl --format bin -f qqq.bin
rem 
rem call :Decode_Err_Code %errorlevel%

:get_sn
rem Проверяем нужно ли записывать заводской номер (передается вторым параметром)
if '%2'=='' (
  echo.
  goto ex
  echo Заводской номер оставляем по умолчаню
)
set SN=%2
rem Формируем заводской номер:
rem - год выпуска (передается третьим параметром)
set y=%DATE: =0%
if not '%3'=='' set y=10%3
rem - если не введен с командной строки - берем последние две цифры года
set /a Year=1%y:~-2%-100
rem - получаем хвост заводского номера (2 цифры года + 4 цифры номера)
set /a SN_Str=Year*10000+SN+1000000
set SN_Str=%SN_Str:~-6%
rem - начало заводского номера
set Header=7710
rem - прицепляем к началу заводского номера его хвост
set SN_Str=%Header%%SN_Str%
rem echo Заводской номер %SN_Str%

echo.
echo Формируем hex строку заводского номера %SN_Str%
rem Вызываем процедуру определения длины строки
call :strlen %SN_Str% len 
rem echo Длина строки %SN_Str% составляет %len% символов
rem В цикле от первого до последнего символа строки переводим их в hex код
set /a lastchar=len-1
set SN_Hex=
for /L %%i in (0,1,%lastchar%) do (
  set d=!SN_Str:~%%i,1!
  call :char2hex !d! c
  set SN_Hex=!SN_Hex!!c!
)
rem echo Заводской номер в hex виде %SN_Hex%

echo.
echo Записываем заводской номер %SN_Str% в контроллер по адресу %SN_Addr%
set SN_Addr=0x00000009
atprogram -i jtag -d at32uc3c2512c -xr write -fl -o %SN_Addr% --values %SN_Hex% -v

call :Decode_Err_Code %errorlevel%

goto ex



:Decode_Err_Code
rem Процедура декодирования кода, возвращаемого программой atprogram
rem Получены вызовом программы с командой: atprogram exitcodes
  rem if '%1'=='0'  echo Success 						&echo The program executed with no errors 											&exit /b
  if '%1'=='0'  exit /b
  echo.
  echo ОШИБКА^^! ErrorLevel=%1
  if '%1'=='1'  echo Unexpected Error 				&echo A run time error that was not anticipated 									&exit /b
  if '%1'=='2'  echo User Interrupt Error			&echo A user interrupted the program 												&exit /b
  if '%1'=='10' echo Command Error 					&echo Exception which indicates that a command has failed for some internal reason	&exit /b
  if '%1'=='11' echo Command Argument Error 		&echo Raised when there are error in the arguments passed to the command 			&exit /b
  if '%1'=='12' echo Missing Command Error			&echo An error which occurs if there is no command									&exit /b
  if '%1'=='13' echo Command Parser Error			&echo Error when parsing command line arguments										&exit /b
  if '%1'=='14' echo Tool Error						&echo Exception raised when there is an error with the setup or use of a tool		&exit /b
  if '%1'=='15' echo Resource Error					&echo Exception raised when there is an error in creating or serving a resource		&exit /b
  if '%1'=='16' echo Tcf Error						&echo A TCF command returned an error												&exit /b
  if '%1'=='17' echo Timeout Error					&echo Error because of an timeout													&exit /b
  if '%1'=='18' echo Missing Or Wrong Input Error	&echo An error caused by incomplete information specified by user					&exit /b
  if '%1'=='19' echo Old Fw Exception				&echo Firmware must be upgraded														&exit /b
  if '%1'=='20' echo Backend Creation Error			&echo Exception raised when there is an error in creating or serving a resource		&exit /b
  if '%1'=='21' echo Options Parse Error			&echo Error in parsing an option													&exit /b
  if '%1'=='22' echo Json Parse Error				&echo Exception which can be thrown if a TCF response could not be parsed			&exit /b
  if '%1'=='23' echo Verify Error					&echo An error given when failing to verify memory content							&exit /b
  echo Неизвестная ошибка при вызове программы atprogram. Errorlevel=%1
exit /b

:char2hex char hex
rem char [in]  - символ в диапазоне от 32 до 126
rem hex  [out] - hex представление символа char
  set %2=00
  for /L %%i in (32, 1, 126) do (
    cmd /c exit /b %%i
    set Chr=^!=ExitCodeAscii!
    if [^!Chr!] EQU [^%1] (
	  set %2=!=ExitCode:~-2!
	  exit /b
	)
  )
exit /b

:strlen
rem string [in]  - строка
rem len    [out] - длина строки
  set /a %2 =0
  set var=%~1
  :startlencount
    if not defined var exit /b
    set var=%var:~1%
    set /a %2+=1
    goto startlencount 
exit /b 

:msg
  echo.
  echo Командный файл записи микрокода в контроллер блока
  echo Использование: %~nx0 filename [num] [year]
  echo     filename - имя файла микрокода в формате elf, bin, hex или ihex
  echo     num  - заводской номер от 0 до 9999. Если не введен, то не перезаписывается
  echo     year - год выпуска 2 или 4 цифры. Если не введен - текущий год с часов компьютера
  goto ex

:no_ice
  echo.
  echo ОШИБКА. Программатор не найден.
  goto ex

:no_vcc
  echo.
  echo ОШИБКА. Питание контроллера не включено.
  goto ex
  
:no_chain
  echo.
  echo ОШИБКА. Контроллер в JTAG цепочке не найден.
  goto ex

:ex

endlocal

 

 

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


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

1 hour ago, _4afc_ said:

Можно ли так слинковать исходник, чтобы секция содержащая только номер изделия получилась в конце файла?

Чтобы потом менять эти значения внешней программой?

Можно.

В скрипт линкера после описания всех секций относящихся к FLASH добавьте еще одну секцию

.text_ser :
  {
  	. = ALIGN(4);
  	_ser_num = .;
  	KEEP(*(.ser_num))           
    KEEP(*(.ser_num*))
  } >FLASH

 

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


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

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

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

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

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

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

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

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

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

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