_4afc_ 26 25 августа, 2020 Опубликовано 25 августа, 2020 · Жалоба Требуется прошить партию изделий на базе микросхемы ATSAME70 с уникальными номерами. Прошивка создана в AtmelStudio. Нужно брать прошивку из архива модифицировать номер и прошивать. Можно ли так слинковать исходник, чтобы секция содержащая только номер изделия получилась в конце файла? Чтобы потом менять эти значения внешней программой? Или если я просто увеличу исходник до 128кБ и в конце положу номер - он будет и во флеш лежать в конце 128кБ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zig 39 25 августа, 2020 Опубликовано 25 августа, 2020 · Жалоба В составе 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 25 августа, 2020 Опубликовано 25 августа, 2020 · Жалоба 1 hour ago, _4afc_ said: Можно ли так слинковать исходник, чтобы секция содержащая только номер изделия получилась в конце файла? Чтобы потом менять эти значения внешней программой? Можно. В скрипт линкера после описания всех секций относящихся к FLASH добавьте еще одну секцию .text_ser : { . = ALIGN(4); _ser_num = .; KEEP(*(.ser_num)) KEEP(*(.ser_num*)) } >FLASH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться