Микроконтроллеры STM32 и отладочные платы для них. Работа с ЖК индикатором на отладочной плате STM32L-Discovery Отладочные платы stm32 и компоненты

Датчики МЭМС (Микро-электромеханическая система) — это устройства, производимые по технологии, схожей с технологией производства обычных полупроводниковых элементов. Отличие заключается в том, что в МЭМС объединены электронная схема и механические, оптические или даже жидкостные элементы. В частности, к таким датчикам относятся акселерометры и магнетометры.

Акселерометр — датчик, позволяющий измерять линейное ускорение. Широко применяется в авиационных и морских приложениях, системах защиты, в устройствах автоматизации. В авиационной промышленности данные датчики могут использоваться для стабилизации полета и навигации ракет и самолетов. В системах автоматизации акселерометры могут применяться в навигационных системах, а также в качестве сенсоров в подушках безопасности. По принципу работы датчики ускорения можно разделить на две категории: емкостные и пьезорезистивные. На рисунке 1 изображена схема простейшего емкостного датчика ускорения, объясняющая принцип его работы.

Рис. 1.

Простейший емкостной датчик можно представить механической системой второго порядка, состоящей из тела массой m, пружины K и демпфера h. Когда на систему действует внешнее ускорение, тело двигается в противоположную сторону ускорения. Подобное перемещение тела сказывается на системе из емкостей, которая образована из электродов, подключенных к телу и перемещающихся свободно, и неподвижных электродов, подключенных к подложке. Перемещение тела приводит к изменению емкости, по результатам измерения которого можно определить значение приложенного ускорения.

Простейшая схема пьезорезистивного датчика ускорения изображена на рисунке 2. Принцип работы заключается в следующем: на верхнюю поверхность датчика нанесены пьезорезистивные слои (на рисунке обозначены черным), которые электрически соединены так, чтобы образовался измерительный мост. Когда на систему начинает действовать внешнее ускорение, тонкая подложка начинает изгибаться под действием массы тела, прикрепленного к ней. Деформация подложки приводит к изменению сопротивления пьезорезистивных слоев. Электрическая схема измеряет это изменение. По его величине можно определить направление и значение приложенного ускорения. При производстве акселерометров особое внимание уделяется точности технологического процесса и материалам, из которых выполнены механические части датчиков. Ведь изменение массы и расположения механических частей от датчика к датчику может существенно сказываться на точности измерений.

Рис. 2.

В настоящее время производители акселерометров предлагают огромное количество вариантов исполнения датчиков данного типа. Существуют датчики с аналоговым выходом, а также с цифровыми интерфейсами, к примеру, SPI и I 2 C.

Современные акселерометры компании STMicroelectronics способны измерять ускорения до ±400g с высокой разрешающей способностью (до 16 бит) и очень низким энергопотреблением. Портфолио акселерометров STMicrielectronics, предназначенных для массового рынка, состоит из двух линеек — для автомобильного и промышленного сегмента. Автомобильные акселерометры — и . Промышленные — и .

Магнитометры — датчики, способные измерять магнитное поле Земли по нескольким осям. Они находят применение в потребительской электронике, портативных устройствах и навигационном оборудовании, добавляя в перечень их потребительских характеристик такую интересную функцию, как компас. Среди разнообразных технологий производства магнитных датчиков наибольшее распространение получила технология AMR (анизотропная магниторезистивная). Данная технология позволяет совместить такие важные параметры, как высокая разрешающая способность и точность, и при этом иметь очень низкое энергопотребление. На рисунке 3 изображена упрощенная схема работы данного датчика.

Рис. 3.

В качестве чувствительного элемента используется измерительный мост, образованный из магниторезистивных проводников, сопротивление которых изменяется при приложении внешнего магнитного поля перпендикулярно току, протекающему через проводник. Измерение величины изменения сопротивления позволяет определить величину приложенного магнитного поля. Компания STMicro производит магнитометры в одном корпусе с акселерометром, называя свой продукт e-Compass. Обозначения таких изделий начинаются с .

Линейка микроконтроллеров STM32F3

  • Сortex-M4- DSP- FPU;
  • Fmax = 72 МГц;
  • до 256 кбайт FLASH;
  • до 40 кбайт SRAM;
  • 8 кбайт CCM-SRAM;
  • напряжение питания от 2 до 3,6В. У некоторых контроллеров возможно питание от 1,8В±8%;
  • два 16 бит таймера с MC, работающих на 144MГц;
  • до 87 быстрых IO (AHB);
  • -40…105°C;
  • Корпуса LQFP 48/64/100

Рис. 5. Структурная схема

Основные характеристики :

  • Cortex-M4- DSP- FPU;
  • Fmax = 72МГц;
  • до 256 кбайт FLASH;
  • до 32 кбайт SRAM;
  • напряжение питания от 2 до 3,6В. У некоторых возможно питание от 1,8В±8%;
  • 3 x 16 бит дельта-сигма АЦП;
  • до 84 быстрых IO (AHB);
  • -40…105°C;
  • корпуса LQFP 48/64/100 BGA100.

Рис. 6. Структурная схема

Для быстрого освоения работы микроконтроллеров серии STM32F3 компания STMicroelectronics предлагает отладочную плату (рисунок 7).

Рис. 7.

Основные характеристики отладочной платы STM32F3DISCOVERY:

  • контроллер :
    • 256 кбайт FLASH

      48 кбайт RAM;

  • две тактовые кнопки- Reset и кнопка пользователя;
  • трехосевой MEMS-гироскоп с цифровым выходом ;
  • МЭМС e-Compass с трехосевым акселерометром и трехосевым магнитным датчиком ;
  • 10 светодиодов;
  • разъем USB-OTG;
  • порты микроконтроллера разведены на два разъема;
  • в плату интегрирована схема программатора-отладчика ST-LINK/V2 с разъемом miniUSB.

Требования к системе:

  • Windows PC (XP, Vista, 7)
  • USB кабель тип-A — Mini-B

На плате установлены две MEMS-микросхемы: трехосевой гироскоп L3GD20 и выполненные в одном корпусе трехосевой датчик ускорения и трехосевой датчик магнитного поля LSM303DLHC. Установленный на плате гироскоп L3GD20 (на рисунке 8 изображена блок-схема гироскопа) обладает следующими характеристиками:

  • конфигурируемый диапазон измерений 250/500/2000dps;
  • цифровой интерфейс для связи с контроллером I 2 C/SPI.;
  • данные выдаются в 16-битном формате;
  • встроенный 8-битный датчик температуры;
  • миниатюрный корпус LGA 16 с размерами всего 4х4х1мм;
  • рабочий диапазон температур -40…85°С;
  • напряжение питания 2,4…3,6В;
  • поддержка работы низковольтовых цифровых интерфейсов (1,8В);
  • наличие FIFO-буфера.

Рис. 8.

К дополнительным плюсам платы STM32F3DISCOVERY можно отнести отдельный разъем, на который выведены сигналы программатора-отладчика ST-LINK/V2. Наличие этого разъема позволяет использовать отладочную плату как программатор для других устройств собственной разработки на основе контроллеров STMicroelectronics.

Для быстрого старта STMicro предоставляет пакет готовых приложений и примеров программ для контроллеров семейства . В состав пакета STSW-STM32118 входит 28 примеров программ и четыре проекта для различных сред разработки. Примеры приложений находятся в свободном доступе и доступны для скачивания с сайта по ссылке http://www.st.com/web/en/catalog/tools/PF258154 .

Отладочная плата поставляется уже с загруженной демонстрационной программой. При нажатии на кнопку «User» происходит переключение между режимами работы восьми светодиодов, от простого мигания — до отображения углов наклона либо отображения направления на север.

В качестве примера рассмотрим реализацию компаса на отладочной плате STM32F3DISCOVERY, а также разберем программу для работы с интегральной MEMS микросхемой LSM303DLHC.

Начнем со схемы подключения к микроконтроллеру . Напомним, что микросхема LSM303DLHC — это трехосевой акселерометр и трехосевой датчик магнитного поля, объединенные в одном корпусе LGA-14. Блок-схема MEMS-ИС LSM303DLHC представлена на рисунке 9. Связь с микроконтроллером осуществляется при помощи двухпроводного интерфейса I 2 C, также в микросхеме предусмотрены два сигнала готовности данных: один — для датчика ускорения, другой — для датчика магнитного поля. Наличие таких сигналов позволяет упростить синхронизацию обмена данными между микроконтроллером и MEMS-микросхемой. Доступ к регистрам данных и настроечным регистрам микросхемы LSM303DLHC осуществляется также через интерфейс I 2 С.

