Keil ULink2 и 1887ВЕ3Т

Модераторы: ea, Alis, pip, gurzzza, _sva_

VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Имя некоторый опыт работы с 1887ВЕ3Т могу рассказать о тонкостях его прошивки:
1. Первоначально к процессору нами был куплен эмулятор Keil ULink2 и адаптер КФДЛ.301411.214. Но ничего хорошего из этого не получилось. О необходимость наличия внешней памяти с «хитрым JMPом» на этапе разработки схемы мы не догадывались. Переделывать схему посчитали не целесообразным, к тому же достаточно много проблем будет с загрузкой «хитрого JMPа» в память при серийном производстве наших изделий.
2. Решили применять Flash Writter с LPT-кабелем ценой 100руб (1 комплект Keil ULink2 + 1 адаптер КФДЛ.301411.214 = 12 000 руб + 20 000 руб = 32 000 руб). Поначалу всё шло хорошо. Первые версии Flash Writter не умели писать нечётное число байт памяти. Если во вкладке Output настроек проекта выбрать формат HEX-файла HEX-386(H167), то при достаточно большом объёме программы Flash Writter будет писать в «неписуемые» области и т.п. При всём при этом следует выразить уважение разработчикам процессора: съездили к ним в гости на пару дней, и большая часть проблем была решена.

При всём при этом с Flash Writter есть ряд «вредных» недостатков:
- о нормальной JTAG-отладке можно забыть!!!!;
- со штатными драйверами в Win7 не работает;
- встроенный алгоритм сортировки памяти крайне не эффективен: длительность записи программы пропорциональна квадрату её размера;
- если Вы только включили компьютер и запустили Flash Writter, то в 99,9% случаев процессор с первого раза не прошьёте. Его нужно «разогревать» многократными попытками записи (раз 100). Как только запись пойдёт, то можно наслаждаться процессом до ближайшей перезагрузки. В Linux такая проблема отсутствует;
- со временем, когда код вырастает до 100 кБайт и более, начинает ощущаться медленность процесса. Так программа размером 100 кБайт загружается в Win7 примерно 5…6 минут, в Linux – 2…3 минуты;
- на отдельных экземплярах плат процессор отказывается шиться даже при длине кабеля 1 м. Спасает конденсатор 220 пф вблизи процессора от линии RST к общему.

Получив изрядный «опыт» в течении 1 года, пришли к выводу: нужно нормально отлаживаться и быстро прошиваться. И об этом следует поговорить.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Проблему с «хитрого JMPа» на платформах без внешней памяти можно решить достаточно просто:
Первыми командами выполняемыми процессором (до main(), в startup):

Код: Выделить всё

?C_STARTUP_CODE SECTION CODE 'ICODE'
;------------------------------------------------------------------------------
?C_RESET        PROC INTERRUPT RESET = 0
?C_STARTUP:     LABEL   Model
                extr    #1
                mov     R4,DBGSR
                jnb     R4.0,RUN_MAIN 
                mov     R5,R4
                and     R5,#000C0H      
                jmpr    CC_NZ,RUN_MAIN 
                jmpa+   CC_UC,0FA40H
RUN_MAIN:
                
                ... ; код startup.a66

?C_RESET        ENDP
?C_STARTUP_CODE ENDS
Как это работает?
Когда процессор стартует, то проверяется состояние системы OCDS (по регистру DBGSR). Если она отключена, в нашем случае ULink2 не подключен (нет сигнала BRKIN), то продолжаем выполнение основной программы. Если подключён и выбран не пользовательский режим отладки (см. стр. 118 КФДЛ.431295.029ТО) переходим на «хитрый JMP» (0FA40H) - FlashOS.
Последний раз редактировалось VNK 22 июл 2012, 22:26, всего редактировалось 1 раз.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Задача адаптера КФДЛ.301411.214 обмануть Keil ULink2 сказав ему, что он подключён к Infineon XC16x, а не к 1887ВЕ3Т. Но!!!!!! 1887ВЕ3Т это не Infineon XC16x!!!!! И поэтому не всё так просто.
Когда мы пытаемся загрузить память то происходит следующее:
1. ULink2 включает OCDS и пишит в ОЗУ ВЕ3Т FlashOS – небольшая утилита работы с FLASH-памятью процессора. Исходный код лежит в папке …\Keil\C166\Flash. Так как ULink2 видит XC16x, то он загружает FlashOX.BOT начиная с адреса 0E00000H, но такого адреса в ВЕ3Т нет. Проблема бы решилась, если ULink2 сказать что ВЕ3Т это C166/ST10, но это нужно перепрашивать адаптер КФДЛ.301411.214. Проблема решается заменой строк (файл FlashOS.A66)

