Таймер тактов синхронизирован от генератора центрального процессора (16 или 32 МГц), сигнал с которого подается на 32-разрядный сбрасываемый счетчик прямого действия через логический вентиль, управляемый сигналом блока режима (рис. 27). Регистр соответствия сравнивает содержимое счетчика с запрограммированным значением. Это значение может быть запрограммировано, используя vAHI_TickTimerInterval () в диапазоне от 0 до 0x0FFFFFFF. Выход регистра сравнения используется для управления счетчиком в различных режимах, может быть использован для генерации прерываний, если те разрешены. Режим таймера задается через функцию vAHI_TickTimerConfigure (), которая при вызове сбрасывает счетчик в нуль.
Рис. 27. Блок-схема таймера тактов.
Прерывания разрешаются через vAHI_TickTimerIntEnable (). Состояние прерывания определяется bAHI_TickTimerIntStatus () , и, если прерывание сгенерировано, состояние может быть сброшено vAHI_TickTimerIntPndClr ().
В одиночном режиме счетчик начинает отсчет с нуля до тех пор, пока его содержимое не станет равным запрограммированному значению. Затем сгенерируется сигнал соответствия, который вызывает прерывание, если оно разрешено, и счетчик прекращает счет. Счетчик может быть перезапущен при перепрограммировании режима, используя vAHI_TickTimerConfigure ().
В перезапускаемом режиме при совпадении значения счетчика с запрограммированным, счетчик сбрасывается и начинает счет с нуля. Если прерывания таймера разрешены, они будут генерироваться при сбросе счетчика.
Непрерывный режим подобен перезапускаемому за исключением того, что при достижении соответствующего значения счетчик не сбрасывается, а продолжает счет. Прерывание генерируется, если оно разрешено, когда значение счетчика совпадает с запрограммированным.
12.3. Таймеры пробуждения
JN513x содержит два 32-разрядных таймера пробуждения, тактируемых от внутреннего генератора на 32 кГц. Они могут работать во время периода бездействия, когда большая часть устройства выключена, могут быть использованы для выдержки времени, требуемой приложениями. Таймеры пробуждения не работают во время глубокого спящего режима. могут быть заблокированы в спящем режиме через программное управление. По истечении времени таймера пробуждения, как правило, генерируется прерывание, выводящее устройство из спящего режима. Особенности таймеров:
· 32-разрядный счетчик обратного действия;
· Произвольная работа во время периодов бездействия;
· Синхронизация от RC генератора на 32 кГц.
Таймер пробуждения состоит из 32-разрядного обратного счетчика, работающего от внутреннего генератора на 32 кГц. Когда содержимое счетчика достигает нуля, может быть сгенерировано прерывание или произойти пробуждение устройства. При достижении нуля счетчик продолжает обратный отсчет до тех пор, пока его не остановят. Если требуется случай прерывания или пробуждения, прерывания по таймеру должны быть разрешены, используя vAHI_WakeTimerEnable() перед загрузкой содержимого счетчика. Значение счета загружается через vAHI_WakeTimerStart () и запускает обратный счет; счетчик может быть остановлен в любое время, используя vAHI_WakeTimerStop (). Содержимое счетчика останется таким же, каким оно было при остановке таймера, прерывание при этом сгенерировано не будет. Состояние таймеров может быть опрошено функцией u8AHI_WakeTimerStatus (), которая показывает, работают ли таймеры. Факт истечения времени таймера может быть выяснен вызовом функции u8AHI_WakeTimerFiredStatus (), которая полезна при замаскированных прерываниях таймера.
12.3.1. Калибровка RC-генератора
RC генератор используется в спящем режиме, потребляет очень малую мощность, является модульным, не требует никаких внешних компонентов синхронизации, что отражается более низкой стоимостью. Поскольку все элементы генератора реализованы в микросхеме, его абсолютная точность и температурный коэффициент частоты ниже, чем у кварцевого, но после калибровки его точность приближается к кварцевому. Период времени бездействия должен быть как можно точнее приближен к запрограммированному, чтобы устройство просыпалось как раз ко времени начала важного события, например передаче маяка в протоколе IEEE802.15.4. Если время бездействия точно, устройство может быть запрограммировано на время пробуждения, близкое к расчетному времени события, таким образом сохранить минимальное потребление энергии. Если время бездействия менее точно, необходимо пробудить JN513x раньше, чтобы успеть к моменту начала события наверняка. Если устройство проснется раньше, оно будет бодрствовать дольше, что приведет к уменьшению срока службы аккумулятора.
Чтобы как можно точнее приблизить длительность периода бездействия к запрограммированному, частота RC генератора должна быть близка к 32 кГц точнее начальной 30%-ой погрешности. Для вычисления истинного числа импульсов генератора на 32 кГц, необходимых для нахождения в спящем режиме используется коэффициент калибровки, получаемый сравнением опорного сигнала калибровки от кварцевого генератора с частотой RC генератора во время бодрствования JN513x. Операция следующая:
Калибровка может быть выполнена вызовом функции u32AHI_WakeTimerCalibrate (), которая подсчитывает в течение двадцати импульсов генератора 32 кГц количество импульсов генератора на 16 МГц и возвращает это число. Для RC генератора, работающего точно частоте на 32 кГц возвращаемое значение должно быть равно 10000. Если частота генератора больше 32 кГц, то число будет меньше 10000, если частота меньше - значение будет больше. Например, если получено значение 9000, т.е. частота генератора примерно 35 кГц, то для программирования 2-х секундного периода, в счетчик таймера должно быть загружено число 71 112 ((10000/9000) * (32000*2)), а не 64000.
13. Последовательные передачи данных
JN513x содержит два независимых универсальных асинхронных приемо-передающих (UART) последовательных коммуникационных интерфейса. Они реализуют операции, аналогичные промышленному стандарту 16550A устройства, работающего в режиме FIFO. Каждый интерфейс преобразует данные из параллельного формата в последовательный при передаче и из последовательного в параллельный при приеме. В обоих направлениях 16-байтовый FIFO буфер позволяет центральному процессору считывать и записывать символы на каждой транзакции. Это означает, что центральный процессор освобожден от познаковой обработки данных. Интерфейсы UART обладают следующими особенностями:
Блок-схема UART показана на рис. 28.
Рис. 28. Блок-схема UART.
Характеристики последовательного интерфейса программируются, используя вызов vAHI_UartSetControl (). Он определяет количество информационных разрядов (5, 6,7 или 8), четность, нечетность, обнаружение без четности и генерирует единичные или многократные стоповые биты.
Скорость передачи программируется между 4800, 9600, 19.2k, 38.4k, 76.8k и 115.2 kbaud через функцию vAHI_UartSetClockDivisor (). Для достижения более высоких или нестандартных скоростей передачи можно обращаться непосредственно к регистрам UART .
Предоставлены два аппаратных сигнала управления потоком данных: сброс передатчика (CRT) и запрос передачи (RTS). Сигнал CTS, посланный внешним устройством, сообщает о том, что внешнее устройство в UART готово получить данные. Сигнал RTS, посланный внешнему устройству, сообщает о готовности принять от него данные. Активный уровень обоих сигналов - низкий. Сигналом RTS управляют функцией vAHI_UartSetControl (), значение CRT может читаться u8AHI_UartReadModemStatus ().. Контроль и управление CRT и RTS – задача программы, обычно выполняемая как часть обработки прерывания. Сигналы не управляют частями аппаратных средств UART, а только указывают программному обеспечению состояние интерфейса UART. Альтернативно, программное обеспечение может установить режим автоматического контроля потока, где аппаратные средства управляют линией RTS , и передают данные при активном входящем сигнале CRT.
Символы читаются из приемного FIFO буфера с помощью u8AHI_UartReadData () (за один вызов считывается один байт), записываются в передающий FIFO буфер с помощью vAHI_UartWriteData (). Приемный и передающий FIFO буферы могут быть сброшены независимо друг от друга, используя vAHI_UartReset (). Состояние передатчика может быть проверено запросом u8AHI_UartReadLineStatus (), который указывает, пуст ли передающий FIFO буфер и если ли передаваемый символ. Состояние получателя также может быть проверено этим запросом, который может указать, зафиксированы ли случаи, такие как ошибка четности, ошибка синхронизации кадра, прерывание разрыва, ошибка переполнения (получен символ при заполненном принимающем буфере).