|
1. Соединение верхнего и нижнего уровней В предыдущей статье мы вместе изучали реализацию простых внешних прерываний. Теперь, когда у нас есть практический опыт работы с прерываниями, давайте поговорим о таймерных прерываниях в этом разделе. В CC2430 всего 4 таймеры, которые можно разделить на 3 категории: таймер 1, таймер 2, таймер 3/4 (использование 3 и 4 одинаково). Поскольку автор тоже новичок в CC2430 и практически не имеет практического опыта работы с проектами с таймерами, я не собираюсь (и не могу ничего сделать) глубоко анализировать таймер. В этой статье приводится лишь краткое экспериментальное исследование использования таймера 1 в прерываниях переполнения счёта и не упоминается его функции сравнения входа/выхода/PWM. Таймер 2 и Таймер 3/4 — это лишь простые введения функций. Когда навыки автора достигнут определённого уровня, я окажусь на вершине практического опыта Зигби, чтобы улучшить это эссе. 2. Таймер 1Таймер 1 — это 16-битный таймер с модуляцией таймер/счётчик/ширины импульса. У него есть 3 индивидуально программируемых канала сравнения входа/сравнения входов, каждый из которых может использоваться как PWM-выход или как edge time для захвата входного сигнала (для получения информации о сравнении входного захвата/выхода и о том, как реализовать PWM-выход, читатели могут обратиться к китайскому руководству CC2430). Таймеры имеют очень важную концепцию:Режим работы。 Режимы работы включают: режим свободной работы (Свободный бег), режим формы (Modulo) и режим положительного отсчёта/обратного отсчёта (Вверх-вниз)。 Ниже приведён отрывок из китайского руководства CC2430 по введению трёх режимов:
Сравнивая три режима, можно увидеть, что значение переполнения режима свободной работы 0xFFFF неизменно; Остальные два режима позволяют точно контролировать значение переполнения таймера, присваивая значение T1CC0. Этот эксперимент использует эту функцию для запуска прерывания каждые 1 секунды по таймеру через определённый T1CC0, чтобы точно контролировать интервал мигания светодиода до 1 секунд. (1) Введение в экспериментВ режиме по модулю таймера интервал мигания светодиодного света точно контролируется единицами, а именно: яркие 0,5 с → тёмные 0,5 с → яркие 0,5 с → тусклые 0,5 с ...... → Светлый 0,5 с → Тёмный 0,5 с (то есть интервал времени от тёмного к светлому равен 1 с). Инверсия светлой/тёмной системы достигается за счёт переполнения прерываний. (2) Блок-схема программы
(3) Соответствующие расчётыКак уже упоминалось, состояние светодиодного индикатора: яркий 0,5 с → тёмный 0,5 с → яркий 0,5 с → тусклый 0,5 с ...... → 0,5 с свет → 0,5 с тёмным, и это необходимо реализовать с переполнением, поэтому период переполнения таймера должен составлять 0,5 секунды. Для этого необходимо вычислить соответствующее значение переполнения (временно установить в N). Тактовая частота системы выбирается как 32 МГц, а по умолчанию задана тактовая частота — 16 МГц (оба параметра определяются специальными регистрами функций).CLKCONДля подробностей ознакомьтесь с китайским руководством CC2430). Для таймера 1 установите кроссовер часов на 128 дивизионов. В итоге список выглядит следующим образом:
Чтобы найти N=62500, её шестнадцатеричное число равно 0xF424, то есть нужно установить T1CC0H=0xF4, T1CC0L=0x24 . (4) Экспериментальный исходный код и анализ/*
Описание эксперимента: Timer Timer1 эксперимент, переполнение количества таймеров, мигание LED1
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
пустотаxtal_init(пустота)
{ SLEEP &= ~0x04; //都上电
в то время как(! (SLEEP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Выберите кристаллический осциллятор на 32 МГц СОН |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
пустотаled_init(пустота)
{ P1SEL =0x00; P1 — это обычный порт ввода-вывода P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 выход
led1 =1; //关闭所有LED led2 =1; led3 =1; led4 =1;
}
/*T1初始化
-------------------------------------------------------*/
пустотаtimer1_init(пустота)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM =1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 кроссовер; по модулю (0x0000->T1CC0); Начинайте бегать; T1IF=0; Очистите знак прерывания
}
/*主函数
-------------------------------------------------------*/
пустотаОсновная(пустота)
{ xtal_init(); led_init(); timer1_init();
в то время как(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma вектор=T1_VECTOR __interruptпустотаT1_ISR(пустота)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Хорошо, скомпилирую программу и отладку онлайн, LED1 на плате разработки мигает по расписанию, и кажется, что интервал мигания составляет около 1 секунды. Но этого недостаточно, чтобы доказать успех эксперимента: если интервал можно строго определить как 1с, он будет идеальным~ Поэтому я включил часы WIN 7 (кликните на время справа на панели задач). Глядя на секундную стрелку, он краем глаза заметил мигающий LED1. В итоге: через две минуты темп двух игр практически одинаков (эта точность терпима~). На этом этапе можно сказать, что эксперимент практически завершён, хе-хе~ 3. Таймер 2Таймер 2 также называетсяТаймер MAC, специально разработан для поддержки протокола отслеживания событий в IEEE 802.15.4 MAC. Таймер имеет 8-значный счётчик переполнения, который можно использовать для записи количества произошедших циклов; Существует 16-битный регистр захвата, который записывает точное время начала приёма/отправки кадра или точное время завершения передачи. Также он содержит 16-битный выходной сравнительный регистр, который генерирует различные сигналы команд (начать принимать, отправлять и т.д.) на беспроводной модуль в определённый момент. 4. Таймер 3/4Таймер 3/4 — это 8-битный таймер с функциями таймер/счётчик/ШИМ. T3/T4 имеет 2 канала сравнения выходов, каждый из которых может использоваться как PWM-выход. 5. ЗаключениеВ этом разделе в основном изучается метод прерывания переполнения счёта таймера 1 и реализовано точное управление интервалом мигания светодиодного света в 1с. Ещё несколько таймеров — это просто инсульт, и я вернусь, чтобы добавить их позже. В следующем разделе мы представим связь с последовательным портом CC2430.
|