Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 7368|Відповідь: 0

Zigbee Journey (3): Кілька важливих базових експериментів CC2430 — зовнішнє переривання

[Копіювати посилання]
Опубліковано 30.10.2014 23:16:46 | | | |
1. З'єднання верхнього та нижнього рівнів

У попередній лекції ми ознайомилися з основним процесом розробки програми CC2430 IAR за допомогою простого експерименту з LED-миготінням. Ніж все одно заточили (хоча мій точильний камінь не дуже хороший), і тепер я почну забівати комах :). Далі давайте вивчимо кілька базових експериментів з CC2430. Кожен невеликий експеримент поділений на три частини: «Вступ до експерименту», «Блок-схема програми» та «Експериментальний вихідний код і аналіз».

У цій статті пояснюються зовнішні переривання.

2. Зовнішнє переривання(1) Вступ до експерименту

Переривання — це внутрішній механізм для обробки внутрішніх або зовнішніх подій мікроконтролерами в реальному часі. Коли відбувається внутрішня або зовнішня подія, система переривання мікроконтролера змушує процесор призупинити виконувану програму і замість цього обробляти подію переривання.

Переривання поділяються на зовнішні та внутрішні, і CC2430 містить загалом 18 джерел переривань (для конкретних описів переривань і визначень векторів переривань, будь ласка, див. "Китайський посібник CC2430》)。

Тепер давайте розглянемо схему схеми цієї плати проявки:

Кнопка S1 підключена до P0.1 на платі розробки, і результатом цього експерименту є активація переривання P0.1 через кнопку S1, а потім керування ввімкненням/вимкненням LED1 у підпрограмі сервісу переривань.

(2) Експериментальний принцип і блок-схема

Експериментальна блок-схема виглядає так:


(3) Експериментальний вихідний код//头文件
#include

//延时子函数
#defineLED1 P1_0
#defineLED2 P1_1
#defineLED3 P1_2
#defineLED4 P1_3

ПорожнечаЗатримка(Без підписуn)   
{
  Без підписуtt;
  для(tt =0; tt<n; tt++);
  для(tt =0; tt<n; tt++);
  для(tt =0; tt<n; tt++);
  для(tt =0; tt<n; tt++);
  для(tt =0; tt<n; tt++);
}

//32M晶振初始化
Порожнеча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 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
Порожнечаio_init(Порожнеча)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    PICTL |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
ПорожнечаГоловна(Порожнеча)   
{
  xtal_init();
  led_init();  
  io_init();

  поки(1);   //等待中断
}

//中断服务子程序
#pragma вектор = P0INT_VECTOR
__interrupt ПорожнечаP0_ISR(Порожнеча)
{
  EA =0;                        Ворота перериваються  

  Затримка(10000);  
  Затримка(10000);
  Затримка(10000);
  Затримка(10000);
  Затримка(10000);

  якщо((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  P0IF =0;                       //P0中断标志清0

  EA =1;                        //开中断
}

Спочатку ініціалізуйте системний тактовий сигнал: виберіть кристалічний осцилятор 32 МГц.

Потім ініціалізуйте світлодіоди: встановіть P1 як загальний порт введення/виведення, встановіть напрямок P1.0 ~ P1.3 як вихід, а потім вимкніть 4 світлодіодні індикатори.

Далі налаштуйте відповідні регістри SFR для зовнішніх переривань, щоб активувати переривання на всіх рівнях, що включають 3 SFR:EAIEN1PICTL(Для деталей кожного SFR, будь ласка, зверніться доКитайський посібник CC2430》):

EA- Загальне включення переривання;

    IEN1.5- P0 увімкнути переривання;

    PICTL.3—— P0.1 увімкнено переривання порту;

    PICTL.0—— Встановіть вхідний край порту P0.1, щоб викликати спрацювання переривань.

Потім використовуйте while(1) у основній функції і чекайте на переривання.

Поради щодо CC2430
(1) Підсумок синтаксису призначення бітів
Часто нам потрібно призначити біт (0 або 1) одному байту SFR для точного керування апаратним пристроєм.
Є SFRАдресація бітів підтримкиНаприклад, TCON, P0 тощо, наразі призначення контрапунктів дуже просте — просто запитуйте визначення біта в розділі SFR Bit Access у заголовковому файлі ioCC2430.h:
P0_0 = 0; // присвоїмо 0 першій цифрі P0
P0_0 = 1; // присвоїмо значення 1 першій цифрі P0  

Але деякі SFR там немає.Адресація бітів не підтримується, як у цьому експериментіPICTL, у цей момент ви хочете присвоїти значення одному з них, синтаксис виглядає так:
PICTL &= ~0x01;   Присвоїмо значення 0 першій цифрі
PICTL |= 0x01;     Присвоїмо значення 1 першій цифрі

Ти можеш згадати&= ~|=Ці два часто використовувані синтаксиси призначення бітів.
(2) Підсумок увімкнення переривання
Коли переривання задіяно в програмі, його потрібно увімкнути до його активації.
Ієрархія системи увімкнення переривань C51 дуже очевидна:
Перериваючий бос: EA— бос, відповідальнийЗагальнеАктивація переривання:
EA = 1;

  Кожен командир загону перебивав: Далі для кожного з нихФункціональні частини(наприклад, P0, таймер 1 тощо), такі SFR зазвичай є біт-адресованими, і ім'я зазвичай містить IE (Interrupt Enable):
P0IE = 1;

  Кожного члена команди перебивали: Загін Але оскільки кожна функція також містить кілька переривань, останній рівень призначений для цьогоКожне перериванняЦей тип SFR зазвичай є безбітовим і неадресованим, і зазвичай містить IE (Interrupt Enable) або IM (Break Mask) у назві:
PICTL |=0x01;

Немає потреби механічно повторювати переривання SFR, просто зрозумійте його ієрархію і приділіть час, щоб переглянути інструкцію або файл заголовка.
(3) Переривати написання програм
Використання переривань у програмі зазвичай включає дві частини: написання підпрограми сервісу переривань та відкриття активації перерива. Функція переривання була введена вище, а нижче наведено короткий вступ до написання підпрограми сервісу переривань:
Спочатку вкажітьВектор розриву, який можна запитати у розділі Вектори переривань заголовка ioCC2430.h, з таким синтаксисом:
#pragma вектор = вектор переривання

Потім одразу після цього запишу обробник переривань, який структурований так:
__interrupt ім'я функції void (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Висновок

У цій статті представлено метод реалізації простих зовнішніх переривань на основі CC2430, а після базису переривань ми представимо ще один дуже важливий модуль — таймери. CC2430 має загалом 4 таймери, які можна поділити на три категорії: таймер 1, таймер 2, таймер 3/4 (3 і 4 — це практично однакове використання).


</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);




Попередній:Zigbee Journey (2): Перша програма CC2430 — експеримент з миготливістю світлодіодного світла
Наступний:Zigbee Journey (4): Кілька важливих базових експериментів CC2430 — переривання таймера
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com