Рис. 9.

Для реализации компаса на отладочной плате STM32F3DISCOVERY нам потребуется организовать работу с датчиком магнитного поля и датчиком ускорения.

Акселерометру по умолчанию присвоен 7-битный адрес 0011001b — 32h. Данный адрес дополняется битом чтения-записи. Если бит чтения-записи равен 1, то происходит вычитывание данных из регистров датчика ускорения, если он равен 0 — запись: 00110011 (33h) — чтение из регистров, 00110010 (32h) — запись.

По умолчанию датчику магнитного поля присваивается 7-битный адрес 0011110xb. Причем младший бит в поле адреса (обозначен «х») отвечает за тип операции, 1 в младшем бите отвечает за операцию чтения (00111101b — 3Dh), 0 — запись (00111101b — 3Ch).

В цифровом интерфейсе магнитного датчика используется счетчик адреса, который показывает, в какой регистр планируется осуществить запись или чтение. В целях уменьшения потока данных между микроконтроллером и магнитным датчиком, в микросхеме реализовано автоматическое увеличение данного счетчика без участия мастера (в данном случае контроллера ). Изменение значения счетчика адреса происходит по следующим правилам: если значение счетчика становится равным 12 или выше — происходит сброс счетчика адреса в 0. Если значение счетчика адреса достигает значения 8, счетчик принимает значение равное 3. Во всех остальных случаях при каждом запросе к датчику происходит увеличение счетчика адреса на 1. Значение счетчика адреса нельзя вычитать по интерфейсу I 2 C.

В датчике магнитного поля можно настроить частоту выдачи данных, коэффициент усиления, а также режим работы датчика. Задание параметров происходит путем записи нужных данных в регистры: CRA_REG_M (адрес 00h), CRB_REG_M (адрес 01h), MR_REG_M (адрес 02h).

В регистре CRA_REG_M (адрес 00h) задается частота выдачи данных:

0 0 0 DO2 DO1 DO0 0 0

Для корректной работы 0, 1, 5, 6, 7 биты должны быть всегда записаны 0. Биты DO2…DO0 задают частоту выдачи данных, значение по умолчанию (100) — см. таблицу 1.

Таблица 1. Напряжение источника питания и пороговое напряжение для микросхем M41T83

DO2 DO1 DO0 Частота выдачи данных, Гц
0 0 0 0,75
0 0 1 1,5
0 1 0 3,0
0 1 1 7,5
1 0 0 15
1 0 1 30
1 1 0 75
1 1 1 220

В регистре CRB_REG_M (адрес 01h) задается коэффициент усиления для всех каналов измерения:

GN2 GN1 GN0 0 0 0 0 0

Биты с 0 по 4 должны быть обязательно заполнены нулями — см. таблицу 2.

Таблица 2. Задание коэффициента усиления в датчике магнитного поля

GN2 GN1 GN0 Диапазон измеряемого поля, Гс Усиление X/Y и Z, LSB/Гс Усиление Z, LSB/Гс Диапазон выходных
значений
0 0 1 ±1,3 1100 980 0xF800-0x07FF (-2048-2047)
0 1 0 ±1,9 855 760
0 1 1 ±2,5 670 600
1 0 0 ±4,0 450 400
1 0 1 ±4,7 400 355
1 1 0 ±5,6 330 295
1 1 1 ±8,1 230 205

В регистре MR_REG_M (адрес 02h) задается режим работы датчика магнитного поля:

0 0 0 0 0 0 MD1 MD0

Биты с 2 по 7 должны быть обязательно заполнены нулями — см. таблицу 3.

Таблица 3. Задание режима работы датчика магнитного поля

MD1 MD0 Режим работы
0 0 Режим непрерывного измерения
0 1 Режим единичного измерения
1 0 Спящий режим
1 1 Спящий режим

В регистрах OUT_X_H_M (адрес 03h), OUT_X_LH_M (адрес 04h) хранятся данные о величине магнитного поля вдоль оси Х.

В регистрах OUT_Z_H_M (адрес 05h), OUT_Z_LH_M (адрес 06h) хранятся данные о величине магнитного поля вдоль оси Z.

В регистрах OUT_Y_H_M (адрес 07h), OUT_Y_LH_M (адрес 08h) хранятся данные о величине магнитного поля вдоль оси Y.

Помимо данных о величине магнитного поля для расчетов нам потребуются данные о величине углов наклона относительно оси Z. (Здесь и в дальнейшем под осью Z будет пониматься ось, перпендикулярная плоскости отладочной платы). Данные об углах нужны, так как зачастую плата может находиться не на идеально ровной горизонтальной поверхности, и эти отклонения стоит учесть в дальнейших расчетах.

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

Регистр CTRL_REG4_A (адрес 23h) — один из регистров настройки работы акселерометра:

BDU BLE FS1 FS0 HR 0 0 SIM

Таблица 4. Ячейки регистра CTRL_REG4_A

BDU Значение по умолчанию 0. 0 - непрерывное обновление данных; 1 - данные не обновляются, пока происходит чтение из младшего или старшего байта данных
BLE Порядок следования байтов (Big/little endian) 0 - LSB, 1 - MSB
FS1 Выбор полной шкалы измерения 00: ± 2G, 01: ± 4G, 10: ± 8G, 11: ± 16G
FS0
HR Режим высокого разрешения. По умолчанию 0 - отключен
SIM Режим работы SPI интерфейса

В регистрах OUT_X_L_A (адрес 28h), OUT_X_H_A (адрес 29h) хранятся данные о величине ускорения вдоль оси Х.

В регистрах OUT_Y_L_A (адрес 2Ah), OUT_Y_H_A (адрес 2Bh) хранятся данные о величине ускорения вдоль оси Y.

В регистрах OUT_Z_L_A (адрес 2Ch), OUT_Z_H_A (адрес 2Dh) хранятся данные о величине ускорения вдоль оси Z.

Теперь разберем пример программы, позволяющей реализовать компас на отладочной плате STM32F3DISCOVERY. За основу был взят исходный код демонстрационной программы, архив с исходными кодами и библиотеками для работы с контроллером STM32F3 был скачан с официального сайта компании STMicroelectronics.

Далее будут даны функции для работы с микросхемой LSM303DLHC и функции для расчета углов и величины магнитного поля. В листинге 1 и 2 отображены функции для чтения данных из акселерометра и магнитометра микросхемы LSM303DLHC.

Листинг 1. Функция для чтения данных акселерометра

void Demo_CompassReadAcc(float* pfData)

int16_t pnRawData;

uint8_t buffer, cDivider;

float LSM_Acc_Sensitivity = LSM_Acc_Sensitivity_2g;

/* Вычитываем значение регистра контроля микросхемы LSM303 и также значения 6 регистров данных (по 2 регистра на каждую ось X, Y, Z)*/

LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A, ctrlx,2);

LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A, buffer, 6);

/*Вычисление ускорения по трем осям*/

for(i=0; i<3; i++)

pfData[i]=(float)pnRawData[i]/LSM_Acc_Sensitivity;

Листинг 2. Функция для чтения данных магнитометра

void Demo_CompassReadMag (float* pfData)

static uint8_t buffer = {0};

uint8_t CTRLB = 0;

uint16_t Magn_Sensitivity_XY = 0, Magn_Sensitivity_Z = 0;

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_CRB_REG_M, &CTRLB, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, buffer, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_L_M, buffer+1, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_M, buffer+2, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_M, buffer+3, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_M, buffer+4, 1);

LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_M, buffer+5, 1);

for(i=0; i<2; i++)

pfData[i]=(float)((int16_t)(((uint16_t)buffer << 8) + buffer)*1000)/Magn_Sensitivity_XY;

pfData=(float)((int16_t)(((uint16_t)buffer << 8) + buffer)*1000)/Magn_Sensitivity_Z;

Алгоритм работы компаса

