| I. Продолжение предыдущей статьи В предыдущем разделе мы вместе познакомились с реализацией простых внешних прерываний. Получив практический опыт работы с прерываниями, в этом разделе мы обсудим прерывания по таймеру. CC2430 имеет 4 таймера, которые можно разделить на 3 категории: Timer1, Timer2, Timer3/4 (использование 3 и 4 одинаково). Поскольку автор также только прикоснулся к CC2430, опыт работы в проектах, связанных с таймерами, практически нулевой, поэтому я не собираюсь (и не могу помочь) углубленно анализировать таймеры. В этой статье рассматривается только использование прерывания по переполнению таймера 1 для простого экспериментального исследования, функция захвата входных данных/сопоставления выходных данных/ШИМ опущена. Таймер 2 и таймер 3/4 также представлены лишь вкратце. Жду, когда сила автора достигнет определенного уровня огня, а затем стоять в высоте Zigbee боевой опыт, чтобы улучшить это эссе. Таймер 1 Timer1 - это 16-битный таймер с функциями таймера/счетчика/широтно-импульсной модуляции. Он имеет три индивидуально программируемых канала захвата/сопоставления входных сигналов, каждый из которых может использоваться как ШИМ-выход или для захвата фронта входного сигнала (за более подробной информацией о том, что такое захват/сопоставление входных сигналов и как реализовать ШИМ-выходы, читатели могут самостоятельно обратиться к китайскому руководству CC2430). У таймера есть очень важное понятие: режим работы. Режимы работы включают в себя: свободный ход, модулор и "вверх-вниз". Ниже приводится описание этих трех режимов из китайского руководства CC2430:
Сравнивая три режима, можно заметить, что: значение переполнения в режиме свободного хода равно 0xFFFF, которое не может быть изменено; в то время как два других режима могут быть точно контролированы путем присвоения значения T1CC0, чтобы точно контролировать значение переполнения таймера. В данном эксперименте используется эта возможность, чтобы заставить таймер запускать прерывание каждые 1 с через определенное значение T1CC0, чтобы точно контролировать интервал мигания светодиода в 1 с. (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 делений. Подводя итог, можно сказать, что формула выглядит следующим образом:
c
Выяснил N = 62500, его шестнадцатеричное значение 0xF424, то есть нужно установить T1CC0H = 0xF4, T1CC0L = 0x24 то есть .
(4) экспериментальный исходный код и анализ/* Описание эксперимента: эксперимент с таймером 1, переполнение счета таймера, мигание светодиода LED1 */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* инициализация системных часов-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // оба питания включеныwhile (! (SLEEP & 0x40 )); //кристаллический осциллятор включен и стабилен CLKCON &=~0x47; &
nbsp; //выбираем 32МГц кристаллический осциллятор SLEEP |=0x04; }/*Инициализация светодиодов-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 - обычный порт ввода/вывода P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 выходы led1 =1; &
nbsp; //Выключить все светодиоды led2 =1; led3 =1; led4 =1; }/*Инициализация таймера 1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; //включить общее прерывание & nbsp; T1IE=1; // включение прерывания T1OVFIM=1; // включение переполнения T1
прерывание T1CC0L=0x24; //значение переполнения младшие 8 бит T1CC0H=0xF4; //значение переполнения старшие 8 бит &
nbsp; T1CTL =0x0e; //128 делений; модульный режим (0x0000->T1CC0); начать выполнение;T1IF=0; &
nbsp; //снимаем флаг прерывания }/* главная функция-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //ожидание прерывания по переполнению }/*Подпрограмма обслуживания терминала T1-------------------------------------------------------*/#pragma vector=T1_VECTOR __interrupt
v oid T1_ISR( void ) {EA=0; //выключение прерывания led1 = !
led1; //светодиоды переключеныEA=1; //прерывание  
; T1CTL &=~0x10; //снять флаг прерывания } ОК, компиляция программы и онлайн отладка, плата разработки на LED1 мигает вверх, как и ожидалось, чувствовать интервал мигания около 1s. Но это не достаточно, чтобы доказать успех эксперимента, если вы можете строго определить интервал 1s было бы идеально ~ поэтому я открыл WIN 7 часы (нажмите на правой стороне панели задач время может быть). Наблюдая за секундной стрелкой, я краем глаза взглянул на мигающий светодиод LED1. Результат таков: через две минуты темп их работы практически идентичен (с такой точностью можно мириться ~). На этом эксперимент можно считать в принципе завершенным, хе-хе~. В-третьих, таймер 2 Таймер 2, также известный как MAC-таймер, специально разработан для поддержки протокола отслеживания событий в IEEE 802.15.4 MAC. Таймер имеет 8-битный счетчик переполнения, который может быть использован для записи количества произошедших циклов; 16-битный регистр захвата, который используется для записи точного времени приема/передачи разделителя начала кадра или точного времени завершения передачи; а также содержит 16-битный выходной регистр сравнения, который используется для генерации различных командно-селективных сигналов связи для беспроводного модуля в определенное время (начало приема, начало передачи и т.д.). Таймер 3/4 Таймер 3/4 - это 8-битный таймер с функциями таймера/счетчика/ШИМ. t3/t4 имеет два выходных канала сравнения, каждый из которых может быть использован как ШИМ-выход. V. Заключение В этом разделе мы изучили метод подсчета прерывания по переполнению таймера 1 и добились точного управления интервалом мигания светодиода в 1 с. Остальные таймеры мы рассмотрим лишь бегло, а к их добавлению вернемся позже. В следующем разделе мы расскажем о связи с последовательным портом CC2430. |