9.4.3. Режим чтения «на лету»

(Руководство разработчика по микроконтроллерам семейства HCS08)

В МК с 8-битной шиной данных операции чтения/записи 16-битных регистров не могут быть выполнены с использованием всего одной пересылки по магистрали данных. Обычно для этого последовательно считывают старший и младший байты регистра. Например, операция записи на ассемблере выглядит следующим образом:

LDA#high_byte
STATPMMODH
LDA#low_byte
STATPMMODL

Для МК HCS08 можно использовать команды c двухбайтными операндами LDHX и STHX:

LDHX#16_bit_value
STHXTPMMOD

Но даже они потребуют использования 4 пересылок по магистрали данных: в начале загружается значение в регистр H, затем старший байт данных загружается в регистр X, далее содержимое регистра H записывается в ячейку памяти с младшим адресом, а содержимое регистра X записывается в ячейку со старшим адресом.

Таким образом, мы установили, что операции с 16-битными числами занимают более чем один такт частоты системной шины BUSCLK. В большинстве случаев это обстоятельство не оказывает существенного влияния на качество исполнения прикладной программы. Но в случае работы с регистрами периферийных устройств за время пересылки данных его значение может измениться. Рассмотрим следующий пример.

Предположим, что:

  1. Счетчик TPMCNT тактируется сигналом с частотой 8МГц. Значение счетчика TPMCNT увеличивается каждые 125 нс.
  2. Команда LDHX TPMCNT выполняется за 4 тактовых цикла BUSCLK.
  3. Команда LDHX TPMCNT реально выполняет две операции чтения, т.е. за 2 первых тактовых цикла BUSCLK будет прочитан старший байт этого счетчика.
  4. Перед выполнением команды значение TPMCNT = 0x00FF.

Первая операция чтения копирует старший байт регистра TPMCNT (его значение равно 0x00) в регистр H. Эта операция занимает не менее одного периода тактового сигнала BUSCLK (125нс). Затем значение счетчика TPMCNT увеличивается и становится равным 0x0100. Производится вторая операция чтения: младший байт регистра TPMCNT (теперь он равен 0x00) записывается в регистр X. Таким образом, результат выполнения команды LDHC TPMCNT — H:X = 0x0000, а значение TPMCNT = 0x0100!

Подобная ситуация может случиться в любом МК, если разрядность регистра периферийного устройства больше разрядности шины данных. К счастью, МК семейства HCS08 оснащены специальной буферной схемой, которая защищает от подобных ситуаций. Эту схему называют механизмом «защелки» или механизмом чтения/записи «на лету». Она состоит из двух 8-битных регистров защелок и сопутствующей логики управления. В момент первой операции чтения, например старшего байта регистра, 16-битное содержимое этого регистра периферийного устройства переносится в регистры-защелки, что позволяет избежать ошибки при последующем чтении младшего байта его содержимого. Тот же метод применяется и для операции записи. Сначала 8-битные данные последовательно записываются в регистры-защелки, а затем, после того как оба байта данных записались, они переносятся в регистр периферийного устройства.

Механизмом чтения/записи «на лету» оснащены следующие регистры модуля процессора событий TMP:

  • TPMCNT — реализуется режим чтения «на лету»;
  • TPMMOD — реализуется режим записи «на лету». Любая запись в регистр TPMMODL или TPMMODH препятствует установке бита TOF, пока оба регистра не будут перезаписаны;
  • TPMCxV — реализуется режим чтения и записи «на лету». При работе в режиме входного захвата любая операция чтения одного из регистров TPMCxVL или TPMCxVH вызывает автоматическое копирование содержимого двухбайтного регистра TPMCxV в регистр-защелку. При работе в режиме выходного сравнения или ШИМ любая операция записи в один из регистров TPMCxVL или TPMCxVH приводит к запоминанию первого записанного значения в регистр-защелку. Только после записи нового значения для второго регистра двухбайтное значение будет перезаписано в двухбайтный регистр данных канала TPMCxV. Любая операция записи в регистр управления каналом TPMCxSC вызывает сброс механизма записи «на лету».

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>