Чтобы реализовать компас на отладочной плате , нам потребуется вычислить угол()азимут между направлением вектора магнитного поля земли и осью Х магнитометра. Ось Х выбрана для примера, для вычислений можно взять любую другую ось, изменения коснутся только вычислений. Итак, в простейшем случае, когда плата находится параллельно плоскости земли без наклона относительно оси Z, для вычисления азимута нам потребуются данные о величине магнитного поля вдоль осей X и Y магнитометра. Это проекции вектора магнитного поля земли на оси X и Y. Тогда для вычисления угла мы сможем воспользоваться простейшей тригонометрической формулой: arctg(Y/X), где Y и X — величины проекций на оси Y и X соответственно. Но если демонстрационная плата располагается под определенным углом к поверхности земли, то в данной формуле необходимо использование и учет этого наклона. Для этих целей прекрасно подойдет встроенный в микросхему LSM303DLHC акселерометр. Потребуются данные об ускорении по каждой из осей. Эти данные позволят рассчитать углы крена и тангажа, которые впоследствии будут учитываться при вычислении направления на север.

Вычитывание данных из магнетометра и акселерометра происходит путем использования функций (расписаны в листингах 1 и 2):

Demo_CompassReadMag(MagBuffer);

Demo_CompassReadAcc(AccBuffer);

Для вычисления углов сначала производится расчет значения модуля ускорения:

fNormAcc=sqrt((AccBuffer*AccBuffer)+(AccBuffer*AccBuffer)+(AccBuffer*AccBuffer));

Затем, используя стандартные тригонометрические формулы для расчета косинусов и синусов углов (зная значения длин катетов и гипотенузы), получаем выражения для углов крена (Roll) и тангажа (Pitch):

fSinRoll = -AccBuffer/fNormAcc;

fCosRoll = sqrt(1.0 — (fSinRoll * fSinRoll));

fSinPitch = AccBuffer/fNormAcc;

fCosPitch = sqrt(1.0 — (fSinPitch * fSinPitch));

Потом рассчитывается значение самих углов крена и тангажа:

RollAng = acos(fCosRoll) * 180/PI;

PitchAng = acos(fCosPitch) * 180/PI;

При этом в зависимости от знака синуса и косинуса необходимо прибавить 180 либо 360 градусов, чтобы угол оказался в нужном квадранте.

Зная величину углов крена и тангажа, можно внести соответствующие поправки в формулу для вычисления угла между осью Х и направлением на север. Значение величины магнитного поля вдоль оси Х с учетом поправок:

fTiltedX = MagBuffer*fCosPitch+MagBuffer*fSinPitch;

Значение величины магнитного поля вдоль оси Y с учетом поправок:

fTiltedY=MagBuffer*fSinRoll*fSinPitch+MagBuffer*fCosRoll — MagBuffer*fSinRoll*fCosPitch;

Вычисленное значение угла:

HeadingValue = (float) ((atan2f((float)fTiltedY,(float)fTiltedX))*180)/PI;

Для работы с демонстрационной платой можно воспользоваться специальной программой Unico GUI, разработанной компанией STMicroelectronics. Программа позволяет в графическом виде отобразить на экране монитора данные, полученные с помощью датчика ускорения и датчика магнитного поля. На рисунке 10 отображена одна из вкладок программы для демонстрации компаса.

Рис. 10.

В поле Ref1 отображается направление компаса в градусах. В поле Ref2 располагается цветная полоса статуса калибровки. В поле Ref3 данные компаса отображаются в графическом виде. Помимо отображения данных программа Unico GUI позволяет быстро настроить регистры акселерометра, магнетометра, гироскопа. Программа может работать с различными демонстрационными платами для МЭМС-микросхем. Подробное описание всех ее функций и возможностей находится в руководстве пользователя .

Заключение

Компания STMicroelectronics постоянно работает над усовершенствованием продукции, в частности, появляются новые линейки микроконтроллеров для новых, ранее не охваченных, рынков, улучшаются характеристики отдельных модулей микроконтроллера, появляются новые МЭМС-датчики с улучшенными характеристиками, с большей интеграцией. Например, в начале 2013 года компания вывела на рынок акселерометр + микроконтроллер Cortex-M0 в одном корпусе LGA 3x3x1 мм.

Отладочная плата STM32F3DISCOVERY является наиболее оптимальным, бюджетным, быстрым и простым решением для изучения и внедрения в свои разработки контроллеров нового семейства STM32F3. Полезна она и для изучения принципов работы акселерометров, гироскопов и датчиков магнитного поля.

Получение технической информации, заказ образцов, поставка — e-mail:


Уже много лет радиолюбители применяют восьмиразрядные микроконтроллеры семейств PIC и AVR. Они популярны благодаря низкой цене, наличию подробной документации, простоте программирования и лёгкости монтажа. Однако довольно часто бывают случаи, что мощности такого микроконтроллера для решения поставленной задачи недостаточно. Самый простой пример - частотомер или генератор сигналов на микроконтроллере, где максимальная измеряемая или генерируемая частота напрямую зависит от скорости обработки или вывода информации.

Помимо скорости, восьмиразрядные микроконтроллеры имеют и другие ограничения, например, во многих моделях AVR всего один аппаратный последовательный порт, что не позволяет получать информацию от внешнего устройства и одновременно пересылать результаты её обработки потребителю. Не говоря уже о таких "банальных" вещах, как вывод информации на графический индикатор, требующий больших ресурсов как скорости, так и памяти. После анализа ряда таких ограничений у автора возникла мысль о переходе на микроконтроллеры семейства STM32.

Для примера рассмотрим два микроконтроллера одной ценовой категории - STM32F103C6 и ATmega328P.

Таблица 1

Тип микроконтроллера

Разрядность процессора

Шаг выводов, мм

Тактовая частота, МГц

Объём FLASH-памяти. Кбайт

Объём ОЗУ, Кбайт

Число USART

Число 16-разрядных таймеров

Число линий ввода-вывода

Ориентировочная цена, руб.

Их сравнительные параметры приведены в табл. 1. Результаты сравнения даже несколько удивляют. 32-разрядный микроконтроллер не только мощнее восьмиразрядного практически по всем параметрам, но при этом дешевле. Разумеется, паять микроконтроллер с шагом выводов 0,5 мм в домашних условиях не так-то просто. К счастью, в большинстве случаев этого и не требуется - на рынке имеется множество разновидностей отладочных плат с микроконтроллерами семейства STM32, достаточных для различных применений. Рассмотрим их более подробно.

STM32F4-DISCOVERY

Эта плата (она изображена на рис. 1), пожалуй, наиболее удобна для начинающих изучение микроконтроллеров STM. Во-первых, она имеет большой набор периферийных устройств. Помимо микроконтроллера, на плате установлены микроэлектромеханический акселерометр, микрофон, аудиоЦАП, два разъёма USB, кнопка и четыре светодиода.

Выводы микроконтроллера выведены на контактные площадки для монтажа штыревых разъёмов у левого и правого краёв платы, что позволяет легко подключать к ним все необходимые внешние устройства. Установленный на плате микроконтроллер STM32F407VGT6 имеет весьма неплохие параметры: 1 Мбайт FLASH-памяти, 192 Кбайт ОЗУ и тактовую частоту 168 МГц.

И наконец, плата оборудована встроенным отладчиком ST-LINK/V2, который можно использовать для отладки программ не только на имеющемся на плате микроконтроллере, но и на микроконтроллерах того же семейства, находящихся на других платах. Переключение на них выполняется с помощью съёмной перемычки и разъёма SWD.

Цена платы - около 800 руб., что можно считать вполне приемлемым.

STM32F103RBT6 Development Board

Следующим интересным вариантом является отладочная плата с микроконтроллером STM32F103RBT6 (рис. 2).

Он несколько слабее, чем установленный на предыдущей плате - тактовая частота 72 МГц, 128 Кбайт FLASH-памя-ти и 20 Кбайт ОЗУ, однако периферийные устройства весьма интересны. Имеются сенсорный TFT-экран с разрешением 320x240 пкс и диагональю 2.8", встроенный USB-порт для обмена информацией с компьютером, разъём для карты памяти SD, часовой кварц на 32768 Гц, отсек для элемента питания часов реального времени и разъём ST-LINK для отладки программ.

Цена этой платы также около 800 руб., но следует заметить, что встроенного отладчика на ней нет. Для загрузки программ необходимо либо приобрести отдельный отладчик ST-LINK, либо использовать вместо него рассмотренную выше плату STM32F4-DISCOVERY

