|
1. Соединение верхнего и нижнего уровней В этой статье мы обсудим функцию сна и метод пробуждения CC2430. В реальном использовании узел CC2430 обычно питается от батарей, поэтому контроль его энергопотребления крайне важен. Ниже приведён отрывок из китайского руководства CC2430 по введению четырёх режимов энергопотребления CC2430:
Как видно из таблицы выше, у CC2430 всего 4 режима питания:PM0(полностью бодрствует),PM1(немного сонно),PM2(наполовину бодрствующий, наполовину сонный),PM3(Очень крепко спит). Чем дальше назад, тем больше функций отключается, и расход энергии снижается. Конверсионные отношения между ними следующие:
ПоложиPM1、PM2ПроснитесьPM0Существует три способа: сброс, внешнее прерывание, прерывание таймера сна; Но пустьPM3ПроснитесьPM0существует только два способа: сброс, внешнее прерывание (это происходит потому, что вPM3Все осцилляторы перестали работать, и, конечно, таймер сна был отключён~) Давайте проведём небольшой эксперимент, чтобы показать, как перейти в режим сна и как просыпатьсяPM0штат. 2. Систематический сон и эксперименты с прерванным пробуждением(1) Введение в экспериментинициализация системы, вPM0
→ войтиPM1
→ Просыпайтесь по таймеру сна после 1 секундыPM0
→ войтиPM2
→ разбудил таймер сна через 2 секундыPM0
→ войтиPM3
→ Ждать, пока нажат клавишу S1, что вызовет внешнее прерывание и пробуждаетсяPM0
(2) Блок-схема программы
(Примечание: округлый квадрат на изображении выше указывает состояние системы)
(3) Экспериментальный исходный код и анализ (Следующие поля можно кликнуть~)Заголовочный файл и определение макроса[url=]
[/url]
/* Экспериментальное описание: эксперимент с прерванным бодрствованием и сном, который вводит бодрствование в трёх режимах сна
*/
#include #define LED_ON 0 #define LED_OFF 1#defineled1 P1_0
#defineLED2 P1_1
#defineled3 P1_2
#defineled4 P1_3 [url=] [/url]
Подфункции[url=] [/url]
/*Инициализация системного тактового сигнала -------------------------------------------------------*/
пустотаxtal_init(пустота)
{ SLEEP &= ~0x04; //Все они оснащены питанием
в то время как(! (SLEEP &0x40)); //Кристаллический осциллятор включён и стабилен
CLKCON &= ~0x47; //Выберите кристаллический осциллятор на 32 МГц
СОН |=0x04;
}
/*Инициализация светодиодов -------------------------------------------------------*/
пустотаled_init(пустота)
{ P1SEL =0x00; //P1 — это обычный порт ввода-вывода
P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 выход
led1 = LED_OFF; //Выключите все светодиоды
led2 = LED_OFF; led3 = LED_OFF; led4 = LED_OFF;
}
/*Инициализация внешнего прерывания -------------------------------------------------------*/
пустотаio_init(пустота)
{ P0INP &= ~0X02; //P0.1 имеет подтягивание вверх и опускание вниз
EA =1; //Разрешено полное прерывание
IEN1 |= 0X20; //P0IE = 1, прерывания P0 включают
PICTL |= 0X09; //P0.1 разрешает прерывания, триггеры drop edge
P0IFG &= ~0x02; //P0.1 Отметка прерывания clear0
}
/*Инициализация прерывания таймера сна -------------------------------------------------------*/
пустотаsleepTimer_init(пустота)
{ STIF=0; //Отметка прерывания таймера сна чиста 0
STIE=1; //Включите таймер сна прерван
EA=1; //Откройте полное прерывание
}
/*Установите запланированный интервал для таймера сна -------------------------------------------------------*/
пустотаsetSleepTimer(без знакаintsec)
{ Без подписанияДолгоsleepTimer =0;
sleepTimer |= ST0; //Получите счётное значение текущего таймера сна
sleepTimer |= (без знакаДолго)ST1 <<8; sleepTimer |= (без знакаДолго)ST2 <<16;
sleepTimer += ((без знакаДолго)sec * (без знакаДолго)32768); //Плюс необходимая длительность тайминга
ST2 = (без знакаЧар)(sleepTimer >>16); //Установите сравнительное значение таймера сна
ST1 = (без знакаЧар)(sleepTimer >>8); ST0 = (без знакаЧар)sleepTimer;
}
/*Выберите режим питания -------------------------------------------------------*/
пустотаPowerMode (без знаков)Чаррежим)
{
если(режим <4) { SLEEP &=0xfc; //Очистите SLEEP.MODE до 0
SLEEP |= режим; //Выберите режим питания
PCON |=0x01; //Включите этот режим питания
}
}
/*Функция задержки -------------------------------------------------------*/
пустотаЗадержка (без знака)intn)
{ Без подписанияinti,j;
для(i=0; I<N; i++)
для(j=0; j <1000; j++);
}
[url=] [/url]
Основная функция[url=] [/url]
/*Основная функция -------------------------------------------------------*/
пустотаОсновная(пустота)
{ xtal_init(); led_init();
//Статус PM0, свет включен и задержка
led1 = LED_ON; //Яркость LED1 указывает на работу системы в режиме PM0
Задержка(10);
//Состояние PM1, свет выключен
setSleepTimer(1); //Установите интервал времени таймера сна на 1s
sleepTimer_init(); //Включите таймер сна прерван
led1 = LED_OFF; PowerMode(1); //Установите режим питания на PM1
//После 1 секунды PM1 входит в PM0, загорается и задерживает
led1 = LED_ON; Задержка(50);
//PM2, свет выключен
setSleepTimer(2); //Установите интервал времени для таймера сна на 2 секунды
led1 = LED_OFF; PowerMode(2); //Установите режим питания на PM2
//После двух секунд PM2 входит в PM0, загорается и задерживается
led1=0; Задержка(50);
//PM3, свет выключен
io_init(); //Инициализация внешних прерываний
led1 = LED_OFF; PowerMode(3); //Установите режим питания на PM3
//Когда происходит внешнее прерывание, PM3 входит в PM0 и загорается
led1 = LED_ON;
в то время как(1);
}
[url=] [/url]
Процедуры прерывания сервиса[url=] [/url]
/*Внешняя программа сервиса прерываний -------------------------------------------------------*/
#pragmaвектор = P0INT_VECTOR __interruptпустотаP0_ISR(пустота)
{ EA =0; //Ворота прерываются
Задержка(50);
если((P0IFG &0x02) >0) //Клавиши прерываются
{ P0IFG &= ~0x02; //P0.1 Отметка прерывания clear0
} P0IF =0; //P0 — отметка прерывания clear0
EA =1; //Открытое прерывание
}
/*Таймер сна прерывает сервисные программы -------------------------------------------------------*/
#pragmaвектор= ST_VECTOR __interruptпустотаsleepTimer_IRQ(пустота)
{ EA=0; //Ворота прерываются
STIF=0; //Отметка прерывания таймера сна чиста 0
EA=1; //Открытое прерывание
}
[url=] [/url]
Как использовать таймер для сна для пробуждения системы, можно кратко описать следующим образом:Откройте таймер сна, → задайте интервал таймера сна → режим питания (Примечание: шаг «Set the Sleep Timer Interval» должен быть перед «Set Power Mode», так как система не продолжит выполнение программы после перехода в сон) Далее сосредоточимся на подфункции, которая задаёт интервал таймера сна:setSleepTimer Прежде всего, краткое введение в таймер сна: он работает на32,768 кГциз24-е местоТаймер, когда система работает.В дополнение к PM3Во всех режимах питания таймер сна будетБесперебойная работа。 Регистры, используемые таймерами сна, следующие:ST0,ST1,ST2。 Ниже приведено подробное введение в его функции из китайского руководства CC2430:
Видно, что их функции включают два аспекта:Читать,Писать。 Читать: Используется для считывания значения текущего таймера, порядка, в котором нужно следовать показаниям:Читайте ST0 → Читайте ST1 → Читайте ST2 Писать: Используется для установки значения сравнения таймера (когда счётное значение таймера = значение сравнения, происходит прерывание), порядок записи должен следовать:Запишите ST2 → ST1 → ST0 Хорошо, давайте объясним это в сочетании с исходным кодом: (1) Сначала определим беззнаковый длинный переменный (32-битный) таймер sleepTimer для получения текущего значения счёта таймера сна: Без подписанияДолгоsleepTimer =0;
sleepTimer |= ST0; //Получите счётное значение текущего таймера сна
sleepTimer |= (без знакаДолго)ST1 <<8; sleepTimer |= (без знакаДолго)ST2 <<16;
(2) Затем добавьте необходимый временной интервал: sleepTimer += ((без знакаДолго)sec * (без знакаДолго)32768); //Плюс необходимая длительность тайминга
Вот небольшое объяснение: Почему единицы обозначает 32768? Поскольку таймер работает ниже 32,768 кГц, на каждый добавленный 1 секунд требуется 1/32768 с; Добавьте 32768, и вам понадобятся 1; (3) Наконец, значение sleepTimer используется как сравнительное значение таймера: ST2 = (без знакаЧар)(sleepTimer >>16); //Установите сравнительное значение таймера сна
ST1 = (без знакаЧар)(sleepTimer >>8); ST0 = (без знакаЧар)sleepTimer;
Таким образом, можно успешно установить таймер~ (Примечание: что касается других частей исходного кода, я считаю, что в сочетании с подробными аннотациями вы легко понимаете, и я не буду повторять это здесь) (4) Экспериментальные результатыПри запуске программы, наблюдая LED1, явление такова:LED1 мигает (то есть включается > выключается один раз), мигает снова через 1 секунду, снова мигает через 2 секунды, затем остаётся выключенным, а затем нажимает S1 — LED1 загорается. Экспериментальное явление полностью соответствует ожиданию: Приём~
3. ЗаключениеО~ После двух свободных дней я наконец получил этот журнал. Я действительно поняла, что написание блога, особенно «дружелюбного для читателя» поста, — это действительно физическая работа: строгость, эстетика, логика... Всё дело в внимательности. Каждый раз, когда я публикую код, мне кажется, что он слишком длинный, но я неохотно пользуюсь складным инструментом, который идёт вместе с блог-садом. Поэтому в этом блоге автор осторожно добавил некоторые элементы JQuery, чтобы добиться плавного складывания кода, и всё ещё остаётся небольшое чувство удовлетворения, хе-хе (новичок JQuery, не смейтесь над мастером~). Но я не уверен, действительно ли это улучшает читаемость статьи, и читатели и друзья могут оставить комментарии :) В этом месяце автор действительно решил укорениться в блог-саде, поэтому я потратил много свободного времени на написание блог-постов. Когда я впервые писал блог, хотя комментариев было мало, большинство логов имели процент кликов выше 500, что было для меня небольшим поддержкой! Публиковать контент о микроконтроллерах в блог-саде требует смелости, но я останусь верен этому~ Девять блог-постов с самого начала и до настоящего времени посвящены использованию базовых аппаратных модулей на чипе CC2430. Пока что мы практически прошли по большинству периферийных устройств CC2430, но всё ещё есть такие функции, как доступ к Flash, генератор случайных чисел, сопроцессор AES, радиочастотная связь и т.д., которые не были затронуты. Однако путь Zigbee не окончен, и автор намерен выборочно заполнить эти пробелы в следующей теме (реализация протокола Z-Stack). В следующем блоге я планирую завершить первую поездку Зигби чуть более полным и расширенным экспериментом — «системой мониторинга температуры» и объяснить, как всестороннее применять полученные ранее знания. На самом деле, он не подходит для того, чтобы называться «ОбъяснениеБудучи новичком, автор лишь надеется поддерживать друг друга и вместе добиваться прогресса в написании докторской степени! </n; i++)
|