Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HCS12 с применением языка С - royallib.ru.doc
Скачиваний:
118
Добавлен:
11.03.2016
Размер:
2.28 Mб
Скачать

4.5.1. Виртуальный адрес блока регистров

Все регистры специальных функций МК семейства 68HC12/HCS12 объединены в блок, который занимает 512 ячеек памяти в адресном пространстве МК. Регистры располагаются в памяти, начиная с некоторого начального адреса, который принято в программном коде обозначать как IO_BASE. Адреса регистров следуют последовательно друг за другом, поэтому адрес каждого регистра можно представить, как (IO_BASE + код смещения). Численное значение кода смещения каждого регистра определено в карте памяти конкретной модели МК в составе семейства 68HC12/HCS12 и может быть получено из технического описания этого МК. Так в примере предыдущего параграфа код смещения регистра ATDCTL2 в составе МК B32 был равен $0062.

После выхода МК из состояния сброса блок регистров специальных функций располагается в адресном пространстве МК, начиная с адреса IO_BASE = $0000. Такое расположение блока наиболее часто сохраняется при использовании МК семейства 68HC12/HCS12 в однокристальном режиме работы, поскольку для обращения к регистрам могут быть использованы команды с прямой адресацией, которые имеют двухбайтовый формат и экономно расходуют память программ МК. Однако аппаратные средства МК семейства 68HC12/HCS12 позволяют переопределить значение базового адреса блока регистров IO_BASE = $0000 на любое другое кратное 2 Кб в пределах адресного пространства в 64Кб. Для этого достаточно записать соответствующее значение в один из регистров специальных функций МК с именем INITRG. После изменения базового адреса блок регистров будет «располагаться» в первых 512 ячейках выбранной области памяти объемом 2 Кб. Причем порядок расположения регистров, а значит и значения кодов смещения, в пределах этой области памяти останутся неизменными. Так если блок регистров назначен в область памяти с базовым адресом $1000, то регистр ATDCTL2 будет иметь новый виртуальный (т.е. кажущийся) адрес, равный $1000 + $0062. Заметим, что при использовании виртуальной адресации регистров программисту придется только переопределить базовый адрес IO_BASE, в то время как указанные в заголовочном файле коды смещения останутся прежними.

Зачем нужна система виртуальной адресации? Дело в том, что при работе МК в одном из расширенных режимов расположение блока регистров с адреса $0000 может вызвать неудобства при проектировании схемы подключения внешней памяти. А изменение базового адреса значительно упростит эту схемотехнику.

4.6. Порты ввода/вывода

Все МК семейства 68HC12 имеют некоторое количество линий ввода/вывода данных. Линии объединены в 8 разрядные параллельные порты данных: Port A, Port B, Port E, PORT AD и т.д.

За редким исключением, все линии ввода/вывода двунаправленные. Направление передачи линий ввода/вывода настраивается программно путем записи управляющего слова в регистр направления передачи соответствующего порта. Возможно изменение направления передачи в ходе выполнения программы посредством перепрограммирования этих регистров. Сигнал сброса устанавливает все двунаправленные линии в режим ввода. Следует особо подчеркнуть, что направление передачи каждой линии может быть выбрано разработчиком произвольно, независимо от других линий, принадлежащих к одному и тому же порту ввода/вывода. Исключение составляют лишь линии однонаправленной передачи, которые изначально специализированы на ввод или на вывод (см. 4.6.1).

Часть линий ввода/вывода имеют так называемую альтернативную функцию, т.е. обеспечивают связь встроенных периферийных модулей МК с «внешним миром». Так линии порта PORT AD используются для подключения к встроенному АЦП измеряемых напряжений, линии порта PORT S служат входами и выходами контроллеров последовательного обмена. Если соответствующий периферийный модуль МК не используется, то его выводы можно задействовать как обычные линии ввода/вывода.

Если линии порта двунаправленные, то для его обслуживания такого порта предусмотрены два типа регистров:

PORTx — регистр данных порта x, где x — имя порта ввода/вывода;

DDRx — регистр направления передачи порта x.

Например, порт PORT A обслуживается регистрами PORTA и DDRA, а порт PORT B — регистрами PORTB и DDRB.

Если порт имеет схемотехнику с программно подключаемым «подтягивающим» резистором (R pull up), то для обслуживания такого порта предусмотрен дополнительный регистр входного сопротивления порта.

Ниже приведен фрагмент текста программы, которая конфигурирует PORT T для вывода данных, а затем записывает в порт число $62. Для того, чтобы все линии порта PORT T стали линиями вывода, необходимо записать в регистр направления передачи DDRT код $FF.

/*----------------------------------------------*/

/* МAIN PROGRAМ:                                */

/*                                              */

/*подключаемые файлы*/

#include <912b32.h>

void main{void) {

 unsigned char DDRT_INI = 0xFF;

 DDRT = DDRT_INI; //установить порт PORT T на вывод

 PORTT = 0x62;

}

/*                                              */

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]