| I. Перехід від попереднього до наступного У попередній лекції ми ознайомилися з основним процесом розробки програм для CC2430 в IAR на прикладі невеликого експерименту з найпростішим миготінням світлодіодів. Ніж, принаймні, наточили (хоча я не дуже добре володію цим точильним каменем), і тепер настав час приступити до вбивства помилок :). Далі, давайте вивчимо кілька основних експериментів з CC2430. Кожен невеликий експеримент, розділений на "експериментальний вступ", "блок-схема програми", "експериментальний вихідний код і аналіз" трьома частинами опису. У цій статті пояснюється зовнішнє переривання. По-друге, зовнішнє переривання(1) Вступ до експерименту Переривання - це внутрішній механізм мікроконтролера реального часу для обробки внутрішніх або зовнішніх подій. Коли відбувається якась внутрішня або зовнішня подія, система переривань мікроконтролера змусить процесор призупинити виконувану програму, але перейти до обробки події переривання, завершити обробку переривання, а потім повернутися до перерваної програми, продовжити виконання. Переривання поділяються на зовнішні та внутрішні, CC2430 містить загалом 18 джерел переривань (конкретний опис переривання та визначення вектора переривання ви можете знайти в " Китайському посібнику CC2430 "). Тепер давайте подивимось на принципову електричну схему цієї плати:
Плата була підключена до кнопки S1 і P0.1, ефект, якого хоче досягти цей експеримент, полягає в тому, щоб викликати переривання P0.1 натисканням кнопки S1, а потім керувати вмиканням/вимиканням світлодіода LED1 в підпрограмі обслуговування переривань. (2) Принцип експерименту та блок-схема Блок-схема експерименту виглядає наступним чином:
c
(3) Експериментальний код// заголовний файл#include // підфункція delay#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &
nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &
nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//Ініціалізація 32М кристалуvoid xtal_init( void ) { SLEEP &=~0x04; & nbsp; //включити живленняwhile (! (SLEEP & 0x40 )); //генератор кристалу увімкнено та стабільно працює CLKCON &=~0x47; &
nbsp; //Вибираємо 32МГц кварцовий генератор SLEEP |=0x04; }//Ініціалізація світлодіодівvoid led_init( void ) { P1SEL =0x00;  
; //P1 - звичайний порт вводу/виводу P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Вихід
led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//ініціалізація іо та зовнішнього перериванняvoid io_init( void ) { P0INP &=~0X02;
/ /P0.1 має pull-up та pull-down EA =1; //Загальний дозвіл переривання P0IE =1; &
nbsp; //Дозвіл переривання P 0 PICTL |=0X09; //Дозвіл переривання порту P0.1, тригер по спадаючому фронту P0IFG &=~0x02
; //Прапор переривання P0.1 очистити 0 };//головна функціяvoid main( void ) { xtal_init(); led_init();
io_init();while ( 1 ); //очікуємо переривання }//підпрограма обслуговування переривання#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;
/ / вимкнути затримку переривання Delay
( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000); Delay(10000 ); &
nbsp; if ((P0IFG & 0x02 ) >0 ) //переривання за клавішею { P0IFG &=~0x02; &
nbsp; //прапор переривання P0.1 очистити 0 led1 = !led1; } P0IF =0; &
nbsp; //прапор переривання P0 очистити від 0 EA =1; & nbsp; // вмикаємо переривання } Спочатку ініціалізуйте Unity Clock: виберіть кварцовий генератор з частотою 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 і т.д., в цей час призначення біта дуже просте, достатньо зробити запит в заголовному файлі ioCC2430.h в частині SFR Bit Access визначення біта може бути таким: P0_0 = 0; // P0 перший біт присвоєння значення 0 P0_0 = 1; / / / P0 перший біт присвоєння значення 1 Однак, є SFR, які не підтримують бітову адресацію, як у випадку з першим бітом присвоєння значення 0 . Однак, деякі SFR не підтримують бітову адресацію, наприклад, PICTL у цьому експерименті, коли потрібно присвоїти значення одному з них, синтаксис наступний: PICTL &= ~0x01; //присвоїти першому біту значення 0 PICTL |= 0x01; //присвоїти першому біту значення 1 Пам'ятайте, що & amp;= ~, |= ~, |= ~, |= ~, |= P0_0 = 1; //присвоїти першому біту P0 значення 1 . amp;= ~, |= ці два загальних синтаксиси присвоєння бітів. (2) Короткий опис дозволу переривання Коли переривання використовується у програмі, воно повинно бути дозволене до того, як воно буде викликане. C 51 система дозволу переривань, її ієрархічна структура дуже очевидна: бос переривання: EA є босом, відповідальним за загальний дозвіл переривання: EA = 1; капітан переривання: наступний для кожного функціонального компонента (наприклад, P0, таймер 1 і т.д.) дозволити управління, такі SFR, як правило, біт адресований, іменування, як правило, містить IE (переривання дозволу): P0IE = 1; члени команди переривання : відділення, але через перериванняпрограми , переривання повинно бути включено до того, як переривання спрацьовує.
кожне переривання члени команди : команда, але оскільки кожен функціональний компонент також містить декілька переривань, тому останній рівень для кожного переривання є контролем дозволу переривання, такі SFR, як правило, не є порозрядними, імена зазвичай містять IE (Interrupt Enable) або IM (Interrupt Mask): PICTL | = 0x01; не потрібно запам'ятовувати SFR переривань. Немає необхідності запам'ятовувати SFR переривань, якщо ви розумієте ієрархію, а потім звертаєтесь до посібника або заголовних файлів, коли ви їх використовуєте. (3) Написання програм обробки переривань Використання переривань у програмі зазвичай складається з двох частин: написання підпрограми обслуговування переривань і відкриття вікна дозволу переривань. Активація переривання була представлена вище, нижче наведено короткий вступ до підготовки підпрограми обслуговування переривання: Перш за все, необхідно вказати вектор переривання, він може бути в заголовному файлі ioCC2430.h в частині запиту Interrupt Vectors, синтаксис наступний: # pragma vector = Interrupt Vectors , а потім слідує підготовка обробника переривання, структура наступна: ___ interrupt void Ім'я Функції (___)
i nterrupt void function name(void) { //при виникненні переривання //обробка переривання //прапор переривання очистити 0 //виключити переривання } III. висновок У цій статті розглянуто простий метод реалізації зовнішнього переривання на основі мікросхеми CC2430, причому за основу взято переривання, після чого представлено ще один дуже важливий модуль - таймер. CC2430 має всього чотири таймери, які можна розділити на три категорії: таймер 1, таймер 2, таймер 3/4 (3 і 4 використовують одну й ту ж саму базову основу). однакові). </n;tt++). </n;tt++);. </n;tt++). </n;tt++); </n;tt++); </n;tt++); </n;tt++); </n;tt++). </n;tt++). |