|
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:EA、IEN1、PICTL(Для деталей кожного 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++);
|