Уроки MSP430 LaunchPad. Урок 08: Бьющееся Сердце BCS+

Изучив основы, мы можем перейти к более продвинутым (и более интересным!) темам по использованию микроконтроллеров MSP430. Цель этого урока, узнать про новые виды периферии доступной на микроконтроллере и научиться ее использовать. По ходу дела мы изучим концепцию прерываний и режимов пониженного энергопотребления. Для более глубокого понимания этих уроков, настоятельно рекомендуется обзавестись копией руководства «Семейство микроконтроллеров MSP430x2xx». И спецификациями (datasheet) к конкретным моделям, которые вы используете. Лично я себе все это распечатал, что бы всегда иметь под рукой, но электронные копии, тоже неплохой вариант.

Первое периферийное устройство, которое мы рассмотрим, это Модуль Синхронизации или Basic Clock System + (BCS+), который используется во всем семействе MSP430x2xx микроконтроллеров, включая Value Line (это те, что совместимы с LaunchPad). Детально, модуль синхронизации, рассмотрен в 5-й главе руководства.

Если вспомнить нашу аналогию, где мы сравнивали микроконтроллер с городом, то если в городе, разные городские службы не будут работать синхронно, все придет в полнейший беспорядок. Когда нам включать этот рубильник? Это произошло до или после? В каком порядке это делать, и когда? Каждому городу для синхронизации работы, необходимы часы, и микроконтроллеру тоже.

Трое часов


Каждое семейство MSP430 имеет небольшие различия в системе синхронизации, но принципиальной разницы нет. Часами, управляющими работой микроконтроллера, являются – тактовые сигналы. Семейство микроконтроллеров x2xx использует модуль синхронизации с тремя разными тактовыми сигналами, которые, могут иметь максимальную частоту до 16 мГц. Причина, по которой у нас три сигнала, вместо одного, это попытка достичь компромисса между высокой скоростью работы ядра и способностью минимизировать затраты энергии, экономичность, одна из ключевых особенностей всей линейки MSP430. Высокочастотный тактовый сигнал, приводит к потреблению большего количества энергии, из чего следует, что для уменьшения потребления нужно использовать низкочастотный сигнал. Но есть функционал, требующий быстрой реакции и сложных расчетов, поэтому высокочастотный тактовый сигнал так же необходим. Можно построить свой проект на использовании одного тактового сигнала, но вся мощь скрывается в гибком использовании всех трех. Итак, какие три тактовых сигнала есть в модуле синхронизации BCS+:

  • MCLK – Master Clock, основной тактовый сигнал, он управляет вычислительным ядром и очередью команд вашей программы. Обычно он высокочастотный, но может быть и низкочастотным.
  • SMCLK – Sub-Main Clock, дополнительный тактовый сигнал, он часто используется для периферии. Его частота может совпадать с MCLK, а может отличаться, зависит от приложения.
  • ACLK – Auxilliary Clock, вспомогательный тактовый сигнал, обычно он генерируется извне микроконтроллера, и используется для периферии. В большинстве случаев, он низкочастотный, но может быть и высокочастотным, по выбору.

Четыре источника


В модуле синхронизации BCS+, могут использоваться четыре разных генератора, в качестве источника для трех управляющих тактовых сигналов:

  • LFXT1CLK – имя этого генератора образовано из сочетания “low-frequency crystal” низкочастотный кристалл, обычно он им и является. Кварцевый генератор на 32768 Гц может быть подключен к MSP430 для генерации экономичного, синхронного с реальным временем тактового сигнала. В части моделей x2xx, этот генератор может быть использован и с высокочастотными кварцами от 400 Гц до 16 мГц, зависит от того, подается ли на чип достаточно высокое напряжение питания, для поддержки высокой частоты. Дополнительно, другие резонаторы и внешние источники сигнала могут быть использованы для этого генератора.
  • XT2CLK – имя этого генератора образовано из сочетания “second crystal” второй кристалл, но в данном случае, это всегда высокочастотный кварц. Другие резонаторы и внешние источники сигнала могут быть так же использованы для этого генератора. Этот генератор доступен не во всех моделях серии x2xx.
  • DCOCLK – Digitally controlled oscillator, встроенный генератор с цифровым управлением. Он не такой точный и стабильный, как кварцевые генераторы, но достаточно хорош, и может быть сконфигурирован для работы в широком диапазоне частот.
  • VLOCLCK – Very-low power, встроенный низкочастотный генератор, с очень низким потреблением энергии. VLO может работать медленнее чем часовой кварц LFXT1, его типичная частота около 12 кГц. Этот генератор так же есть не во всех моделях серии x2xx.