Maple Mini

Бросается в глаза внешнее сходство этой платы (рис. 3) с широко известными модулями Arduino. И это не случайно.

Плата Maple Mini и была разработана как замена Arduino Nano. Язык программирования и среда разработки для устанавливаемых в Arduino микроконтроллеров семейства AVR были адаптированы под семейство STM. На интернет-странице http://leaflabs.com/docs/maple-q uickstart.html можно найти подробную информацию о языке программирования и среде разработки Maple IDE.

Отладочная плата имеет микроконтроллер STM32F103CBT6, работающий на тактовой частоте 72 МГц, имеющий 128 Кбайт FLASH-памяти и 20 Кбайт ОЗУ, что, несомненно, больше, чем в любом модуле Arduino. И тем больший плюс, что среда разработки практически не изменилась.

Отдельно заметим, что несмотря на миниатюрные размеры, Maple Mini предоставляет весьма разнообразную периферию: 34 линии ввода/вывода, два интерфейсных канала SPI и два I2C, три последовательных порта. Это позволяет с успехом применять её в различных любительских разработках. Благодаря малым размерам Maple Mini может быть встроена непосредственно в разрабатываемое устройство.

Оригинальную плату Maple Mini можно приобрести за 35 долл. США на сайте её разработчиков. Ещё 5 долл. США будет стоить доставка. Копия платы, изготовленная в Китае, обойдётся вдвое дешевле.

Программное обеспечение

Существуют несколько вариантов сред разработки, которые можно использовать для подготовки программ для микроконтроллеров семейства STM32:

Коммерческие IAR Embedded Workbench, AtollicTrueSTUDIO, Keil и др. Эти полнофункциональные продукты довольно дороги, с ценой лицензии от 1000 евро, но имеются и демонстрационные бесплатные версии с ограничением на объём разрабатываемой программы, для большинства несложных проектов их вполне хватает;

Бесплатная Eclipse с компилятором ARM-GCC требует нетривиальной настройки компилятора перед использованием. Единственный плюс на сегодняшний день - возможность работы не только в Windows, но и в Linux;

Бесплатная CooCox IDE (CoIDE) на базе того же редактора Eclipse. Выполняет загрузку и отладку программ через ST-LINK. В отличие от предыдущего варианта, CoIDE не требует каких-либо специальных настроек и работает сразу же после установки. Этот вариант наиболее удобен, им и стоит воспользоваться.

Воспользуемся CooCox IDE для создания примера программы для платы STM32F4-DISCOVERY реализующей классическое для первой программы для любого микроконтроллера мигание светодиодов. На плате STM32F4-DIS-COVERY имеются четыре светодиода, подключены они к выводам PD12- PD15 микроконтроллера. Сделаем так, чтобы они мигали поочерёдно.

Шаг 1. Запускаем среду разработки CoIDE, создаём проект. Из выпадающего списка, показанного на рис. 4, выбираем микроконтроллер STM32F407VG.

Шаг 2. Как показано на рис. 5, выбираем компоненты, которые будут использованы в проекте. Основные из них - это GPIO (ввод-вывод), С Library (базовые функции языка С) и M4 Core (функции ядра процессора). При активизации того или иного компонента CoIDE автоматически копирует нужные файлы в папку проекта, что очень удобно.

Шаг 3. Ввод текста программы. Он довольно короткий и приведён в табл. 2.

Как можно видеть, всё просто и очевидно. Те, кто писал программы для микроконтроллеров AVR, наверняка увидят знакомые конструкции - инициализацию портов с указанием направления (ввод или вывод), главный цикл, в котором выполняются нужные действия. В целом же синтаксис программы полностью соответствует языку С, литературы по которому более чем достаточно. Статей по программированию для STM32 в Интернете также немало. Много примеров поставляется вместе с отладочной платой, их тоже можно использовать как образцы.

После ввода текста программы нажатием на экранную кнопку "Download to flash" она загружается в микроконтроллер. Светодиоды на плате начинают мигать. Отдельно стоит отметить возможности отладки - в любом месте программы может быть поставлена точка останова, можно запускать программу по шагам, просматривая значения переменных.

Разумеется, этот пример не идеален. Например, для управления миганием светодиодов можно воспользоваться прерываниями от таймера, что освободит главный цикл программы для других задач. Желающие могут разобраться с этим самостоятельно.

Заключение

В целом, после первого знакомства микроконтроллеры семейства STM32 оставили весьма приятное впечатление. Всё оказалось не так сложно, а удобство среды разработки, процесса отладки и большое число стандартных функций чем-то даже напомнили переход от Ms DOS к Windows - общие моменты вроде те же, но все гораздо удобнее и функциональнее.

Но главным недостатком этого семейства для любительских разработок всё-таки остаётся слишком мелкий шаг выводов. Спроектировать и спаять плату с шагом выводов 0,5 мм в домашних условиях - задача весьма нетривиальная. Но при существующих ценах каждому радиолюбителю вполне доступны отладочные платы с уже смонтированными микроконтроллерами.

Стоит ли переделывать всё на STM и 32-разрядную архитектуру? Конечно же, нет. Есть задачи, для решения которых и ATtiny вполне достаточно. Но, например, для анализа спектра в самодельном SDR-приёмнике или приёма- передачи больших объёмов информации по сети гораздо эффективнее сразу применить мощный микроконтроллер, чтобы не упереться в недостаток памяти или производительности при совершенствовании устройства.

На основе ядра Cortex начали активно набирать популярность, как среди профессиональных, так и среди начинающих разработчиков устройств на микроконтроллерах. Причин тому несколько:
- невысокая цена по сравнению с конкурентами;
- большое количество встроенных интерфейсов;
- простота в программировании и высокая надежность.
Но при этом есть и один важный недостаток – все микроконтроллеры STM не выпускаются в DIP корпусах, что зачастую просто отпугивает новичков, ведь изготовить плату с дорожками менее 0,3мм в домашних условиях проблематично. Такое положение дел привело к появлению на рынке огромного количества отладочных плат, как от ST Microelectronics (Discovery), так и платы, выпущенные сторонними фирмами (Olimex, Pinboard). Мой выбор пал на Discovery по трем причинам:
- относительно невысокая цена (плату можно купить от 300р.);
- хорошее качество исполнения (хотя некоторые претензии к разводке есть, но они не столь существенны);
- много исходников и примеров выложено на сайте производителя;
- наличие встроенного программатора (вам не придется покупать его отдельно).
Цель первого урока – помочь начинающему разработчику выбрать отладочную плату, а в дальнейшем - научить основам программирования.
Итак, поехали.

STM32F0DISCOVERY

Данная плата была выпущена в феврале 2012 года с целью привлечения разработчиков, ранее использовавшие 8-ми битные микроконтроллеры, тем самым заняв эту нишу. Ничего плохого, как и хорошего, о ней сказать не могу. Обычная плата, недорогая, для начала подходит отлично. Имеет следующие характеристики:
- микроконтроллер: STM32F051R8T6 (Cortex M0, 48МГц, flash 64Кб, RAM 8Кб);
- встроенный ST-link/V2, который можно использовать отдельно от платы;
- питание от USB или от внешнего источника 3/5В;
- 4 светодиода и 2 кнопки;
- интерфейсы: USART, SPI, I2C, HDMI;
- таймеры 16 и 32 бит;
- все выводы выведены на две однорядных гребенки.
Собственно такая плата уже достаточно устарела, и брать ее рекомендуется только для самого начала обучения.

STM32VLDISCOVERY

Отличается от предыдущей платы только процессором STM32F100RBT6B (Cortex M3, 24МГц, flash 128Кб, RAM 8Кб) и разводкой гребенок периферии. Так же как и выше рассмотренная подходит для начинающих разработчиков. Больше о ней сказать и нечего.

STM32LDISCOVERY