Код: Выделить всё

; Addresses for XC16x/Super10 Devices
ADR_BOOTSTART	 EQU	0E00000H
ADR_TIMEOUT	   EQU	0E003B0H
ADR_BUFFER	    EQU	0FC00H
на

Код: Выделить всё

; Addresses for NIIET 1887 Devices
ADR_BOOTSTART	 EQU	0FA40H
ADR_TIMEOUT	   EQU	0FBC0H
ADR_BUFFER	    EQU	0FC00H
Но после этого все другие устройства XC16x совместимые работать не будут.
Кстати говоря ADR_BOOTSTART это и есть адрес того самого «хитрого JMP».
2. В процессе работы FlashOX вызывает так называемый «flash algorithm». В случае ВЕ3Т нам рекомендуют OnChipFlashKron00 с которым есть две существенная проблемы:
- если программа превышает первые 32 кбайт Flash-памяти, то при попытке её стереть возникает ошибка. Возможно это вызвано строкой

Код: Выделить всё

0x12000, 0x006000,
в определении стираемых блоков структуры «FlashDevice» (файл FlashDev.C проекта OnChipFlashKron00);
- файл OnChipFlashKron00.FLX с реализаций алгоритма программирования ВЕ3Т работает, но если попытаться пересобрать проект OnChipFlashKron00 не внося в него изменений, то работать он перестанет: будет выдавать ошибки проверки памяти, причём по адресам кратным 128 байтам.
Последний раз редактировалось VNK 22 июл 2012, 22:26, всего редактировалось 1 раз.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Таким образом, если соблюсти следующие условия, то можно прошивать ВЕ3Т и вести полноценную внутрисхемную JTAG-отладку:
1) Подключён эмулятор Keil ULink2 и адаптер КФДЛ.301411.214;
2) Изменена FlashOX (как указана выше);
3) Выбран алгоритм OnChipFlashKron00.FLX (не пересобранный);
4) Ранее записана программа с указанными выше командами;
5) Размер программы менее 32 кбайт.

Нерешённые проблемы:
1) После вызова команды Download, программа автоматически не запускается;
2) Если программа более 32 кбайт, то стирание вызывает ошибки;
3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Жду мнений и предложений по решению указанных проблем
Аватара пользователя
Marketing
Супермодератор
Сообщения: 213
Зарегистрирован: 11 ноя 2009, 14:27
Предприятие: ОАО "НИИЭТ"
Откуда: Воронеж
Контактная информация:

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение Marketing »

Здравствуйте, VNK!
VNK писал(а):- о нормальной JTAG-отладке можно забыть!!!!;
Flash Writer - утилита для работы с внутренней Flash-памятью микроконтроллера 1887ВЕ3Т, не более того, т.е. отладка программ с помощью этой утилиты и не предполагалась, так что да, "о нормальной JTAG-отладке можно забыть".

Отдельно благодарим за решение проблемы "хитрого JMPa" на платформах без внешней памяти. Решение достаточно простое и изящное, будем рекомендовать использовать данный подход нашим пользователям.
VNK писал(а):Задача адаптера КФДЛ.301411.214 обмануть Keil ULink2 сказав ему, что он подключён к Infineon XC16x, а не к 1887ВЕ3Т. Но!!!!!! 1887ВЕ3Т это не Infineon XC16x!!!!! И поэтому не всё так просто.
Действительно, всё не так просто. Функциональным аналогом 1887ВЕ3Т является микросхема SAK-XC167CI-32F40F фирмы Infineon Technologies, поэтому если ULink2 сказать что ВЕ3Т это C166/ST10, то такой подход не только не решит текущие проблемы, но и создаст новые. Кроме того, адаптер КФДЛ.301411.214 преобразует некоторые функции, которые использует среда KEIL, но реализация их не предусмотрена в нашей версии ядра отладчика. В частности, использование "хитрого JMPa" оправдано отсутствием аппаратной реализации старта микроконтроллера с нужного адреса.
В файле FlashOS.A66 мы заменили строки адресов, скомпилировали проект и предоставили пользователям только файл FlashOX.BOT, чтобы не перегружать их дополнительной информацией. Алгоритм настройки среды KEIL и так получился довольно сложным, поэтому многие аспекты этого процесса дополнительно не описаны, но если есть желание более подробно разобрать вопрос связки отладочной системы микроконтроллера и среды KEIL, то пожалуйста задавайте вопросы, будем рады помочь.
К тому же, рекомендуем установить две среды KEIL на одном компьютере в разных директориях, одну среду можно настроить под 1887ВЕ3Т, а вторую использовать с другими микроконтроллерами.
Аватара пользователя
Marketing
Супермодератор
Сообщения: 213
Зарегистрирован: 11 ноя 2009, 14:27
Предприятие: ОАО "НИИЭТ"
Откуда: Воронеж
Контактная информация:

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение Marketing »