Каждый из генераторов, может иметь делитель частоты на 2, 4 и 8. В дополнение, большинство из устройств периферии могут иметь делитель собственной тактовой частоты на 2,4 и 8. Таким образом, от одного генератора, можно получить множество разных тактовых сигналов. Тактовые сигналы MCLK и SMCLK могут использовать любой из четырех генераторов в качестве источника. ACLK может использовать только LFXT1 и VLO. Конфигурация по умолчанию, это когда такты MCLK и SMCLK берутся с генератора DCO, работающего с частотой около 1.1 мГц, а для ACLK источником является LFXT1. Ниже, мы рассмотрим, как сконфигурировать каждый из генераторов.

Итак, модуль синхронизации обеспечивает три разных управляющих тактовых сигнала, каждый из которых можно получить 32-мя разными способами. Тактовые сигналы могут быть разделены индивидуально между разными периферийными устройствами. Это множество комбинаций может удовлетворить почти любые нужды для проектов на MSP430. Мы должны осознать, что TI вложили много усилий в то, что бы система тактирования была столь гибкой, и что даже встроенные генераторы VLO и DCO работают достаточно четко и стабильно. Для отсчета точного времени, конечно, ничто не превзойдет качественный кварцевый генератор, но встроенные генераторы прекрасно работают, а так же могут менять частоту на лету, во время выполнения программы.

Конфигурируем встроенный генератор DCO


Встроенный во все MSP430 генератор с цифровым управлением, одно из важнейших, подконтрольных нам, периферийных устройств. Это легкий в настройке источник тактового сигнала, для него не нужно никаких внешних элементов, он полностью управляется из программы микроконтроллера. DCO управляется двумя регистрами: DCOCTL и BCSCTL1. Посмотрите на карту этих регистров в руководстве по семейству x2xx (стр. 240, п. 5.1).



Данная картинка, взята из руководства, и показывает, как выбираются разные частоты работы DCO. Весь диапазон частот делится на 16 частично перекрывающих друг друга рабочих диапазонов. Например, самая низкая частота 7-го диапазона, совпадает с самой высокой частотой 6-го диапазона, и самая высокая частота 7-го диапазона, совпадает с самой низкой частотой 8-го диапазона. Понятно? Проще говоря, диапазон на графике поделен на восемь вариантов частоты вертикально, и шестнадцать вариантов горизонтально. Просто представьте, что на графике не три ряда, а шестнадцать. В сумме доступно 128 вариантов выбора частоты, перекрывающих друг друга, само собой.

Для выбора частоты мы используем биты RSELx регистра BCSCTL1 (они позволяют выбрать рабочий диапазон от 0 до 15) и биты DCOx регистра DCOCTL (выбор шага от 0 до 7). Как нам узнать, какую именно пару использовать? Спецификация (datasheet) вашего микроконтроллера должна вам помочь в выборе. Для G2x11, можно увидеть таблицу частот в английской спецификации на 22 странице. Для некоторых моделей, эта таблица может содержать только список типичных значений, или примеры установок для максимальных и минимальных значений частоты. TI использует парную нотацию, для описания установок DCO, например DCO frequency (8, 3), что означает частота DCO для диапазона 8 и шага 3 (диапазон, это значение RSELx, шаг, это значение DCOx – Прим. пер.) Мы будем так же использовать парную нотацию DCO (д, ш), где д – диапазон, а ш – шаг.

