Keil ULink2 и 1887ВЕ3Т
Модераторы: ea, Alis, pip, gurzzza, _sva_
Keil ULink2 и 1887ВЕ3Т
Имя некоторый опыт работы с 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 года, пришли к выводу: нужно нормально отлаживаться и быстро прошиваться. И об этом следует поговорить.
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 года, пришли к выводу: нужно нормально отлаживаться и быстро прошиваться. И об этом следует поговорить.
Keil ULink2 и 1887ВЕ3Т
Проблему с «хитрого JMPа» на платформах без внешней памяти можно решить достаточно просто:
Первыми командами выполняемыми процессором (до main(), в startup):
Как это работает?
Когда процессор стартует, то проверяется состояние системы OCDS (по регистру DBGSR). Если она отключена, в нашем случае ULink2 не подключен (нет сигнала BRKIN), то продолжаем выполнение основной программы. Если подключён и выбран не пользовательский режим отладки (см. стр. 118 КФДЛ.431295.029ТО) переходим на «хитрый JMP» (0FA40H) - FlashOS.
Первыми командами выполняемыми процессором (до 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 раз.
Keil ULink2 и 1887ВЕ3Т
Задача адаптера КФДЛ.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)на
Но после этого все другие устройства XC16x совместимые работать не будут.
Кстати говоря ADR_BOOTSTART это и есть адрес того самого «хитрого JMP».
2. В процессе работы FlashOX вызывает так называемый «flash algorithm». В случае ВЕ3Т нам рекомендуют OnChipFlashKron00 с которым есть две существенная проблемы:
- если программа превышает первые 32 кбайт Flash-памяти, то при попытке её стереть возникает ошибка. Возможно это вызвано строкой в определении стираемых блоков структуры «FlashDevice» (файл FlashDev.C проекта OnChipFlashKron00);
- файл OnChipFlashKron00.FLX с реализаций алгоритма программирования ВЕ3Т работает, но если попытаться пересобрать проект OnChipFlashKron00 не внося в него изменений, то работать он перестанет: будет выдавать ошибки проверки памяти, причём по адресам кратным 128 байтам.
Когда мы пытаемся загрузить память то происходит следующее:
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
Кстати говоря ADR_BOOTSTART это и есть адрес того самого «хитрого JMP».
2. В процессе работы FlashOX вызывает так называемый «flash algorithm». В случае ВЕ3Т нам рекомендуют OnChipFlashKron00 с которым есть две существенная проблемы:
- если программа превышает первые 32 кбайт Flash-памяти, то при попытке её стереть возникает ошибка. Возможно это вызвано строкой
Код: Выделить всё
0x12000, 0x006000,
- файл OnChipFlashKron00.FLX с реализаций алгоритма программирования ВЕ3Т работает, но если попытаться пересобрать проект OnChipFlashKron00 не внося в него изменений, то работать он перестанет: будет выдавать ошибки проверки памяти, причём по адресам кратным 128 байтам.
Последний раз редактировалось VNK 22 июл 2012, 22:26, всего редактировалось 1 раз.
Re: Keil ULink2 и 1887ВЕ3Т
Таким образом, если соблюсти следующие условия, то можно прошивать ВЕ3Т и вести полноценную внутрисхемную JTAG-отладку:
1) Подключён эмулятор Keil ULink2 и адаптер КФДЛ.301411.214;
2) Изменена FlashOX (как указана выше);
3) Выбран алгоритм OnChipFlashKron00.FLX (не пересобранный);
4) Ранее записана программа с указанными выше командами;
5) Размер программы менее 32 кбайт.
Нерешённые проблемы:
1) После вызова команды Download, программа автоматически не запускается;
2) Если программа более 32 кбайт, то стирание вызывает ошибки;
3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
1) Подключён эмулятор Keil ULink2 и адаптер КФДЛ.301411.214;
2) Изменена FlashOX (как указана выше);
3) Выбран алгоритм OnChipFlashKron00.FLX (не пересобранный);
4) Ранее записана программа с указанными выше командами;
5) Размер программы менее 32 кбайт.
Нерешённые проблемы:
1) После вызова команды Download, программа автоматически не запускается;
2) Если программа более 32 кбайт, то стирание вызывает ошибки;
3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
Re: Keil ULink2 и 1887ВЕ3Т
Жду мнений и предложений по решению указанных проблем
- Marketing
- Супермодератор
- Сообщения: 213
- Зарегистрирован: 11 ноя 2009, 14:27
- Предприятие: ОАО "НИИЭТ"
- Откуда: Воронеж
- Контактная информация:
Re: Keil ULink2 и 1887ВЕ3Т
Здравствуйте, VNK!
Отдельно благодарим за решение проблемы "хитрого JMPa" на платформах без внешней памяти. Решение достаточно простое и изящное, будем рекомендовать использовать данный подход нашим пользователям.
В файле FlashOS.A66 мы заменили строки адресов, скомпилировали проект и предоставили пользователям только файл FlashOX.BOT, чтобы не перегружать их дополнительной информацией. Алгоритм настройки среды KEIL и так получился довольно сложным, поэтому многие аспекты этого процесса дополнительно не описаны, но если есть желание более подробно разобрать вопрос связки отладочной системы микроконтроллера и среды KEIL, то пожалуйста задавайте вопросы, будем рады помочь.
К тому же, рекомендуем установить две среды KEIL на одном компьютере в разных директориях, одну среду можно настроить под 1887ВЕ3Т, а вторую использовать с другими микроконтроллерами.
Flash Writer - утилита для работы с внутренней Flash-памятью микроконтроллера 1887ВЕ3Т, не более того, т.е. отладка программ с помощью этой утилиты и не предполагалась, так что да, "о нормальной JTAG-отладке можно забыть".VNK писал(а):- о нормальной JTAG-отладке можно забыть!!!!;
Отдельно благодарим за решение проблемы "хитрого JMPa" на платформах без внешней памяти. Решение достаточно простое и изящное, будем рекомендовать использовать данный подход нашим пользователям.
Действительно, всё не так просто. Функциональным аналогом 1887ВЕ3Т является микросхема SAK-XC167CI-32F40F фирмы Infineon Technologies, поэтому если ULink2 сказать что ВЕ3Т это C166/ST10, то такой подход не только не решит текущие проблемы, но и создаст новые. Кроме того, адаптер КФДЛ.301411.214 преобразует некоторые функции, которые использует среда KEIL, но реализация их не предусмотрена в нашей версии ядра отладчика. В частности, использование "хитрого JMPa" оправдано отсутствием аппаратной реализации старта микроконтроллера с нужного адреса.VNK писал(а):Задача адаптера КФДЛ.301411.214 обмануть Keil ULink2 сказав ему, что он подключён к Infineon XC16x, а не к 1887ВЕ3Т. Но!!!!!! 1887ВЕ3Т это не Infineon XC16x!!!!! И поэтому не всё так просто.
В файле FlashOS.A66 мы заменили строки адресов, скомпилировали проект и предоставили пользователям только файл FlashOX.BOT, чтобы не перегружать их дополнительной информацией. Алгоритм настройки среды KEIL и так получился довольно сложным, поэтому многие аспекты этого процесса дополнительно не описаны, но если есть желание более подробно разобрать вопрос связки отладочной системы микроконтроллера и среды KEIL, то пожалуйста задавайте вопросы, будем рады помочь.
К тому же, рекомендуем установить две среды KEIL на одном компьютере в разных директориях, одну среду можно настроить под 1887ВЕ3Т, а вторую использовать с другими микроконтроллерами.
- Marketing
- Супермодератор
- Сообщения: 213
- Зарегистрирован: 11 ноя 2009, 14:27
- Предприятие: ОАО "НИИЭТ"
- Откуда: Воронеж
- Контактная информация:
Re: Keil ULink2 и 1887ВЕ3Т
Теперь переходим непосредственно к нерешенным проблемам.VNK писал(а):Нерешённые проблемы:
1) После вызова команды Download, программа автоматически не запускается;
Итак, первая проблема: после вызова команды Download программа автоматически не запускается. После прошивки внутренней памяти программой из среды KEIL, через JTAG приходит команда RESET микроконтроллеру, который перезагружается и начинает выполнять код. В случае использования внешнего «хитрого JMPa», Сигнал на выводе EA соответствует выбранной внешней памяти, собственно из нее и происходит выполнение команд, а именно переход на адрес 0xFA40. В случае использования Вашего кода:
- Пример кода | Показать
Вторая и третья нерешенные проблемы взаимосвязаны.VNK писал(а):2) Если программа более 32 кбайт, то стирание вызывает ошибки;
3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
Для решения второй проблемы советуем проверить настройки проекта. Рекомендуем использовать собственный файл опций линкера:
- См. скриншот | Показать
- Пример настроек | Показать
По поводу третьей проблемы можем ответить, что данное заявление абсурдно. Скорее всего опять дело в настройке среды KEIL, возможно есть различия в версиях ПО.VNK писал(а):3) Распространяемый разработчиком код OnChipFlashKron00 после сборки не работает.
Попробуйте установить чистую среду KEIL, ничего в ней не меняйте, а просто скомпилируйте код OnChipFlashKron00, должно всё получиться.
По поводу строки:
Код: Выделить всё
0x12000, 0x006000,
Код: Выделить всё
0x2000, 0x006000, // Erase Block Size 8kB
Re: Keil ULink2 и 1887ВЕ3Т
Предложение по поводу
Дело в том что FlashOS содежит простой код запуска программы на выполнение
т.е. выполняет программный сброс контроллера. А в ВЕ3Т есть замечательный флаг SWR регистра WDTCON указывающий на факт программного сброса. Так вот, добавляем в первые инструкции программы условие вида: «ЕСЛИ OCDS задействован И SWR установлен, ТО переходим к основной программе, ИНАЧЕ «хитрый JMP».
Но всё это не работает, так как Keil попросту не вызывает команду FL_RUN, а просто подаёт сброс (RSTIN) при установленном в «лог. 0» сигнале BRKIN.
весьма интересно. Но мы пробовали сделать чуть хитрее:SEM писал(а):Возможное решение: модификация файла FlashOS.A66 таким образом, чтобы по окончании процесса записи происходил еще один «хитрый JMP», но уже на адрес 0x0000 внутренней памяти микроконтроллера.
Дело в том что FlashOS содежит простой код запуска программы на выполнение
Код: Выделить всё
. . .
;--- FL_RUN Command: Reset CPU
SRST ; Software Reset
. . .
Но всё это не работает, так как Keil попросту не вызывает команду FL_RUN, а просто подаёт сброс (RSTIN) при установленном в «лог. 0» сигнале BRKIN.
Re: Keil ULink2 и 1887ВЕ3Т
По поводу эквивалентности описаний стираемых блоков структуры FlashDevice в проекте OnChipFlashKron00 в корне не согласен. Давайте разберём всё по порядку:
1) Keil начинает прошивку ВЕ3Т;
2) Подаёт команду Erase (если не стирать, то редко пишет без ошибок);
3) Находит в структуре FlashDevice указатель на функцию EraseBlock, вызывает её, указывая ей каждый раз номер очередного стираемого блока;
4) Проверяет содержимое стертого блока на равенство значению valEmpty структуры FlashDevice;
5) . . .
Так в четвертом действии и возникает проблема:
Для первых трёх блоков
всё нормально. После подачи комбинации
кстати отличной от указанной в КФДЛ.431295.029ТО, особенно в нулевом бите адресов, Flash будет стерта, т.е. установлена в 0xFFFF.
Для следующего блока
это не сработает, т.к. стёрты будут (установлены в 0xFFFF) только первые 8 кбайт памяти (FLASH-память), а остальные 64 кбайта, будут в непредсказуемом состоянии. Результат – ОШИБКА СТИРАНИЯ FLASH-ПАМЯТИ.
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;
Для следующего блока
Код: Выделить всё
. . .
0x12000, 0x006000,
. . .
Re: Keil ULink2 и 1887ВЕ3Т
По поводу
Пробовали на разных Keilах, эффект одинаков – НЕ РАБОТАЕТ. Попробуйте сами скомпилировать, может у Вас заработает. Если да, то исправьте «0x12000, 0x006000» на «0x02000, 0x006000» и выложите в Интернет.SEM писал(а):...
По поводу третьей проблемы можем ответить, что данное заявление абсурдно. Скорее всего опять дело в настройке среды KEIL, возможно есть различия в версиях ПО.