|
1. З'єднання верхнього та нижнього рівнів У попередній статті ми разом дізнавалися про реалізацію простих зовнішніх переривань. Тепер, коли ми маємо практичний досвід із перериваннями, давайте поговоримо про таймерні переривання в цьому розділі. CC2430 має загалом 4 таймери, які можна поділити на 3 категорії: таймер 1, таймер 2, таймер 3/4 (використання 3 і 4 однакове). Оскільки автор також новачок у CC2430 і практично не має практичного досвіду у проектах із таймерами, я не маю наміру (і нічого не можу зробити) глибоко аналізувати таймер. У цій статті наведено лише коротке експериментальне дослідження використання таймера 1 у перериваннях переповнення підрахунку і не згадується його функції порівняння захоплення/виходу/PWM. Таймер 2 і Таймер 3/4 — це лише прості введення функцій. Коли навички автора досягнуть певного рівня гостроти, я стану на вершині практичного досвіду Зігбі, щоб покращити це есе. 2. Таймер 1Таймер 1 — це 16-бітний таймер з модуляцією таймер/лічильник/ширина імпульсу. Він має 3 окремо програмовані канали порівняння захоплення/виведення входу, кожен з яких може використовуватися як PWM-вихід або як граничний час для захоплення вхідного сигналу (для отримання інформації про порівняння захоплення/виведення вхіду та як реалізувати PWM-вихід, читачі можуть звернутися до китайського посібника CC2430). Таймери мають дуже важливе поняття:Режим роботи。 Режими роботи включають: режим вільної роботи (Вільний біг), режим форми (Modulo) та режим позитивного підрахунку/зворотного відліку (Вгору-вниз)。 Нижче наведено уривок із китайського посібника CC2430 для введення трьох режимів:
Порівнюючи три режими, можна побачити, що значення переповнення вільного режиму роботи 0xFFFF незмінне; Інші два режими дозволяють точно контролювати значення переповнення таймера, присвоюючи значення T1CC0. Цей експеримент використовує цю функцію для запускання переривання кожні 1 секунди за таймером через певний T1CC0, щоб точно контролювати інтервал миготіння світлодіодного світла до 1 секунд. (1) Вступ до експериментуУ режимі за модулем таймера інтервал миготіння світлодіодного світла точно регулюється 1s, а саме: яскраві 0,5s → темні 0,5s → яскраві 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-бітний таймер із функцією таймер/лічильник/PWM. T3/T4 має 2 канали порівняння виходів, кожен з яких може використовуватися як PWM-вихід. 5. ВисновокЦей розділ головним чином вивчає метод переривання переповнення підрахунку таймера 1 і реалізує точне керування інтервалом миготіння світлодіодного світла в 1с. Ще кілька таймерів — це лише інсульт, і я повернуся, щоб додати їх пізніше. У наступному розділі ми представимо комунікацію через послідовний порт CC2430.
|