Jump to content
    

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

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

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

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

 

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

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

 

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

Share this post


Link to post
Share on other sites

В составе 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

 

 

Share this post


Link to post
Share on other sites

1 hour ago, _4afc_ said:

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

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

Можно.

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...