|
1. Соединение верхнего и нижнего уровней В предыдущей лекции мы ознакомились с базовым процессом разработки программы CC2430 IAR с помощью простого эксперимента с миганием светодиодов. Нож всё равно заточен (хотя точильный камень у меня не очень хороший), и теперь я начну убивать насекомых :). Далее давайте изучим несколько базовых экспериментов с 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 (Enable Interrupt) или IM (Mask Interrupt 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++);
|