VNK писал(а):Нерешённые проблемы:
1) После вызова команды Download, программа автоматически не запускается;
Теперь переходим непосредственно к нерешенным проблемам.

Итак, первая проблема: после вызова команды Download программа автоматически не запускается. После прошивки внутренней памяти программой из среды KEIL, через JTAG приходит команда RESET микроконтроллеру, который перезагружается и начинает выполнять код. В случае использования внешнего «хитрого JMPa», Сигнал на выводе EA соответствует выбранной внешней памяти, собственно из нее и происходит выполнение команд, а именно переход на адрес 0xFA40. В случае использования Вашего кода:
Пример кода | Показать

Код: Выделить всё

?C_STARTUP_CODE SECTION CODE 'ICODE'
;------------------------------------------------------------------------------
?C_RESET        PROC INTERRUPT RESET = 0
?C_STARTUP:     LABEL   Model
                extr    #1
                mov     R4,DBGSR
                jnb     R4.0,RUN_MAIN 
                mov     R5,R4
                and     R5,#000C0H      
                jmpr    CC_NZ,RUN_MAIN 
                jmpa+   CC_UC,0FA40H
RUN_MAIN:
                
                ... ; код startup.a66

?C_RESET        ENDP
?C_STARTUP_CODE ENDS
ULink2 по прежнему подключен, выбран пользовательский режим отладки, а значит, снова переход на «хитрый JMP». Возможное решение: модификация файла FlashOS.A66 таким образом, чтобы по окончании процесса записи происходил еще один «хитрый JMP», но уже на адрес 0x0000 внутренней памяти микроконтроллера.
VNK писал(а):2) Если программа более 32 кбайт, то стирание вызывает ошибки;
3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
Вторая и третья нерешенные проблемы взаимосвязаны.
Для решения второй проблемы советуем проверить настройки проекта. Рекомендуем использовать собственный файл опций линкера:
См. скриншот | Показать
Изображение
В самом файле уже непосредственно прописать настройки для различных классов памяти, например:
Пример настроек | Показать

Код: Выделить всё

IXREF 
CLASSES (ICODE (0x0-0x7FFF), NCODE (0x20000-0x2FFFF), 
FCONST (0x0-0x7FFF, 0x18000-0x4FFFF), HCONST (0x0-0x7FFF, 0x18000-0x4FFFF), 
XCONST (0x0-0x7FFF, 0x18000-0x4FFFF), NCONST (0x4000-0x7FFF), 
NDATA (0x050000-0x051FFF), NDATA0 (0x050000-0x051FFF), 
SDATA (0xF200-0xFDFF), SDATA0 (0xF200-0xFDFF), 
IDATA (0xF200-0xFDFF), IDATA0 (0xF200-0xFDFF), 
FDATA (0xF200-0xFDFF), FDATA0 (0xF200-0xFDFF), 
HDATA (0xF200-0xFDFF), HDATA0 (0xF200-0xFDFF), 
XDATA (0xF200-0xFDFF), XDATA0 (0xF200-0xFDFF)) 
 CINITTAB (0x18000-0x4FFFF)
Также в проекте стоит проследить расположение программы строго заданным областям, т.к. данная ошибка очень похожа на ситуацию когда линкер располагает какие-то части программы за пределами допустимых областей памяти. Хотим обратить внимание, что сами неоднократно сталкивались с различными необъяснимыми ситуациями в среде KEIL, и здесь мы уже не можем оказать Вам помощь. Можем лишь посоветовать в данной ситуации взять заведомо рабочий проект и в него уже скопировать необходимый код, подобное действие часто помогало нам.
VNK писал(а):3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
По поводу третьей проблемы можем ответить, что данное заявление абсурдно. Скорее всего опять дело в настройке среды KEIL, возможно есть различия в версиях ПО.
Попробуйте установить чистую среду KEIL, ничего в ней не меняйте, а просто скомпилируйте код OnChipFlashKron00, должно всё получиться.
По поводу строки:

Код: Выделить всё

0x12000, 0x006000,
в определении стираемых блоков структуры «FlashDevice» (файл FlashDev.C проекта OnChipFlashKron00) можем ответить, что данный размер блока был указан с целью облегчения представления структуры Flash-памяти как одного целого блока. Ничего существенного не поменяется если вместо этой строки написать:

Код: Выделить всё

0x2000, 0x006000,  // Erase Block Size 8kB
Пока код программы расположен в пределах указанной памяти всё должно работать корректно. Ошибка возможна, если нарушены границы расположения блоков кода в памяти, а это зависит от линкера.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

Предложение по поводу
SEM писал(а):Возможное решение: модификация файла FlashOS.A66 таким образом, чтобы по окончании процесса записи происходил еще один «хитрый JMP», но уже на адрес 0x0000 внутренней памяти микроконтроллера.
весьма интересно. Но мы пробовали сделать чуть хитрее:
Дело в том что FlashOS содежит простой код запуска программы на выполнение

Код: Выделить всё

         . . .

;--- FL_RUN Command: Reset CPU
      SRST      ; Software Reset

         . . .
т.е. выполняет программный сброс контроллера. А в ВЕ3Т есть замечательный флаг SWR регистра WDTCON указывающий на факт программного сброса. Так вот, добавляем в первые инструкции программы условие вида: «ЕСЛИ OCDS задействован И SWR установлен, ТО переходим к основной программе, ИНАЧЕ «хитрый JMP».
Но всё это не работает, так как Keil попросту не вызывает команду FL_RUN, а просто подаёт сброс (RSTIN) при установленном в «лог. 0» сигнале BRKIN.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

По поводу эквивалентности описаний стираемых блоков структуры FlashDevice в проекте OnChipFlashKron00 в корне не согласен. Давайте разберём всё по порядку:
1) Keil начинает прошивку ВЕ3Т;
2) Подаёт команду Erase (если не стирать, то редко пишет без ошибок);
3) Находит в структуре FlashDevice указатель на функцию EraseBlock, вызывает её, указывая ей каждый раз номер очередного стираемого блока;
4) Проверяет содержимое стертого блока на равенство значению valEmpty структуры FlashDevice;
5) . . .
Так в четвертом действии и возникает проблема:
Для первых трёх блоков

Код: Выделить всё

   . . .  
   0x2000,  0x000000,
   0x2000,  0x002000,
   0x2000,  0x004000,
   . . .
всё нормально. После подачи комбинации

Код: Выделить всё

  HVAR(unsigned short, 0x080554) = 0xAAAA; 
  HVAR(unsigned short, 0x080AAA) = 0x55;    
  HVAR(unsigned short, 0x080554) = 0x8080; 
  HVAR(unsigned short, 0x080554) = 0xAAAA; 
  HVAR(unsigned short, 0x080AAA) = 0x55;    
  HVAR(unsigned short, adr) = 0x50;
кстати отличной от указанной в КФДЛ.431295.029ТО, особенно в нулевом бите адресов, Flash будет стерта, т.е. установлена в 0xFFFF.
Для следующего блока

Код: Выделить всё

   . . .   
   0x12000, 0x006000,
   . . .
это не сработает, т.к. стёрты будут (установлены в 0xFFFF) только первые 8 кбайт памяти (FLASH-память), а остальные 64 кбайта, будут в непредсказуемом состоянии. Результат – ОШИБКА СТИРАНИЯ FLASH-ПАМЯТИ.
VNK
Сообщения: 20
Зарегистрирован: 29 окт 2011, 13:41
Откуда: г. Краснодар

Re: Keil ULink2 и 1887ВЕ3Т

Сообщение VNK »

По поводу
SEM писал(а):...
По поводу третьей проблемы можем ответить, что данное заявление абсурдно. Скорее всего опять дело в настройке среды KEIL, возможно есть различия в версиях ПО.
Пробовали на разных Keilах, эффект одинаков – НЕ РАБОТАЕТ. Попробуйте сами скомпилировать, может у Вас заработает. Если да, то исправьте «0x12000, 0x006000» на «0x02000, 0x006000» и выложите в Интернет.
Закрыто

Вернуться в «16-разрядные RISC микроконтроллеры»