STM32LDISCOVERY достойный результат эволюции предыдущей платы. Вот что в ней есть интересного:
- микроконтроллер STM32L152RBT6 (Cortex M3, 32МГц, flash 128Кб, RAM 8Кб, EEPROM 4Кб)
- интерфейсы: USB, USART, SPI, I2C;
- 8 таймеров;
- 24-канальный 12-битный АЦП;
-12-битный ЦАП;
- часы реального времени;
- контроллер LCD 8х40
- встроенный ST-link/V2.
На плате установлены:
- LCD дисплей 24х8;
- 4 светодиода;
- 2 кнопки;
- сенсорная клавиатура;
- 2 однорядные гребенки со свободными выводами.
О USB хочется сказать отдельно: контроллер поддерживает USB 2.0 full speed, режимы host и device, что нечасто встретишь у МК такого класса.
По сути плата оптимальный вариант для работы с ядром Cortex-M3, так что можно смело брать, благо цена невысокая.

STM32F3DISCOVERY

STM32F3DISCOVERY относится к следующему поколению отладочных плат от STM и обладает следующими характеристиками:
- микроконтроллер STM32F303VCT6 (Cortex M4, 72МГц, flash 256Кб, RAM 48Кб)
- часы реального времени;
- встроенный ST-link/V2;
- 13 таймеров;
- 12 канальный DMA контроллер;
- 4 АЦП;
- 4 операционных усилителя;
- интерфейсы: CAN, USB 2.0, USART/UART, SPI, I2C;
- 87 линий GPIO.

- пользовательский USB-порт;
- 3-х осевой акселерометр и 3-х осевой геомагнитный сенсор в одном корпусе;
- 3-х осевой гироскоп;
- 10 светодиодов;
- 2 кнопки;
- 2 двухрядные гребенки.
Очень интересная плата, много возможностей для опытов. В целом мнение о ней осталось хорошее, но ее заточенность под отслеживание физического состояния и положения сильно сокращают простор для экспериментов, хотя легко можно самому сделать плату расширения.

STM32F4DISCOVERY

С этой платой мне довелось работать больше всего, да и понравилась она мне больше остальных – сказалась ее всесторонняя направленность.
Вот что она из себя представляет:
- микроконтроллер STM32F407VGT6 (Cortex M4, 168МГц, flash 1Мб, RAM 192Кб)
- встроенный ST-link/V2;
- таймеры;
- DMA контроллер;
- АЦП/ЦАП;
- интерфейсы: CAN, USB 2.0, USART/UART, SPI, I2C, GPIO;
На плате размещена следующая периферия:
- пользовательский USB-порт;
- 3-х осевой акселерометр;
- 8 светодиодов;
- 2 кнопки;
- 2 двухрядные гребенки;
- аудио ЦАП с усилителем класса D;
- всенаправленный цифровой микрофон.

Как я писал выше, эта плата стала для меня основной, порадовала способность работы со звуком, акселерометр.

Дальнейшие уроки будут основываться именно на этой плате.

Резюме.
Если вы решили начать работать с отладочными платами STM, то советую брать именно STM32F4DISCOVERY, на мой взгляд, у нее наибольший функционал. Дальнейшие статьи будут основываться именно на работе с ней. В ближайшее время будут написаны статьи на следующие темы:
- работа с GPIO, таймерами, прерываниями и т.п.;
- работа с интерфейсами UART, SPI, I2C и 1-wire на примерах реальных устройств, таких как дисплеи, GPS и GSM модули, датчики температуры, связь с компьютером по RS-232 и многое другое.
Конечная цель этого цикла – создание платы расширения для STM32F4. Все прошивки и схемы будут общедоступны.

Общие сведения

На отладочной плате STM32L-Discovery установлен жидкокристаллический индикатор (ЖКИ, англ. LCD. Liquid crystal display), имеющий шесть 14 сегментных знаков, 4 знака двоеточия (Colon), 4 точки (DP), 4 полоски (Bar). Все сегменты объединены в группы СOM0, COM1, COM2, COM3 по 24 сегмента. Каждая группа имеет свой отдельный «общий провод».


На отладочной плате установлен микроконтроллер STM32L152RBT6. В микроконтроллере есть встроенный контроллер ЖКИ, который управляет монохромными жидкокристаллическими индикаторами.
Контроллер ЖКИ:

  1. Позволяет настраивать частоту обновлений (частоту кадров - частота, с которой обновляется информация на ЖКИ)
  2. Поддерживает статический и мультиплексный режим управления
  3. Поддерживает программную установку контраста
  4. Позволяет использовать несколько уровней управляющего напряжения (до четырех)
  5. Использует двойную буферизацию, позволяющую обновлять данные в регистрах LCD_RAM в любое время выполнения программы, не нарушая целостность отображаемой информации

Регистры памяти контроллера ЖКИ

В микроконтроллере STM32L152RB выделены специальные регистры LCD_RAM, информация, хранимая в которых, соответствует группе сегментов COM0 - COM3. Каждой группе соответствует два 32 разрядных регистра. Такое количество регистров позволяет микроконтроллеру управлять ЖКИ c большим количеством сегментов, чем установленным на отладочной плате.

Для управления ЖКИ со 176 сегментами используются 4 группы COM0 - COM3 по 44 сегмента каждая, для управления ЖКИ с 320 сегментами используются 8 групп COM0 - COM7 по 40 сегментов каждая.



На отладочной плате STM32L-Discovery используется ЖКИ с 96 сегментами, разделенными на 4 группы COM0 - COM3 по 24 сегмента каждая.


ЖКИ на отладочной плате STM32L-Discovery подключен таким образом, что используются биты S40, S41 вторых регистров LCD_RAM в каждой группе и биты S0-S27 первых регистров LCD_RAM. Для уменьшения количества используемых регистров, информация из битов S40-S43 будет записываться в свободные биты S28-S31, используя функцию переназначения (remapping).

Блок делителей частоты

Блок делителей частоты (Frequency generator) позволяет добиться различной частоты кадров (frame rates) на ЖКИ в диапазоне от 32 кГц до 1 МГц. В качестве источника тактирующего сигнала могут использоваться:
  1. Внешний НЧ генератор с частотой 32 кГц (LSE. Low speed external)
  2. Внутренний НЧ генератор с частотой 37 кГц (LSI. Low speed internal)
  3. Внешний ВЧ генератор с делителями частоты на 2,4,8 и 16 и максимальной частотой 1 МГц. (HSE. High speed external)
Для достижения точной синхронизации и снижения смещения напряжения постоянного тока через сегменты ЖКИ источник тактирующего сигнала должен обладать стабильностью. Тактирующий сигнал LCDCLK поступает в контроллер ЖКИ. Частота тактового сигнала делится, в соответствии с коэффициентами деления, которые устанавливаются битами PS, DIV регистра LCD_FCR (Frame Control Register). Результирующая частота на выходе блока делителей частоты рассчитывается по формуле:

F ck_div =F LCDCLK / (2 PS *(16+DIV))

Частота кадров рассчитывается по формуле:

F Frame =f ck_div *duty

Где duty – коэффициент заполнения – отношение длительность импульса к его периоду. За время одного кадра на ЖКИ последовательно выводится информация из регистров LCD_RAM[x], LCD_RAM и тд. Для ЖКИ установленного на отладочной плате, за один кадр контроллер ЖКИ должен вывести информацию из 4 групп сегментов COM0 - COM3, следовательно, длительность управляющего импульса для одной группы будет 1/4 длительности кадра, т.е. duty=1/4.

Управление ЖКИ

Существует два способа управления ЖКИ – статический режим управления и мультиплексный режим управления. При статической индикации каждый сегмент разряда индикатора подключен к выходу микроконтроллера. Применительно к ЖКИ, на отладочной плате STM32LDiscovery, потребуется 6*14=84 выводов микроконтроллера (без учета двоеточий, точек и полосок). Из-за использования такого количества выводов, подключение другой периферии станет невозможным. Микроконтроллер STM32L152RB имеет 64 вывода. При мультиплексном режиме управлении (динамический режим управления) одинаковые сегменты разрядов индикатора объединены в группы. Отображение информации происходит за счет поочередного зажигания сегментов разрядов индикатора, с частотой, не воспринимаемой человеческим глазом.

Мультиплексное управление позволяет управлять большим количеством сегментов. Вместо раздельного управления каждым элементом, они могу адресоваться по строкам и столбцам (COM и SEG), таким образом, упрощается управляющая схема, т.к. каждому сегменту не требуется собственная управляющая линия. Для включения выбранного сегмента, на него надо подать разность потенциалов COM и SEG. Пример работы первого разряда индикатора (на индикатор выводится «1:»):