Например DCO (6,3), это частота 0.80 мГц, в то время как DCO (13,3) 7.8 мГц. Обратите внимание на то, что в этой спецификации, таблица содержит лишь список частот DCO (д, 3), а так же DCO (0,0) и DCO (15,7) как минимальная и максимальная частота соответственно. А как же остальные? Внизу таблицы есть две величины SRSEL — разница частоты между двумя ближайшими диапазонами, и SDCO — разница частоты между двумя ближайшими шагами. Их можно вычислить по формуле SRSEL = (д+1, ш)/(д, ш) и SDCO = (д, ш+1)/(д, ш), в таблице приводятся готовые значения, называемые ratio – соотношение, так для G2211 SRSEL = 1.35 и SDCO = 1.08. Например, частота DCO(6,4) будет SDCO * DCO(6,3), или, в случае G2211, 1.08*0.80 мГц = 0.864 мГц. Частота DCO(6,7) будет SDCO * DCO(6,6) = SDCO * SDCO * SDCO * DCO(6,4) = 1.08^3 * 0.864 = 1.088 мГц. Генеральная формула вычисления частоты будет DCO(д, ш+n) = SDCO^n * DCO(д, ш). (Можно получать и значения частоты для меньшего шага, по принципу DCO(6,1) = DCO(6,3-2) = SDCO ^ (-2) * DCO(6,3))

Последнее замечание, перед тем, как займемся программированием. Каждый микроконтроллер MSP430 идет с завода, минимум с одной откалиброванной частотой DCO. Эта калибровка прописана на заводе в информационный раздел флеш-памяти. Эти значения могут, не совпадать у двух G2211 из разных партий. Если вы случайно (или специально) стерли эту калибровку, среди доступных для загрузки примеров программ на сайте TI, есть программа для перекалибровки DCO и записи значения новой калибровки в память для дальнейшего использования. (Вы можете найти эту программу среди примеров кода для вашей модели микроконтроллера. Код для G2xx можно взять отсюда, программа называется msp430x20xx_dco_flashcal.c). G2x11 имеют только одну откалиброванную частоту, на 1 мГц. (G2553, идущий с новыми LaunchPad, откалиброван на 1, 8, 12 и 16 мГц – Прим. пер.)

Пример


Перейдем к практике. Запустите CCS с присоединённым LaunchPad, и войдите в режим отладчика с любой программой, которая у вас имеется. Мы не собираемся запускать программу, а просто хотим взглянуть на значения регистров, которые выставлены по умолчанию. Микроконтроллеры MSP430, предположительно, запускаются на частоте DCO 1.1 мГц. Какое же там значение на самом деле? В отладчике, откройте окно с информацией о регистрах, и найдите регистры BCS+ в разделе System Clock. У микроконтроллера G2211, по умолчанию, DCOCTL стартует с значением 0x60 и BCSCTL1 с значением 0x87. Раскрыв список отдельных битов регистра, мы можем увидеть, что значение RSEL 0b0111, или 7, а значение DCO 0b011, или 3. Согласно спецификации, значение частоты DCO (7,3) находится где-то между 0.80 мГц и 1.50 мГц. Реальное значение на вашем микроконтроллере зависит от температуры, давления, фазы луны… Ну ладно, может от фазы луны и не зависит, но принцип вы поняли. Если вы счастливый обладатель осциллографа, вы можете посмотреть реальное значение частоты, используя дополнительную функцию вывода P1.4 – SMCLK, он может использоваться, как выход встроенного генератора.

Напишем программку, которая будет менять частоту внутреннего генератора DCO. Нам нужно манипулировать битами DCOx и RSELx, которые являются битами 5 — 7 в DCOCTL и 0 — 3 в BCSCTL1 соответственно. Когда мы выберем ту пару значений, которая нам нужна, просто поменяем эти биты в коде программы. Например, если мы хотим установить частоту DCO (12,2), нам нужно установить значение 0b1100 в битах RSELx и 0b010 в битах DCOx. Мы можем установить эти значения в нашей программе таким образом:

BCSCTL1 &= ~(BIT0 + BIT1);  // устанавливаем биты 0 и 1 в 0
BCSCTL1 |= BIT2 + BIT3;     // устанавливаем биты 2 и 3 в 1
DCOCTL &= ~(BIT5 + BIT7);   // устанавливаем биты 5 и 7 в 0
DCOCTL |= BIT6;             // устанавливаем бит 6 в 1

Имеет ли значение порядок? Помните, что частота меняется на каждом шаге. После первой строчки, биты конфигурации в BCSCTL1 становятся 0b0100, и генератор переходит на частоту DCO (4,3). После второй строчки на DCO (12,3). Третья строчка устанавливает частоту DCO (12,2), последняя строка избыточна, т.к. бит 6 итак равен единице. Если мы начнем со смены значения битов 2 и 3 в RSELx, частота прыгнет из DCO (7,3) в DCO (15,3), и высокая частота тактов пойдет во всю периферию микроконтроллера. Это может не иметь никакого значения, но если у вас установлены какие-либо чувствительные к частоте компоненты, то лучше просчитайте шаги, по которым будет происходить изменение тактовой частоты. Если MCLK работает от DCO (по умолчанию это так), могут возникнуть проблемы, если тактовая частота превысит документированный лимит микроконтроллера в 16 мГц. С другой стороны, резкое падение частоты DCO до очень низких значений, просто замедлит переход программы на следующий шаг, но вряд ли доставит серьезные проблемы.

Установка тактовой частоты на калиброванные значения, очень проста в CCS, т.к. есть готовые сокращения для этих величин:

BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

Этих двух строчек достаточно, чтобы установить частоту внутреннего генератора DCO на 1 мГц (с точностью 3%) (В IAR то же самое, создается ощущение, что в IAR и CSS используются идентичные файлы заголовков – Прим. пер.)

Я написал пример использования DCO в программе dcodemo_g2211.c (её листинг приведен ниже). Изучите его, посмотрите, как он работает на вашем LaunchPad. Программа просто мигает светодиодом с циклом задержки и ждет нажатия кнопки. Затем программа меняет частоту DCO, и снова мигает светодиодом. Т.к. частота увеличивается, мигание светодиода ускоряется, не смотря на то, что цикл задержки не меняется. Т.к. DCO контролирует скорость работы вычислительного ядра микроконтроллера, то цикл задержки отрабатывается за меньшее время. Следующее нажатие кнопки, понижает частоту DCO и снова мигает светодиодом, на этот раз медленнее. Третье нажатие кнопки, возвращает частоту тактового генератора DCO к исходному значению, и все повторяется.

Мы пока не изучили всех возможностей DCO, мы познакомимся с ними по мере нашего прогресса в изучении MSP430. А в следующий раз поговорим об использовании таймеров.

Упражнение: Мой микроконтроллер G2211, который был в комплекте с LaunchPad, использует установку DCO (6,5) для откалиброванной частоты DCO в 1 мГц, и устанавливает биты MODx в 0b00101 (что и есть 5). А как у вас? Напишите программу, использующую откалиброванную частоту в 1 мГц, и посмотрите в отладчике значение битов в регистрах. Предположительно, эти значения индивидуальны у разных чипов, мне интересно, отличаются ли они у кого-нибудь от моих.


/* dcodemo_g2211: демонстрирует конфигурирование DCO, сменой частоты
 * мигания светодиода.  Светодиод использует один и тот же цикл задержки для мигания,
 * но его продолжительность зависит от частоты генератора DCO, задающей такты для  MCLK.
 */

#include <msp430g2211.h>

#define LED1   BIT0
#define BTN1   BIT3

void delay(void);

