LPC
Работа с таймерами в LPC1114.
Работа с таймерами в LPC1114, а также в других микроконтроллерах серии LPC выглядит примерно одинаково. Достаточно знать только назначение регистров и некоторые особенности реализации. Такой подход значительно упрощает освоение микросхем и переход от младших моделей к старшим. Структура модуля таймера и описание регистров приведены в статье Таймеры в микроконтроллерах LPC11xx. В данной статье рассматривается функционирование таймера и пример его программирования.
Работа таймера в LPC11xx построена следующим образом. Входной сигнал частоты с системной шины подается на предделитель. Если значение установочного регистра предделителя (PR) не равно 0, то каждый входной импульс увеличивает на 1 значение счетчика предделителя (PC). Когда это значение станет равным тому, что записано в установочном регистре, счетчик предделителя обнуляется, а значение основного регистра счета (TC) увеличивается на единицу. Все события формируются таймером только по значениям, находящимся в регистрах сравнения (MRx). Переполнение основного счетчика не приводит к прерыванию, таймер продолжает работать, а регистр счетчика (TC) обнуляется.
Для формирования события, значение регистра счетчика должно стать равным одному из установленных значений регистров сравнения (MRx). Количество данных регистров равно 4, соответственно пользователь имеет возможность получить 4 временных интервала от одного таймера. Реализованы следующие варианты реакции на событие: генерация прерывания, сброс значения счетчика без останова работы, останов работы таймера. При необходимости данные реакции можно комбинировать. Событие прерывания, находит отражение в регистре прерываний таймера (IR). Для продолжения работы, соответствующие биты подлежат принудительному сбросу. Также в таймерах LPCпредусмотрена возможность изменения логического состояния выходных линий, по наступлению события от регистра сравнения (EMR). Такой режим может быть удобен, если на выходе
Кроме вышеуказанного режима работы, таймеры могут использоваться в режиме захвата внешнего сигнала и в режиме формирования сигнала широтно-импульсной модуляции.
Пуск таймера в работу производится путем установки высокого логического уровня в бите 0 регистра управления(TCR). Останов счета возможен по событию,, по низкому логическому уровню бита 0 в TCR, а также по сбросу. В последнем случае, установка логической 1 в бите 1 регистра управления, производит останов счета, сброс основного счетчика и счетчика предделителя.
Перед запуском таймера в работу производится его настройка. Выполняются следующие действия:
- Подключение таймера к шине. Выполняется путем установки соответствующего бита в регистре SYSAHBCLKCTRL.
- Установка предделителя. В регистр PR таймера заносится необходимое значение.
- Установка значений в регистр сравнения MRx.
- Настройка входных и выходных линий МК при работе с внешними устройствами. Выполняется путем настройки регистров IOCON.
- Настройка режима работы.
- Пуск таймера. Выполняется путем занесения 1 в бит 0 регистра TCR.
Ниже приведен пример программы работы с 16-разрядным таймером №1, в LPC1114. Пример полностью основан на библиотеке CMSIS и не использует никакие другие модули. Программа реализует функцию мигания светодиодом, подключенным к линии 9 порта 1 микроконтроллера, с частотой 1 Гц (При условии работы ядра на частоте 48 МГц).
#include"driver_config.h"
#include"target_config.h"
void TIMER16_1_IRQHandler (void) /* Обработчик прерывания */
{
LPC_TMR16B1->IR = 1; /* Сброс флага прерывания */
if (LPC_GPIO1->MASKED_ACCESS[(1<<9)])
LPC_GPIO1->MASKED_ACCESS[(1<<9)] = (0<<9);
else LPC_GPIO1->MASKED_ACCESS[(1<<9)] = (1<<9);
return;
}
/* Основная программа */
int main (void) {
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); /* Подключение порта 1 к шине*/
LPC_GPIO1->DIR |= 1<<9; /* Настройка линии порта на вывод*/
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); /* Подключение таймера к шине */
/* Настройка таймера */
LPC_TMR16B1->PR = 48000;
LPC_TMR16B1->MR0 = 500;
LPC_TMR16B1->MCR = 00003;
LPC_TMR16B1->TCR = 0x01;
NVIC_EnableIRQ(TIMER_16_1_IRQn); /* Разрешение прерывания */
while (1) {}; /* Бесконечный цикл */
}
Первая функция программы представляет собой обработчик прерываний от таймера 1. Имя TIMER16_1_IRQHandler зарезервировано в CMSIS. Строка LPC_TMR16B1->IR = 1; сбрасывает прерывание по совпадению в регистре MR0. Следующие строки обработчика прерывания производят переключение выхода в противоположное состояние.
Первые две строчки основной функции отвечают за настройку порта ввода вывода. Строка LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8) подключает к системной шине таймер №1. В следующей строчке в регистр предделителя заносится значение 48000. При работе на частоте 48 МГц, и данном коэффициенте, предделитель будет формировать сигнал счетчика с частотой 1 КГц. Далее регистру MR0 присваивается значение 500, что означает формирование события каждые 0.5 секунды. Строка LPC_TMR16B1->MCR = 00003; производит настройку типа реакции на совпадение счетчика и регистра сравнения. В данном случае использована восьмеричная константа. Такая форма записи позволяет настраивать работу каждого регистра сравнения по отдельности, путем записи числа от 0 до 8 в соответствующий разряд. В данном случае число 3 означает, что производится работа только с регистром MR0, реакцией является сброс счетного регистра и формирование прерывания. Остальные значения чисел можно получить в описании регистра.
Строка LPC_TMR16B1->TCR=0x01;, запускает работу таймера, строка NVIC_EnableIRQ(TIMER_16_1_IRQn);, разрешает прерывание от данного таймера. Имя TIMER_16_1_IRQn также определено в CMSIS.
Данная программа тестировалась в CodeRed, с помощью платы LPCXpresso.