Первый разряд индикатора в момент времени t 0


Первый разряд индикатора в момент времени t 1


Первый разряд индикатора в момент времени t 2


Общая схема подключения сегментов к выводам ЖКИ


Схема подключения выводов ЖКИ к портам микроконтроллера

Для линий SEG используется управляющее напряжение, количество уровней которого определяется коэффициентом bias. ЖКИ на отладочной плате использует мультиплексный режим управления с duty=1/4 и bias=1/3. Значение duty и bias устанавливаются через регистр LCD_CR (Control Register) в битах DUTY и BIAS.

Практика

Конфигурирование портов микроконтроллера

Для управления ЖКИ порты микроконтроллера должны быть настроены соответствующим образом:
  1. На выход
  2. Использование альтернативной функции AF 11 (Alternate function)
  3. Иметь частоты вывода в порт 400 кГц
  4. Использовать режим работы push-pull
  5. Без подтягивающих резисторов
При работе порта в режиме альтернативной функции, выходной буфер данных порта управляется сигналами, поступающими с периферии. Заголовочный файл stm32lxx.h библиотеки CMSIS содержит описание всех регистров периферии, а также структуры доступа к ним.

Выводы ЖКИ подключены к портам GPIOA (PA1-PA3,PA8-PA10,PA15), GPIOB (PB3-PB5, PB8-PB15), GPIOC (PC0-PC3,PC6-PC11) микроконтроллера. Для работы ЖКИ, на выбранные порты необходимо подать тактовый сигнал. Тактирование портов GPIO микроконтроллера происходит от шины AHB системы RCC (Reset and Clock Control) – системы тактировании и сброса. Подача тактового сигнала осуществляется установкой соответствующих битов в регистре RCC_AHBENR (AHB peripheral clock enable register).

Регистр RCC_AHBENR (на рисунке приведены первые 15 разрядов)

Для портов GPIOA, GPIOB, GPIOC необходимо установить 1 в 0, 1, 2 разряды регистра.

Далее я буду приводить код записи информации в регистр с использованием битмаски и с использованием шестнадцатеричных кодов. Использование битмасок удобнее, но работа с шестнадцатеричными кодами позволяет понять суть работы с регистрами.

RCC->AHBENR |=(RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOBEN|RCC_AHBENR_GPIOCEN); или RCC->AHBENR = 0x7; /* 0x7=111 */

Для указания режимов работы порта используется регистр GPIOx_MODER (GPIO port mode register) (x = A..H). Все разряды регистра сгруппированы в группы MODERy, где y номер пина соответствующего порта. Порты необходимо настроить на режим альтернативной функции, т.е. в группе, отвечающей за пин, установить значение 10. Для порта GPIOA нужно настроить пины 1-3,8-10,15, т.е установить 1 в 3,5,7,17,19,21,31 разряды.


Регистр GPIOx_MODER (GPIO port mode register)

GPIOA->MODER |= (GPIO_MODER_MODER1_1 | GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER15_1); или GPIOA->MODER = 0x802A00A8; /* 0x802A00A8=1000 0000 0010 1010 0000 0000 1010 1000 */
Порты микроконтроллера необходимо перевести в режим push-pull. Для этого необходимо в регистре GPIOx_OTYPER (GPIO port output type register) установить 1 в разряды, отвечающие за пины.


Регистр GPIOx_OTYPER (GPIO port output type register)

GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_1 | GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_3 | GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10 | GPIO_OTYPER_OT_15); или GPIOA->OTYPER &= ~0x0000870E; /* 0x870E=1000 0111 0000 1110 */
Оба варианта воздействуют на выбранные пины. (Для порта GPIOA настраиваются пины 1-3,8-10,15). Если необходимо перевести все пины порта в режим push-pull, можно записать в регистр значение:
GPIOA->OTYPER = 0x0;
Для указания частоты вывода информации в порт используется регистр GPIOx_OSPEEDR (GPIO port output speed register). Все разряды регистра сгруппированы в группы OSPEEDRy, где y номер пина соответствующего порта. В данной работе должна быть установлена частота 400 кГц т.е. в группе, отвечающей за пин, установить значение 00.


Регистр GPIOx_OSPEEDR (GPIO port output speed register)

GPIOA->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR1 | GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3 | GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR15); или GPIOA->OSPEEDR &= ~0xC03F00FC; /*0xC03F00FC=1100 0000 0011 1111 0000 0000 1111 1100 */
Если необходимо установить частоту вывода в порт 400 кГц для всех пинов, можно записать в регистр значение:
GPIOA->OSPEEDR = 0x0;
Для отключения подтягивающих резисторов pull-up, pull-down для выбранных пинов используется регистр GPIOx_PUPDR (GPIO port pullup/ pull-down register). Все разряды регистра сгруппированы в группы PUPDRy, где y – номер пина соответствующего порта. Для отключение подтягивающих резисторов в группе, отвечающей за пин, устанавливается значение 00.


Регистр GPIOx_PUPDR (GPIO port pull-up/pull-down register)

GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR1 | GPIO_PUPDR_PUPDR2 | GPIO_PUPDR_PUPDR3 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10 | GPIO_PUPDR_PUPDR15); или GPIOA->PUPDR &= ~0xC03F00FC; /*0xC03F00FC=1100 0000 0011 1111 0000 0000 1111 1100 */
Если необходимо отключить подтягивающие резисторы для всех пинов, можно записать в регистр значение:
GPIOA->PUPDR = 0x0;
Для использования альтернативной функции для портов микроконтроллера используются два регистра GPIOx_AFRL (GPIO alternate function low register), отвечающий за младшие пины (с 0 по 7) и GPIOx_AFRH (GPIO alternate function high register), отвечающий за старшие пины (с 8 по 15). Все разряды регистров сгруппированы в группы AFRLy и AFRHy, где y – номер пина соответствующего порта. Порты должны быть настроены на использование альтернативной функции AF11, для этого в группе, отвечающей за пин, должно быть установлено значение 1011.


Регистр GPIOx_AFRL (GPIO alternate function low register)


Регистр GPIOx_AFRH (GPIO alternate function high register)

Для этого необходимо записать в регистры значения:
GPIOA->AFR = 0xBBB0; /* 0xBBB0 = 1011 1011 1011 0000*/ GPIOA->AFR = 0xB0000BBB; /* 0xB0000BBB=1011 0000 0000 0000 0000 1011 1011 1011*/

AFR = 0xBBB0 – записывает значение в регистр GPIOx_AFRL.
AFR = 0xB0000BBB – записывает значение в регистр GPIOx_AFRH.

Настройки соответствующих пинов портов GPIOB, GPIOC производятся аналогично.

Настройка контроллера ЖКИ

При работе с контроллером ЖКИ, как и с другой периферией, на него необходимо подать тактовый сигнал. Тактовый сигнал также подается на систему управления питанием. Контроллер и система управления питанием для тактирования используют шину APB1. Для разрешения тактирования в регистре RCC_APB1ENR (APB1 peripheral clock enable register) необходимо установить 1 в 9 и 28 разрядах.


Регистр RCC_APB1ENR (APB1 peripheral clock enable register)

RCC->APB1ENR |= RCC_APB1ENR_PWREN|RCC_APB1ENR_LCDEN; или RCC->APB1ENR |= 0x10000200; /* 0x10000200=1 0000 0000 0000 0000 0010 0000 0000 */
Для работы контроллера ЖКИ необходимо указать источник тактовых сигналов. Источник указывается в регистре RCC_CSR. По умолчанию запись в этот регистр запрещена. В регистре управления питанием PWR_CR (PWR power control register) снимается защита от записи в регистр RCC_CSR. Регистр RCC_CSR управляет источниками тактирования часов RTC и контроллера ЖКИ
Запись в регистр RCC_CSR разрешается установкой 1 в 8 разряд регистра PWR_CR.


Регистр PWR_CR (PWR power control register)

PWR->CR |= PWR_CR_DBP; или PWR->CR |= 0x100; /* 0x100 =1 0000 0000 */
Для смены источника тактирования контроллера ЖКИ (и часов RTC тоже) необходимо сначала выполнить сброс источника тактирования установкой бита RTCRST (установкой 1 в 23 разряд) в регистре RCC_CSR (Control/status register).


