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 регистра управления, производит останов счета, сброс основного счетчика и счетчика предделителя.

Перед запуском таймера в работу производится его настройка. Выполняются следующие действия:

  1. Подключение таймера к шине. Выполняется путем установки соответствующего бита в регистре SYSAHBCLKCTRL.
  2. Установка предделителя. В регистр PR таймера заносится необходимое значение.
  3. Установка значений в регистр сравнения MRx.
  4. Настройка входных и выходных линий МК при работе с внешними устройствами. Выполняется путем настройки регистров IOCON.
  5. Настройка режима работы.
  6. Пуск таймера. Выполняется путем занесения 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

You have no rights to post comments