Если объем программы превышает 32к, то переносить память не обязательно, линкер сам должен разместить программу по адресам внутреннего ПЗУ, разбив ее на две части - одна будет размещена в сегменте 0 по адресам 00`0000h - 00`7FFFh, а оставшаяся часть во второй области ПЗУ по адресам 01`8000h - 04`FFFFh.
Если у Вас есть вопросы, пришлите их на ящик wex собака niiet точка ru
Согласен. Чтобы компоновщик выполнил эту работу, в среде должны быть прописаны все области внутреннего ПЗУ. Если конфигурация микроконтроллера сделана неудачно, то, возможно, это придется сделать вручную в одном из полей ROM (туда компоновщик разместит код и константы, объявленные как const, а в области RAM он размещает переменные).
А таблица векторов прерываний в любом случае начинается с нуля. Бит ROMS на это не влияет, этот вопрос целиком в ведении компилятора и компоновщика. Бит ROMS выполняет лишь отображение внутренней Flash в то или иное окно адресного пространства. Keil не следит за манипуляциями с этим битом. В случае, если в настройках проекта Keil указать ненулевой адрес, то по этому адресу, конечно, будет создана таблица, в нее будут занесены все истинные JMPS на обработчики прерывания. Но обработчики прерываний имеют стандартные вектора, указанные в документации (у каждой периферии свой), и эти вектора указывают на таблицу, начинающуюся с нуля. Программист в случае переноса таблицы ОБЯЗАН побеспокоится как именно программа попадет в перенесенную таблицу прерываний, потому что аппаратно переход будет выполнен на нулевую таблицу. Побеспокоиться - это значит прошить заранее в память таблицу, начинающуюся с нуля, куда будут занесены переходы на Вашу новую таблицу. Допустим, Вы разместили таблицу по адресу 0х18000, тогда по адресу 0х0 должен быть JMPS 01H, 08000H. И так далее. Такой двойной прыжок перешел по наследству из предыдущих версий Keil, когда монитор-отладчик MON166 прошивался в ПЗУ вместо того, чтобы загружаться через bootstrap. Этот монитор прописывал всю "настоящую" таблицу прерываний, размещенную с нулевого адреса. Она заполнялась переходами по адресу VECTAB + такое же смещение, за исключением векторов, которые перехватывались. VECTAB - это адрес таблицы прикладной программы. Это позволяло монитору перехватывать управление как по вектору сброса, так и по прерываниям ASC0 и NMI, и одновременно избавляло от необходимости перепрошивать монитор при изменении программы (так как компилятор изменяет лишь дополнительную таблицу и не лезет в истинную).
Но, вообще-то, я зашел на форум с иной целью. Хочу рассказать о своих впечатлениях от АЦП...
Удивительно, но и здесь есть баги, несмотря на то, что это hard-блок от фабрики. Причем баги очень солидные. Прямо диверсия какая-то. Ну, например, режимы сканирования каналов лучше не использовать, есть риск получить непредсказуемое поведение. Сделать изящный вариант с PEC не получилось... жаль. Каналы лучше переключать в "ручном" режиме в обработчике прерывания. Кстати, если кто-то использует сканирование, имейте в виду, баг проявляется случайно, и может стать причиной непонятного поведения системы. Выражается он в том, что цикл обрывается, не закончившись. Выше на форуме уже указывали на эту проблему, говорилось, что виноват бит ADWR. У меня вышло, что и без установки в 1 этого бита беда не уходит.
Дальше. В документации на странице 325 есть таблица времен преобразования. Они почти правильные. Ну то что в последнем столбце перепутаны местами две последние строки сразу понятно, это мелочь. Важнее то, что к указанному времени (это собственно время преобразования) нужно добавить время на обработку результата конечным автоматом - 12 циклов fadc. Например, на частоте fadc = 20МГц, получится не 2,4мкс (48 циклов), как указано, а 3 мкс (60 циклов). Что касается времени выборки (sample time), то, судя по всему, она все-таки есть и установлена на минимум, как если бы поле ADSTC (см. документацию Infineon) было установлено в ноль. Так что следите за выходным сопротивлением источника сигнала. На всякий случай сняли характеристики АЦП. Они успокоили: погрешности такие же, как у инфинеоновских. Кстати, непонятно откуда взят прообраз этой версии АЦП,- это и не С167, и не ХС167, есть режим двойного АЦП (еще руки не дошли проверить в самом деле есть или нет), но это и не кортекс. Так что свойства блока приходится выяснять экспериментально.
Больше всего удивил режим инжектированного преобразования. Какая это была полезная вещь в С167! Но в данной реализации именно оно и подвигло меня потратить вечер на этот пост. Я пока в процессе исследования этого феномена, и не знаю, хватит ли сил и времени дойти до конца, и, главное, хватит ли терпения у Заказчика... Или лучше сразу отказаться и от этого, пользуясь "просто АЦП". Вы думаете, что инжектированное преобразование не работает? А вот и не угадали. Работает. Смущает только два момента:
1) Если Вы не успели прочитать быстренько регистр ADC_DAT2, то есть шанс не узнать номер инжектированного канала, так как он будет перезаписан номером канала стандартного. К счастью, сам результат в поле ADRES остается достоверным! А номер канала и сами знаем, не баре.
2) При старте инжектированного преобразования по завершении преобразования будет выставлен не только флаг завершения инжектированного преобразования, но и стандартного. Так что, если Вы сами переключаете номера каналов в обработчике стандартного преобразования (см. выше), то будьте готовы к очень сложному поведению системы и долгому следствию. Я пока на 100% не установил, происходит действительный запуск стандартного преобразования вместе с инжектированным или это только флаг прерывания выставляется. Но подозреваю, что только флаг. Во-первых, биты ADST и ADC_ADBSY не выставляются, хотя это не аргумент. Но дело в том, что флаги готовности возникают одновременно. А мне не хочется думать, что 2-ой АЦП добавлен в систему специально для того, чтобы параллельно инжектированному преобразованию выполнять непрошенное стандартное. Есть ощущение, что в режиме инжектированного преобразования какие-то мультиплексоры переключаются на аппаратуру, привязанную к регистрам инжектированного преобразования. При этом входы регистров стандартного преобразования брошены плавающими и реагируют на наводки.