1887ВЕ3Т

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

Denis
Сообщения: 32
Зарегистрирован: 16 май 2013, 22:01

Re: 1887ВЕ3Т

Сообщение Denis »

yrk писал(а):Denis, спасибо за ответ. Настройку делителя всегда выполняю с помощью внешней конфигурации (резисторов), а добавление чего-либо в код не влияет, так как код вообще не выбирался из памяти. Конечно, если допустить какую-то магию...)))
Придется допустить магию. В свое время я тоже ставил EINIT первой командой и смотрел RSTOUT. Тем не менее вышеприведенный код помог. По схемотехнике мы не меняли ничего (у нас стоит супервизор).
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Добрый день, подскажите, можно ли настроить CAN модуль таким образом, чтобы в одну область сообщения попадали сообщения с разными ID, а затем внутри прерывания по-приёму уже разделять их?

Спасибо.
tvs
Сообщения: 9
Зарегистрирован: 27 апр 2016, 09:24

Re: 1887ВЕ3Т

Сообщение tvs »

Добрый день, подскажите, можно ли настроить CAN модуль таким образом, чтобы в одну область сообщения попадали сообщения с разными ID, а затем внутри прерывания по-приёму уже разделять их?
1887ВЕ3Т имеет 32 области сообщений в модуле CAN. Каждая область сообщений может быть настроена на прием нескольких сообщений (с разными ID) по маске-идентификатору (регистр MOAMRn).
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Да, уже разобрался, спасибо! Проблема была в том, что я упустил тот факт, что при 11-битном ID в регистрах MOAMR/AR маска для фильтра задается также со смещением в 2 бита.
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Добрый день!

Подскажите, можно ли каким-либо образом вынести таблицу векторов прерываний в ОЗУ? Хочу сделать возможность перепрошивки МК через CAN шину, но не могу придумать, каким образом перенаправить вектор прерывания по приему/передаче CAN сообщения по указанному адресу в ОЗУ.

Спасибо!
Denis
Сообщения: 32
Зарегистрирован: 16 май 2013, 22:01

Re: 1887ВЕ3Т

Сообщение Denis »

bentech писал(а):Добрый день!

Подскажите, можно ли каким-либо образом вынести таблицу векторов прерываний в ОЗУ?
Спасибо!
Есть два пути:
1. C помощью бита в SYSCON отображаешь сегмент ПЗУ на другой адрес. Теперь, если у тебя есть снаружи микросхема ОЗУ, то вектора окажутся в ней.
или
2. С помощью ассемблера и команд jmps перенаправляешь каждый вектор в ОЗУ. Объясняешь кейлу расположение таблицы с помощью директивы VECTAB.

bentech писал(а):Добрый день!
Хочу сделать возможность перепрошивки МК через CAN шину, но не могу придумать, каким образом перенаправить вектор прерывания по приему/передаче CAN сообщения по указанному адресу в ОЗУ.
Спасибо!
Не очень ясно причем тут вектора. Поподробнее.
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Denis писал(а):Не очень ясно причем тут вектора. Поподробнее.
Уже реализовал, но немного по своему. Собственно, для чего же вектора. Приём данных у загрузчика по CAN шине вызывает прерывание конкретной линии прерываний CAN. По этому адресу лежит код обработки, где команды и данные разбираются, согласно разработанному протоколу, и происходит перепрошивка ПЗУ микроконтроллера. Проблема была в том, что для того, чтобы прошить флеш нужно её сначала стереть. А стереть можно либо кусок, либо всё. Соответственно, стирая самый первый сектор/блок, мы благополучно стираем как адрес, по которому мы прыгаем в прерывании, так и блок кода, отвечающий за программирование через uLink и получаем из устройства кирпич, куда надо лезть с хардварным адаптером и заного заливать туда HEX. Вот у меня и была идея, перенести таблицу в ОЗУ, чтобы спокойно стирать флеш без каких-либо проблем.

В итоге реализовал загрузчик, который сидит в последнем блоке FLASH и сам стирает и прописывает в таблице прерываний нужный адрес, после чего стирает флеш, согласно входящей раскладке адресов памяти и начинает приём/запись новых данных. Из недостатков - загрузчик не перепрошьёт сам себя, если нужно внести изменение в код загрузчика, то перепрошивать устройство придется uLink-ом.
Denis
Сообщения: 32
Зарегистрирован: 16 май 2013, 22:01

Re: 1887ВЕ3Т

Сообщение Denis »

bentech писал(а):
Denis писал(а):Не очень ясно причем тут вектора. Поподробнее.
В итоге реализовал загрузчик, который сидит в последнем блоке FLASH и сам стирает и прописывает в таблице прерываний нужный адрес, после чего стирает флеш, согласно входящей раскладке адресов памяти и начинает приём/запись новых данных. Из недостатков - загрузчик не перепрошьёт сам себя, если нужно внести изменение в код загрузчика, то перепрошивать устройство придется uLink-ом.
Ясно. Обычно загрузчик тупо помещает несколько десятков байт в ОЗУ и передает на них управление, а уж байты сами решают что делать. От использования прерываний в загрузчике проще отказаться совсем. Теоретически перепрошить загрузчик в вашем случае можно и без uLink. uLink'ом нужно будет пользоваться в случае сбоя в процессе загрузки.
В общих чертах, в идеале, должно быть так:

1. Загрузчик сидит в 0-ом секторе, нулевой сектор не стирается никогда.
2. Все вектора с помощью команд jmps переправлены в ОЗУ и "боевая" программа "знает" об этом.
3. "Боевая" программа содержит контрольную сумму (КС) своего кода по определенному адресу и, возможно, список занятых секторов.
4. При старте процессора загрузчик проверяет КС и если все ОК - передает управление "боевой" программе.
5. Если КС не сошлась - инициируется процесс получения байт и передачи на них управления.
6. Если "боевая" программа в процессе работы получает определенный идентификатор - она также передает управление загрузчику (например, помещает в регистры заранее заданные магические числа и делает софт-ресет).
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Хм, столкнулся ещё с интересной проблемой.

Компилятор упорно генерирует HEX файл, в котором кидает код по адресам 0x8000 и дальше, хотя область блока FLASH памяти ограничена 0x7FFF. При этом, это не мешает ему прекрасно размещать остальную часть кода в 0x18000 и дальше, что опять таки логично. Естественно, что Keil не может прошить такой HEX.

Вот файл линковщика .lin. Не совсем понимаю, почему он лезет в 0x8000+

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

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), 

RESERVE (0x022000-0x022500),

NDATA (0x050000-0x051FFF), NDATA0 (0x050000-0x051FFF), 
SDATA (0xF600-0xFDFF), SDATA0 (0xF600-0xFDFF), 
IDATA (0xF600-0xFDFF), IDATA0 (0xF600-0xFDFF), 
FDATA (0x600000-0x603FFF), FDATA0 (0x600000-0x603FFF), 
HDATA (0x604000-0x613FFF), HDATA0 (0x604000-0x613FFF), 
XDATA (0x600000-0x67FFFF), XDATA0 (0x600000-0x67FFFF)) 

CINITTAB (0x18000-0x4FFFF)
bentech
Сообщения: 9
Зарегистрирован: 27 янв 2015, 13:31

Re: 1887ВЕ3Т

Сообщение bentech »

Ага, вроде понял. Стояла Memory Model - 'far' func, но при этом не прописан FCODE в линковщике. Странно, что кеил не ругался.
Ответить

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