void main(void) {
	unsigned int i;
	
	WDTCTL = WDTPW + WDTHOLD;
	
	P1OUT = 0;
	P1DIR = LED1;

      // эти две строчки нужны для работы кнопки в LaunchPad 1.5
      //P1REN |= BTN1; //разрешаем подтяжку
      //P1OUT |= BTN1; //подтяжка вывода P1.3 вверх
	
	for (;;) {
		BCSCTL1 &= ~BIT3;                 // устанавливаем DCO (7,3)
		BCSCTL1 |= BIT0 + BIT1 + BIT2;
		DCOCTL &= ~BIT7;
		DCOCTL |= BIT5 + BIT6;
		
		for (i=0; i<5; i++) {             // Мигаем светодиодом 5 раз.
			P1OUT |= LED1;
			delay();
			P1OUT &= ~LED1;
			delay();
		}
		
		while ((P1IN&BTN1) == BTN1);      // ждем нажатия кнопки
		
		BCSCTL1 &= ~(BIT1 + BIT2);        // устанавливаем  DCO (9,5)
		BCSCTL1 |= BIT0 + BIT3;
		DCOCTL &= ~BIT6;
		DCOCTL |= BIT5 + BIT7;
		
		for (i=0; i<5; i++) {             // Мигаем светодиодом 5 раз.
			P1OUT |= LED1;
			delay();
			P1OUT &= ~LED1;
			delay();
		}
		
		while ((P1IN&BTN1) == BTN1);      // ждем нажатия кнопки

		BCSCTL1 &= ~(BIT0 + BIT2 + BIT3); // устанавливаем DCO (2,6)
		BCSCTL1 |= BIT1;
		DCOCTL &= ~BIT5;
		DCOCTL |= BIT6 + BIT7;
		
		for (i=0; i<5; i++) {             // Мигаем светодиодом 5 раз.
			P1OUT |= LED1;
			delay();
			P1OUT &= ~LED1;
			delay();
		}
		
		while ((P1IN&BTN1) == BTN1);      // ждем нажатия кнопки
	}
} // main

void delay(void) {
	unsigned int n;
	for (n=0; n<60000; n++);
} // задержка

Архив с программой.

Примечание переводчика: Как и в предыдущем уроке, я подправил пример, добавив туда пару строк, без которых кнопка на LaunchPad версии 1.5, не заработает. Мы должны разрешить использование подтяжки в регистре порта REN, а затем указать в OUT какой тип подтяжки, вверх или вниз, мы используем.

Если у вас IAR, просто создайте новый проект на Си, настройте в нем тип микроконтроллера и отладчика, замените содержимое main.c на пример из урока. Не забудьте заменить #include <msp430g2211.h> на ваш микроконтроллер, например на #include <msp430g2553.h>. Всё должно заработать.


Оригиналы урока на английском: Tutorial 08-a: The Beating Heart (BCS+ Part I) и Tutorial 08-b: Configuring the DCO

Предыдущий урок этого цикла: Урок 07: Жмем кнопки
Следующий урок этого цикла: Урок 09: Таймеры
  • +14
  • 17 ноября 2012, 05:07
  • Tabke
  • 1
Файлы в топике: dcodemo_g2211.zip

Комментарии (7)

RSS свернуть / развернуть
Вы забыли упомянуть что не всё так замечательно у серии G с тактированием.
Выдержка из документации:

MSP430G22x0: LFXT1 is not present, XT2 is not present, ROSC is not supported.
MSP430F20xx, MSP430G2xx1, MSP430G2xx2, MSP430G2xx3: LFXT1 does not support
HF mode, XT2 is not present, ROSC is not supported.


То есть, высокочастотный внешний кварц не прицепить, только часовой — 32768 Гц.
0
  • avatar
  • SerjT
  • 25 декабря 2012, 22:37
Так вот почему они кладут только часовой кварц) МК из комплекта LP r1.5 (G2452 и G2553) тоже относятся к «LFXT1 does not support HF mode, XT2 is not present, ROSC is not supported»? И, как я понимаю, F2003, F2013, F2012 тоже относятся к этой группе?
И еще, что такое ROSC?
0
А то — жадюги они :)
Да, они входят в указанные серии.
Rosc — это внешний резистор, с помощью которого можно перестраивать DCO.
0
Т.е. на полную скорость (16-20МГц вроде?) эти камни можно разогнать только на DCO?
0
Пока не пробовал, сегодня поэкспериментирую.
0
Таки да, работает зараза на мегагерцах от DCO :)
0
Да, и ещё — регулировка внешним резистором для DCO не поддерживается.
0
  • avatar
  • SerjT
  • 25 декабря 2012, 22:38
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.