Регистр RCC_CSR (Control/status register)

RCC->CSR |= RCC_CSR_RTCRST;
Или записав в регистр значение, используя оператор «|=», т.к. значение по
умолчанию регистра отлично от 0x0:
RCC->CSR |= 0x800000; /* 0x800000 = 1000 0000 0000 0000 0000 0000 */
Для выбора нового источника тактирования необходимо убрать бит RTCRST:
RCC->CSR &= ~RCC_CSR_RTCRST; или RCC->CSR &= ~0x800000;
В качестве источника тактового сигнала выбирается внешний НЧ генератор. Для включения генератора в регистре RCC_CSR необходимо установить бит LSEON (установить 1 в 8 разряд):
RCC->CSR |= RCC_CSR_LSEON; или RCC->CSR |= 0x100; /* 0x100 = 1 0000 0000 */
После включения генератора необходимо некоторое время на его стабилизацию. Готовность генератора проверяется аппаратной установкой бита LSERDY в регистре RCC_CSR:
while(!(RCC->CSR&RCC_CSR_LSERDY));
Выбор внешнего НЧ генератора в качестве источника тактового сигнала осуществляется установкой в группе RTCSEL регистра RCC_CSR значения 01:
RCC->CSR |= RCC_CSR_RTCSEL_LSE; или RCC->CSR |= 0x10000; /* 0x10000 = 01 0000 0000 0000 0000 */
В контроллере ЖКИ необходимо установить нужный режим bias. Для этого в регистре LCD_CR (LCD control register) необходимо установить значение 10 в группу BIAS. Перед установкой бит необходимо очистить биты от «мусора».


Регистр LCD_CR (LCD control register)

Сброс битов:
LCD->CR &= ~LCD_CR_BIAS; или LCD->CR &= ~0x60;
Выбор режима bias=1/3 с использованием битмаски:
LCD->CR |= LCD_CR_BIAS_1; или LCD->CR |= 0x40;
Устанавливаем режим duty=1/4. Для этого также вначале сбрасываем все биты:
LCD->CR &=~LCD_CR_DUTY; или LCD->CR &= ~0x1C;
Устанавливаем значение 011 в группу DUTY регистра LCD_CR для
режима duty=1/4:
LCD->CR |= LCD_CR_DUTY_0|LCD_CR_DUTY_1; или LCD->CR |= 0xС;
Активируем функцию переназначения выводов. Для этого устанавливаем 1 в 7 разряд регистра LCD_CR:
LCD->CR |= LCD_CR_MUX_SEG; или LCD->CR |= 0x80;
Устанавливаем значения коэффициентов деления частоты тактового сигнала LCDCLK. Значения коэффициентов выставляются в регистре LCD_FCR (LCD frame control register). Вначале также очищаем все биты, затем устанавливаем нужные.


Регистр LCD_FCR (LCD frame control register)

LCD->FCR &= ~LCD_FCR_PS; LCD->FCR &= ~LCD_FCR_DIV; или LCD->FCR &= ~0x3C00000; LCD->FCR &= ~0x3C0000;
Значения коэффициентов деления частоты тактового сигнала устанавливаем равными ck_ps = LCDCLK/16, ck_div = ck_ps/17. Для этого устанавливаем 1 в 24 и в 18 разряды:
LCD->FCR |= 0x1040000; /*0x1040000 = 1 0000 0100 0000 0000 0000 0000*/
Для установки нужного уровня контраста необходимо установить значение 010 в группу СС, так же предварительно очистив биты от старых значений:
LCD->FCR &= ~LCD_FCR_CC; LCD->FCR |= LCD_FCR_CC_1; или LCD->FCR &= ~0x1C00; LCD->FCR |= 0x800; /*0x800 = 1000 0000 0000*/
После установки всех значений необходимо некоторое время на синхронизацию регистра LCD_FCR. Синхронизация регистра проверяется аппаратной установкой бита FCRSF в регистре LCD_SR (LCD status register).

Регистр LCD_SR (LCD status register)

While(!(LCD->SR&LCD_SR_FCRSR));
В качестве источника напряжения для ЖКИ выбираем внутренний step-up converter для формирования V lcd . Для этого в первый разряд регистра LCD_CR (LCD control register) устанавливается значение 0:
LCD->CR &= ~LCD_CR_VSEL; или LCD->CR &= ~0x2;
Разрешение работы ЖКИ контроллера происходит установкой 1 в 0 разряд регистра LCD_CR (LCD control register):
LCD->CR |= LCD_CR_LCDEN; или LCD->CR |= 0x1;
После установки в качестве источника напряжения внутреннего step-up converter, необходимо дождаться его готовности. Готовность проверяется аппаратной установкой бита RDY в регистре LCD_SR (LCD status register):
while(!(LCD->SR&LCD_SR_RDY));
После разрешения работы контроллера ЖКИ, необходимо дождаться его готовности. Готовность проверяется аппаратной установкой бита ENS в регистре LCD_SR (LCD status register):
while(!(LCD->SR&LCD_SR_ENS));

Формирование изображения на ЖКИ

Все сегменты индикатора объединены в группы COM0 - COM3 по 24 сегмента в каждой (SEG0-SEG23). Информация о сегментах хранится в регистрах LCD_RAM памяти контроллера ЖКИ. Разводка печатной платы такова, что номера сегментов не соответствуют номерам разрядов регистров LCD_RAM.

Что бы отобразить 1 в первом разряде ЖКИ, необходимо зажечь сегменты 1B,1C. Сегмент 1B принадлежит группе COM0, сегмент 1C принадлежит группе COM1. Следовательно информация о них должна быть записана в регистры RAM (LCD_RAM0), RAM (LCD_RAM2) соответственно. За сегмент 1B отвечает вывод ЖКИ LCDSEG22, информация о котором храниться в разряде SEG40 регистра RAM (LCD_RAM1). С использованием функции переназначения за сегмент LCDSEG22 будет отвечать разряд SEG28 регистра RAM (LCD_RAM0). За сегмент 1С отвечает вывод ЖКИ LCDSEG1, информация о котором храниться в разряде SEG1 регистра RAM (LCD_RAM2).

LCD->RAM= 0x10000000; /*0x10000000 = 1 0000 0000 0000 0000 0000 0000 0000 */ LCD->RAM = 0x2; /*0x2= 10 */
До записи значений в регистры памяти необходимо проверить завершена ли предыдущая передача данных на ЖКИ. Для этого проверяется бит UDR (Update display request) регистра LCD_SR (LCD status register). Контроллер ЖКИ имеет два выходных буфера, информация заносится в первый буфер, а выводится на ЖКИ из второго буфера. Бит UDR устанавливается во время передачи из первого буфера во второй, защищая от записи регистры LCD_RAM:
while(LCD->SR & LCD_SR_UDR);
После записи информации в регистры LCD_RAM необходимо установить бит UDR в регистре LCD_SR (LCD status register)(установить 1 во 2 разряд):
LCD->SR |= LCD_SR_UDR; или LCD->SR |= 0x4; /*0x4 = 100 */
Я очередной выпускник некоего московского вуза (не буду уточнять какого, но средненького). Полгода назад нам сообщили, что пора писать диплом. На тот момент я только-только начал осваивать микроконтроллеры и давалось мне это не то, чтобы нелегко, но со скрипом, который производит холодильник, когда ты, в одиночку, пытаешься аккуратно сдвинуть его, не повредив драгоценный ламинат (в моем случае линолеум).

Мое обучение началось, когда я два года назад заинтересовался темой микроконтроллеров и инженер, у которого поинтересовался насчет них, выдал мне плату 300х200мм и сказал, что в ней стоит контроллер STM32F217ZGT6 и на этой плате есть все необходимое для обучения. «В общем, освоишь ее - все остальное покажется фигней» (он, правда, не сказал, что для моргания светодиодом надо настроить SPI, о котором на тот момент я даже не слышал). Спустя три не очень напряженных месяца бесплотных попыток, осознания слабости навыков программирования и огромного количества прочитанных статей пришлось все же раскошелится на STM32VLDISCOVERY и способом копирования программ и экспериментов с ними дело наконец-то пошло, но все равно медленно.

