Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 9371|Ответ: 0

Zigbee Journey (9): Несколько важных базовых экспериментов CC2430 — систематический сон и прерванное бодрствование

[Скопировать ссылку]
Опубликовано 30.10.2014 23:24:30 | | | |
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Во всех режимах питания таймер сна будетБесперебойная работа

Регистры, используемые таймерами сна, следующие:ST0ST1ST2。 Ниже приведено подробное введение в его функции из китайского руководства 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++)




Предыдущий:Zigbee Journey (8): Несколько важных базовых экспериментов CC2430 — сторожевые собаки
Следующий:Zigbee Journey (10): Комплексный эксперимент — система мониторинга температуры на основе CC2430
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com