За полтора года успел поработать разработчиком, искал вакансии, где работают с STM32 (так как считаю, что сейчас это наиболее перспективные микроконтроллеры своего класса), нахватался опыта и когда дело дошло до диплома, вспомнил о своих наболевших мозолях. Идея с темой пришла мгновенно: «Отладочная плата на STM32 и (полноценный) обучающий курс (для самых маленьких) к ней».

Именно по этому захотел написать цельный и законченный курс, чтобы так сказать другие не мучились и самому разобраться. Так что придя в институт и понимая, что для быстрого освоения и понимания нужен стимул (а точнее - хороший такой пинчище), я стал бить себя пяткой в грудь (рыть себе могилу), что не только напишу обучающий курс (в нашем универе пришлось назвать его методическим пособием), но и макет работающий предоставлю. Тему приняли, задание написал (могилу вырыл, надгробие заказал), дело было за малым, все написать и разработать (лечь в могилу, закопаться и поставить надгробие).

Жизнь показала, что времени у меня было отнюдь не полгода, но все же все время, отведенное на диплом, почти закончилось, совсем скоро защита, но как не удивительно все не только готово, но и почти на 100% протестировано (на живых людях в том числе).

На выходе получилось следующее:

1. Сам курс (методическое пособие по-научному)

Вкратце о нем можно сказать, что на мой взгляд и по отзывам тестировщиков он полноценный, но немного суровый и не доработанный. Так как я решил, что не буду писать учебник по программированию на СИ, следовательно, и в курсе отсутствуют объяснения операторов, оттого и сказали, что местами курс суров. По поводу недоработанности честно скажу, я не все успел отладить к сдаче, чтобы об этом писать не только здесь, но и в методическом пособии к сдаче. Так же считаю, что можно лучше, но об этом чуть позже.

2. Отладочная плата на контроллере STM32F103RET6

Здесь все немного лучше, чем в первом пункте, плата разработана, заказана (из-за обстоятельств заказывать пришлось срочно) в Резоните, компоненты заказаны, спаяна ручками (честно скажу, никакое видео не передаст ощущения первой пайки LQFP64) и протестирована (большее ее часть заработала сразу же). Но это макет и, конечно, не обошлось без накладок: проводков, переходников и других различных «костылей», но заказать вторую ревизию я, к несчастью, не успею, да наверно и не стал бы, для защиты диплома, уверен и этого хватит. Так что ниже я расскажу более подробно об этой отладочной плате.

Придя на первую работу в качестве разработчика электроники, я столкнулся с одним интересным мнением и, как оказалось, оно весьма распространено. Это мнение звучало примерно так: «Вот я программист и программирую микроконтроллеры, схемотехнику не знаю и знать не хочу, паять, кстати, тоже не умею». Пообщавшись с группой программистов вне фирмы, понял, что человек с моей работы далеко не одинок в своем мнении и хоть я его и не поддерживаю, понять и уважать мнение окружающих стоит, тем более это отлично вписывалось в тогдашнюю концепцию отладочной платы «все на борту». В связи с этим плата получилось достаточно «жирненькая», получила название STM32SB (SB-StudyBoard) V1.0b. Ниже разберем, что в нее вошло.

1. Микроконтроллер
Исходя из того, что я работал с микроконтроллером STM32F103RET6, он и был выбран для проекта.

2. Схема питания и аппаратный USB контроллера
В этом микроконтроллере есть встроенный USB, который было решено вывести на отдельный разъем.

3. Спикер
Было решено ввести для освоения ШИМ модуляции и обучению написанию мелодий.

4. Цифровой индикатор и сдвиговый резистор
Для одновременного освоения динамической индикацией и сдвиговым регистром было решено их совместить.

5. Светодиоды
Светодиоды, что может быть лучше? Только трехцветные светодиоды, на которых можно освоить плавную смену цветов.

6. ЖК-дисплей
Стандартный ЖК-дисплей на 2 строки по 16 символов для освоения параллельного интерфейса.

7. Клавиатура
Матричная клавиатура, это нужно знать и уметь.

8. Расширитель портов ввода-вывода
Много портов ввода-вывода не бывает, а тут еще и I2C освоить можно.

9. Электронный термометр
Датчик температуры по 1-Wire, полезная вещь и ценный опыт работы с ним может пригодиться.

10. Электронный потенциометр
На этой вещице можно освоить полноценный SPI и попробовать сделать замеры изменения напряжения через АЦП.

11. Реле
Хоть это и на уровне поморгать светодиодом, но все же приятно услышать знакомый щелчок, правда?

12. Ключевые транзисторы
Так же на уровне моргания светодиодом, но вдруг кому принцип не понятен.

13. Дублирование свободных пинов на внешних выводах
Ну это естественная конструкция для любой отладочной платы, вдруг все, что в ней есть никому не пригодилось, а подключить, что то свое все же нужно.

14. Преобразователь WIFI-UART(esp8266)
В схеме преобразователь участвует как разъем, также он указан и здесь. Используется уже довольно нашумевший модуль esp8266.

15. Преобразователь USB-UART
USB это всегда круто, сдесь используется чип CP2102.

16. JTAG и SWD
Ну куда же без этих вещей.

Такой широкий набор внешних устройств даст возможность освоить большинство приемов и попробовать поработать с большинством интерфейсов, не заморачиваясь закупкой элементов и не отходя от стола, что согласуется с концепцией не только «все на борту», но и «для самых маленьких» (не умеющих паять).

Конечно, не обошлось без накладок, но, как говорит один знакомый инженер, «мастерство инженера измеряется в количестве перерезанных дорожек на первой итерации платы».

Вот список моих «косяков», того, чего я не заметил, забыл или даже не знал при разработке этой платы:

1. Понял, что пины SWD расположены с странном порядке и хоть работе платы это не мешает. Услышал, на мой взгляд, правильное мнение, что их стоит располагать так, как они расположены на STM32VLDISCOVERY, чтобы избежать недоразумений у нового пользователя.

2. Так подключать одноцветные светодиоды, как на данной плате, не стоит, по причине того, что для моргания ими необходимо отремапить JTAG, но получился неожиданный для меня эффект индикации процесса загрузки прошивки.

3. Я разработал свой логотип для этой платы, который хотел перевести в PCB и разместить на плате, но забыл.

4. Для экономии места во второй ревизии платы я бы разместил некоторые не используемые пользователем SMD компоненты на нижней стороне платы.

5. Понял, что для более удобной разводки цепей с кварцевыми резонаторами было бы удобно заменить их на SMD.

6. Забыл подписать, где JTAG и SWD, так же у них не показано, как их подключать и если для JTAG и его разъемом BH-20 все не так сложно, то с SWD ситуация несколько опасней.

7. При разработке футпринта ЖК-дисплея вышел казус и отверстия оказались слишком малы для болтов М3.

8. У преобразователя CP2102 перепутаны выводы RX и TX. Так как я привык, что в документации приводится пример подключения относительно микроконтроллера, а не внешнего устройства, пришлось перерезать таки 2 дорожки.

9. На данной плате расстояние между гребенками выводов не нормировано по дюймам, в связи с этим есть проблема для подключения к беспаечной макетной плате методом втыкания в нее.

10. Вышла накладка с резисторами ограничения тока в цепи индикации включения реле, номинал оказался слишком большой для того, чтобы реле могло коммутироваться.

11. Ну и, как водится, «хорошая мысля приходит опосля». Так, уже после получения платы я понял, что стоило сделать размер ее подходящий хоть под какой-нибудь корпус - видимо придется доработать во второй ревизии.

12. Изначально был заложен маленький цифровой индикатор, так как занимал не большую площадь и был доступен в магазинах, однако оказалось, что на самом деле он везде доступен при заказе от 520 штук, так что пришлось ваять переходник на стандартный цифровой индикатор.

Напоследок покажу вам 3D модель этой платы:

И для сравнения фотографии ее же, как она получилась «в живую», вид с верху:

И вид с боку, чтоб было видно побольше «костылей»:

Извините, но весь проект до сдачи диплома выкладывать мне бы не хотелось, но после этой работы у меня встал вопрос, а стоит ли данный проект развивать? Меня посетила идея написать цикл статей, посвященных обучению, где был бы представлен такой вот полноценный курс по этой отладочной плате, где все написано простыми словами и объяснено на пальцах. Хотелось бы услышать от вас в комментариях насколько это было бы полезно и необходимо на настоящее время.

Спасибо за внимание!