Отладочные платы stm32 и компоненты. Обучение на 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:

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

На отладочной плате 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 */

Для мучений и изучений данного девайса. Сказано, сделано. Была собрана платка и пошло поехало. Ах да! Тема нашего разговора зашла о сравнении двух МК. Один выше сказанный против ATmega328. Почему именно они. Оба МК в корпусе TQFP-32. (Правда ATmega328 бывает и в DIP корпусе)
Теперь давайте рассмотрим по ближе их внутренности. Для большего понимания я собрал все необходимые данные в одну табличку.

Параметры ATmega328 STM32F030K6T6
Разрядность 8 бит 32 бита
FLASH 32кб 32кб
SRAM 1кб 4кб
EEPROM 512б -
Таймер 8 бит 2 шт -
Таймер 16 бит 1 шт 16 шт
ШИМ 3 канала 6 каналов
USART 1 шт 1 шт
SPI 1 шт 1 шт
I2C 1 шт (TWI) 1 шт
АЦП 8 каналов 10 бит 16 каналов 12 бит
Питание 2,7 - 5,5 2,4 - 3,6
Скорость 0 - 16МГц 48МГц при внешних 4 - 32МГц
Стоимость 160 - 170 руб. 80 - 140 руб.
Как видно из таблицы, STM32 довольно интереснее и богаче чем AVR. Есть правда одна мелочь. У STM32 нет EEPROM, но зато есть DMA которое просто убивает AVR напрочь. Правда AVR может похвастаться Ардуиной и простатой программирования. Да не спорю, но у STM32 есть STM32Cube, который генерит код для IAR и берет на себя всю рутину настройки периферии. И последний гвоздь в "гроб" AVR это RTOS. Да, на AVR тоже можно установить, но с ней надо разбираться, а в STM32 ставим галочку "FREERTOS" и все. Система сама сделает все что нужно, а нам останется только создавать потоки и писать код в них. Ну это так для затравки. На самом деле там все немного сложнее. Короче STM32 мне нравится и для того чтобы окончательно склонить вас на эту платформу, бросив в ящик стола Ардуину, я создам от начала до конца плату и покажу как с ней работать. О, забыл. У всех STM32 есть отладчик SWD. Это три провода SWDIO, SWCLK, GND и можно скакать по строкам кода прямо в железе, а не как у ATmega328 виртуально в Протеусе. Для этого нужен всего лишь универсальный программатор ST-LINK. Его можно использовать если приобрести плату Discovery или отдельно программатор . А теперь от слов к делу.
Схема. Покрупнее
Данную плату я делал как модуль для своей отладочной платы под AVR. Но ее можно повторить разведя плату по своему усмотрению (Проект под DipTrace я выложу в конце статьи). Что на схеме. А на схеме простая обвязка как и для AVR. Кварц на 8МГц с двумя конденсаторами по 20p. Так же как и в AVR собрана схема питания для опорки АЦП. Цепь сброса как у AVR. Единственное отличие это цепь BOOT. В отличии от AVR у всех STM32 на борту есть железный загрузчик. По умолчанию он выведен на USART. То есть если прижать к питанию ножку BOOT0 и рестартануть МК, то при помощи программы Flash Loader Demonstrator можно прошить МК без программатора. Данная фишка полезна если у вас уже есть готовое и работающее устройство и необходимо обновить прошивку, то нужно лишь переходник USB USART. Многие не хотят связываться с STM32 из-за питания не более 3,6 вольт. Ерунда. Если посмотреть в таблицу пинов, то можно заметить что все ножки могут принимать на себя 5 вольт без последствий. Поехали дальше.

А так она выглядит установленная на плату.

Теперь подключаем программатор ST-LINK-GA к SWD разъему.

Теперь когда все готово, качаем свежую версию с сайта ST (ссылка в самом низу страницы). Устанавливаем и запускаем.

Жмем New Project. И в появившемся окне находим наш контроллер. Жмем Ок.

После небольших раздумий. программа выдаст вот такое окно.

Расписывать что и зачем я не буду, так как это тема отдельной статьи. Сейчас для примера просто сделайте то что я покажу. Что мы будем делать. Мы запустим операционную систему и в единственном потоке будем моргать светодиодом. Этакий "Хелой Ворд" из пушки.))) Для этого в левом окошке нажмите на плюс у надписи "FREERTOS" и в выпавшем списке поставте галочку.

Причем как только будет выбран внешний кварц, справа на контроллере подсветятся зеленым ножки на которые нужно его повесить. Следующим делом надо выбрать ножку на которой будет висеть светодиод. Я выбрал порт В и пин 0. И нашел граблю.Я с перепугу что ли, не знаю зачем, перевернул выводную гребенку первых четырех пинов к верху ногами. Отсюда неразбериха на порте В. Этот косяк касается только моей платы. Но ничего, от этого МК работать не перестал. И так как настроить пин. Дело в том что у STM все пины могут принимать кучу значений, но если касаться дискретного ввода/вывода, то на выход может быть три варианта. Выход в воздухе, выход с подтяжкой к плюсу питания, выход с подтяжкой к общей шине. По умолчанию STM32CubeMX вешает ножку в воздухе. Ну и пусть, нам же нужно просто проверить работу и продемонстрировать силу STM32. Для того чтобы настроить ножку, нужно щелкнуть по ней левой кнопкой мышки и в появившемся окне выбрать GPIO_Output. Если МК мелковат, то можно покрутить колесиком и увеличить его.)))

Следующим этапом нужно настроить тактование МК. Дело в том что у STM32 с этим делом очень мутно. В отличии от AVR у STM32 на входе стоит кварц с частотой от 4 до 32 МГц, а на шинах его можно разогнать до 48 МГц. Внутри МК очень сложная система тактования, но на помощь нам идет опять STM32CubeMX. Переходим во вкладку Clock Configuration и настраиваем как на картинке ниже.

Вот и все. Жмем на иконку с шестеренкой на верху.

Появится вот такое окно.

А вот тут я забыл сказать. Скачайте и установите себе IAR. Его можно скачать у официалов но урезанный по количеству кода, либо можно найти в торрентах. Либо если много лишних денег, то можно и прикупить лицензию. Ну я думаю многие пойдут по тропе с CodeVisionAVR. В общем это оставляю на ваше усмотрение. У меня версия 7.40. Возвращаемся к Кубу. В окошке назовите проект, но только латинскими, IAR не любит русские буквы в путях. И задайте где будет хрониться проект. В окне IDE нужно выбрать (а он по умолчанию) EWARM. Жмем Ок. Программа думает, а потом выдает вот такое окно. Бла-бла-бла. В общем жмем открыть проект (для тех кто в танке средняя кнопка).

Окно исчезнет, а вместо него запустится IAR и наш проект. Слева заходим в Aplication->User и запускаем main.c. Вот эта куча кода и есть то что нагенерил за нас STM32CubeMX.

И что теперь с этим ужасом делать? А вот для этого нужно целую серию статей))) А сейчас просто находим вот такой кусок кода.

Это и есть наш единственный поток. В теле цикла for(;;) удаляем единственную функция osDelay(1);, а вместо нее запишем вот такой код. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
osDelay(500);

Чудненько. Теперь просто жмем на кнопочку с зеленой стрелочкой справа на верху и ждем компиляцию и загрузку.

Если все правильно и без ошибок, то программа соберет весь проект, создаст все что нужно и загрузит прошивку в МК. После этого перейдет в режим отладки. Вот он родной. Мечта AVR-щика. Если есть не преодолимое желание поюзать, то можно прям на железе походить по шагам, строка за строкой. А если охота посмотреть как работает программа, то жмен на крестик сверху слева и наслаждаемся микание светодиода.

Вот и все. Микроконтроллеры можно купить по самой низкой цене аж по 78 рублей за штуку в магазине ЧипРезистор . Ну а если хочется по дешевле то есть и мелкий опт. От 35 штук уже по 50 руб.
Проект для DipTrace.
И конечно же видео.


гость 31.12.15 10:35

Недавно хотел сделать частотомер на АТМЕГА16 плюс внешний 8 бит счетчик на 74логике, -не хватило быстродействия.На ассемблере писать-голова не выдержит,городить внешний счетчик на 16 бит-геморойно.АВР - это прошлый век, недешевый контроллер.Поддержу автора, АВР это пройденый этап,я тоже купил чип stm32f100 плюс чип адаптера ЮСБ CP2103, скоро от АВР все откажутся.

Алексей 31.12.15 12:26

Я не согласен. Все таки еще развивается Arduino и многие на нее подсели, а последняя в свою очередь работает на AVR. Переход на STM это что-то вроде перехода на следующий уровень. Так сказать из Детсада в школу.

АНОНИМ 12.02.16 10:44

AVR и STM32 это процессоры не конкурирующие друг с другом. В вашей табличке нет самого главного параметра - это ток потребления!! А посмотрев на них - можно прослезится. Atmega 328 - – Active Mode: 0.2 mA – Power-down Mode: 0.1 µA – Power-save Mode: 0.75 µA (Including 32 kHz RTC) STM32F030K6T6 48 MHz - Active Mode: периферия включена 23.3 mA периферия выключена 11.5 mA - Stop Mode: 0.048 mA STM32 жрёт электричество нещадно - грубо говоря в 100 раз больше чем AVR. От батарейки девайс на STM32 не запитаешь. А вот AVR будут работать месяцами. Так что отказаться от AVR трудно. Удачи всем.

Алексей 12.02.16 10:54

А никто и не предлагает отказаться от AVR. Я лишь показа разницу в периферии. Я до сих пор поддерживаю библиотеку для AVR и до сих пор мой основной МК ATMega8A.

Сергей 24.02.16 18:02

На мой взгляд как то странно сравнивать свежие STM32 с пенсионерами AVR. Если хотите сравнивать STM32 с контролерами ATMEL, то сравнивайте их с семейством ATSAM но не как ни с AVR.

Андрей 24.02.16 18:06

Это кто это пенсионер? AVR жив и будет еще жить хрен знает сколько. И глядя в таблицу, сравнение по моему идет больше по периферии, а не по архитектуре.

Алексей 24.02.16 19:04

Ну начинается. Давайте теперь обсудим АМД и Интел.

Сергей 24.02.16 22:02

На хабре один "знаток" написал, что у AVR нет параллельной шины для подключения стандартного LCD, а у STM32 есть...

Алексей 24.02.16 22:36

Что значит стандартный LCD? Это про FSMC? Так это не только для дисплея, это и для памяти. Просто параллельная шина. У AVR тоже есть, например у Mega8515. К ней через регистр-защелку можно SRAM подключить.

Сергец 25.02.16 06:24

Алексей, ну а я про что?! Такое впечатление, что вы даже не пытаетесь вникнуть в смысл моих сообщений.

Алексей 25.02.16 09:38

Ну, а какой смысл сравнивать два одинаковых микроконтроллера разных фирм. Оба на ядре ARM. Если совсем придираться, то тогда уж надо сравнивать AVR с STM8. Я то придерживался приближенностью периферии, формфактора и цены. И как раз разной архитектуры.

Адлан 03.06.16 17:40

Здравствуйте. Помогите, пожалуйста, кто может. Установил последнюю версию Куба 4.15, Библиотеки F1 1.4.0. Созданный пустой проект в EWARM не компилируется - больше сотни ошибок. ЧТо может быть? Спасибо [email protected]

Алексей 03.06.16 20:48

Адлан, первое что нужно сделать, так это скинуть проект который не компилится.

Doc 18.07.16 21:51

"Правда AVR может похвастаться Ардуиной и простатой программирования." ЧЕМ может похвастаться? ;D

Алексей 19.07.16 11:41

Это глупое сравнение. Во первых у STM есть аналог ардуины под названием нуклео. Программы пишутся в онлайн IDE прямо через браузер. А вот если плюсы лично камня, то. Частота работы ядра 72МГц, AVR и не снилась такая скорость. Конечно если маргать светодиодом, то разницы никакой, а вот если запустить ось и кучу периферии, то AVR сдуется. Разряднось, 32 далеко не 8. Попериферии на STM может находиться 3 I2C, 3 SPI, 6 UART, USB, CAN, Ethernet. Почти все имеет возможность ремапится, то есть переноситься на другие ноги мк. Есть так же DMA, это независимый сопроцессор для работы с периферией. Так что прерывания у AVR нервно курят в сторонке. Есть аппаратный SDIO для полноценной работы с CD картами, а не костыльный ISP в AVR. В общем там много чего еще есть, но самый жирный камень в огород AVR, это помехоустойчивосиь. AVR выбить пролегающим рядом кабелем от электромортора как нефиг делать, а вот STM нужно постараться. Так что язвить с ардуиной я бы не советовал.

гость 11.08.16 23:27

MICROCHIP поглотила AVR!))))))))))

Алексей 12.08.16 08:35

Опоздали с новостью, уже как лет пять назад.

Владимир 17.08.16 22:56

Алексей! В январе 2016 года фирма Microchip покупает Atmel за 3,56 млрд долларов.Каких 5лет?

Алексей 18.08.16 10:30

Это деюро, а дефакто это тянется аж с 2008 года. Так что я действительно ошибся, не 5 лет, а 8 лет назад.))))

Владимир 18.08.16 23:53

Алексей!Стал переходитьна stm32 !А насчёт потребления в авотономном режиме советует всё не тактировать, тогда и снизится ток потребления.

Олег 09.11.16 22:31

В datashet на STM не нашел графиков потребления оттактовой CLK системной как у AVR - а по тем табличкам что есть - STM32 вчистую проигрывает акак в обычном режмие, так и в Idle. Да и нет у этого STM32 тактовой в 72Мгц - только 48 макс, ивсе, так что даже при 32 разрядах 8 битник AVR - лучше получается, и кстати производитель в datasheet не написал сколько тактов в STM32 машинный цикл у него, так что если окажется 2 такта против 1 у AVR - то считай что 48/2=24 реальных Мгца - почти те же самые что и у 20 Мгц у AVR. Вот и вопрос - а чудо-то где у этого STM32 о котором Вы все талдычете?

АНОНИМ 09.11.16 23:03
Алексей 10.11.16 00:23

Я даже не хочу спорить. Что лучше Интел или АМД? Или Жигули или Волга? У СТМ есть аппаратный USB, CAN, Ethernet, SDIO и еще куча периферии которой AVRу только может присниться во сне. В конце концов есть ДМА как самостоятельный сопроцессор с прямым доступом к памяти перед которым все прерывания AVR нервно покуривают в сторонке. Например у первых сериях на борту сразу 3 UARTа, 2 SPI, 3 I2C. Ремап портов есть и не нужно ломать башку как развести плату. Если вам по нраву работать с AVR, то работайте, кто вам мешает. Я по сей день под мелкие проекты леплю меги восьмые и не жалуюсь. Ай да, воткните AVR рядом с пускателем и посмотрите как ему башку снесет наводками. У AVR нет защиты от ЭМН. Поэтому в автосигнализации всегда ставили ПИКи, так как АВР умирает в таких условиях. Да чего спорить, дохлый номер.

Корнет 27.11.16 21:22

Ну кстати уже есть ардуино и на STM32. Это и Амперка и Espruino всякие на JS) Тем более если Микрочип взял Атмел ну нафиг их

Алексей 27.11.16 21:44

Название Espruino пародирует Arduino, самую известную на тот момент хобби-платформу, но Espruino не совместима с классической Arduino Uno ни механически, ни программно.(цитата из Амперки)
Еще у меня есть плата Нуклео и она тоже никаким боком к Arduino не относится, разве что геометрией самой платы)))
Вообще по сути я использую тот МК, который подходит для текущей задачи.

Андрей 20.12.16 22:50

Кому нравится переплачивать: стоит attiny2313-20 - 2Kb-flash /128bit-ram/16bit_ timer -1/8bit_ timer -1 =2.1$ против stm32f103c8t6 64Kb-flash/20Kb-sram/16BIT timer (+контроль мертвого времени для двухканального режима ШИМ) -4/ADC-2/72MHz CPU/=2.3$.По-моему сделать измеритель импеданса цепи RLC c помощью авр практически нереально,либо городить 10 камней.А с STM и БПФ можно сделать(ДМА помогает).Попытался как-то сделать на Меге10 частотомер (точность 1 герц)- банально не хватило быстродействия (либо городить внешний 32-битный счетчик с регистром сдвига-откуда габариты).От АВР отказался год назад, AVR- выходит, для небедных людей.

Andrey 20.12.16 22:53

АНОНИМ писал-"И вот еще, цитата из описания STM32 на русском - "...С
момента
получения
прерывания
до
начала
выполнения
первой
команды
обработчика
прерывания
затрачивается
только
двенадцать
циклов
тактового
сигнала"

Это правда.Но перемножьте два 32-битных числа на avr - явно 8-10 тактов!

Алексей 20.12.16 23:31

Да, я уже сожалею что этот халивар начал.))))

Александр 21.12.16 00:27

Почитал коменты и вспомнил.
Два малыша в песочнице
Один дудука!
Второй, бибика!
Первый, ДУдука! (интонация более грозная)
Второй, БИБИКА! (С еще более выразительной интонацией)
Первый ДУДУКА! (Уже крича)
Второй БИБИКА!!! (Чуть ли не плача)
....
Закончилось эта баталия, оба стоят и плачат, один громче другова.)))

Вал 10.02.17 01:43

Какая частота будет если зациклить без задержки
while (1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
}

Алексей 10.02.17 10:07

Та что на шине APB

Игорь 08.06.17 22:33

Так давайте сразу ноутбуки во встраиваемые системы встраивать, они же лучше чем СТМ в сотни раз, и пееферии там ну просто охрененно сколько, там уже и вай фай есть и блютузы и даже программаторы не нужны, сразу и монитор есть с клавой чтобы писать прогу и сразу запустить, и программаторы не нужны и отладчики.
Всё равно что купить себе на дачу в личное пользование экскаватор для того чтобы ИНОГДА выкапывать пару ям глубиной в пол метра.
Ставить в термостат, часы, весы СТМ ну по моему это не нормально. Кстати да, как насчёт энергонезависимой памяти, вот делаю я термостат, выставляю температуру, тут вырубается свет, и что, настройки потеряны. А ведь во встроенные системы которые должны настраиваться 1 раз для дальнейшей работы, значения должны сохраняться навсегда

Алексей 09.06.17 08:25

Ну например в чип-дип STM32F030F4P6 стоит 48р, а прямой аналог ATtiny2313 98р. Я думаю для построения термостата любого из них будет достаточно. А компенсация памяти у STM может быть в любом датчике температуры. Да хотя бы в том же DS18B20. А что касается ноутов, так в любом терминале приема оплаты как раз установлен ПК с ОС и монитором. Так что даже такие системы есть. При выборе МК в первую очередь выбирают тот что дешевле. Это если хобби, то можно купить ардуину дабы не заморачиваться с пайкой, а когда систему планируется ввести на производство и выпускать сотнями, то считается каждая копейка. И переплата за МК 50 рублей при его цене в 48 это непозволительная роскошь.

Руслан 17.06.17 21:46

Алексей а почему ви вибрали среду програмирования именно IAR?
Какую среду лучше вибрать новачку (чтоб било много подсказок как в Atmel Studio)?

Алексей 17.06.17 22:07
Руслан 17.06.17 22:56
Если "плохо искал" то дайте ссилку где можно посмотреть или почитать как ето делать!
А еще лучше сделайте видео, думаю многим начинающим (и не только) оно будет интересно посмотреть!
Заранее благодарен!
Алексей 05.08.17 10:19
Руслан 22.11.17 12:17

Я имел ввиду ето https://www.youtube.com/watch?v=wOIlhRd-vN8
5 - 7 минута!!!

Руслан 22.11.17 12:18

Алексей подскажите пожалуйста как работать с перечислениями "enum" а то нигде нету такой информации и в ваших видео "Си для самих маленьких" тоже нету а мне как раз очень надо!
Когда баловался AVR-ками то такоє чудо как перечисления не встречал а сейчас заинтересовался STM-ками а там их очень много! И нету информации как с ними работать!
Есть такой пример из реального кода:


StatusCode MIFARE_Read(byte blockAddr, byte * buffer, byte * bufferSize);

Где StatusCode ето перечисление:


enum StatusCode: byte {
STATUS_OK , // Success
STATUS_ERROR , // Error in communication
STATUS_COLLISION , // Collission detected
STATUS_TIMEOUT , // Timeout in communication.
STATUS_NO_ROOM , // A buffer is not big enough.
STATUS_INTERNAL_ERROR , // Internal error in the code. Should not happen ;-)
STATUS_INVALID , // Invalid argument.
STATUS_CRC_WRONG , // The CRC_A do es not match
STATUS_MIFARE_NACK = 0xff // A MIFARE PICC responded with NAK.
};

Ето из ардуиновской библиотеки(С++), но Keil ругается на ето!
Как правильно записать возврат функцией перечисления?

Руслан 22.11.17 12:29

И еще как обьявить в функции одним из аргументов которой есть перечисление:


void PCD_WriteRegister(PCD_Register reg, byte value);

Где PCD_Register перечислениє:


enum PCD_Register: byte {
// Page 0: Command and status
// 0x00 // reserved for future use
CommandReg = 0x01 << 1, // starts and stops command execution
ComIEnReg = 0x02 << 1, // enable and disable interrupt request control bits
DivIEnReg = 0x03 << 1, // enable and disable interrupt request control bits
ComIrqReg = 0x04 << 1, // interrupt request bits
...
};

А reg ето как я понял име перечисления но его нигде нету обьявленним в коде и откуда оно взялось мне не понятно!
Много страний перечитал в интернете и нашел информацию что ети перечисления можно заменить дефайнами но все же хотелось би узнать как с ними работать!!!

Руслан 22.11.17 12:35

С нетерпением жду ответа!
Может снимите видосик как с ними работать,чтоб и для других било, думаю видео будет очень полезним потому что таких видео нету(по крайней мере я не нашел)!

Дмитрий 28.11.17 22:02

"простатой программирования"

Интересный орган для программирования контроллеров. Вообще как можно было сравнивать 32-битные с 8-битными непонятно. Как Порш Каен с Зарпорожцем.

Алексей 29.11.17 10:24

Можно сравнивать, можно. Просто нужно учесть что в данном сравнении Порш стоит дешевле Запорожца. По поводу урологии, так пикантнее. Так что исправлять не буду.

Константин 23.12.17 00:06

Руслан, я не понимаю, как ты ищешь и ничего не находишь (видимо, не ищешь). Это самые-самые основы языка С (не только для МК, но и для компов). Почитай книгу Кернигана и Ритчи, там весь С прекрасно описан.
А на твои вопросы никто тебе отвечать не будет, это элементарщина.

АНОНИМ 11.02.18 16:27

Почему вы сравниваете 32разрядный МК ST с 8разрядным Atmel. Глупое сравнение. Равносильно сравнивать 32разрядный Atmel AT91SAM с 8разрядными STM8 учитывая даже что у Atmel есть 32 разрядники еще мощнее

Алексей 13.02.18 12:18

Потому что на момент написания статьи, 8-ми бинтных ST не было в продаже, а по цене мега и СТМ32 стоят одинаково.

STM32_Dev 19.06.19 13:59

Ну так у AVR на то же самое уходит 4-5 тактов!!! Всего-то. И тут тоже снова получается что AVR сделан лучше чем STM32, с его дутой тактовой, и EEPROMа у STM32 внутри нет как у AVRа

Такт AVR при частоте 16МГц - 1/16000000 = 0,0000000625‬ с = 62.5 нс * 5 тактов = 312.5‬ нс.
Такт ARM при частоте 48МГц - 1/48000000 = 0,0000000208‬ с = 20.8 нс * 12 тактов = 250 нс.

Кажется музейная атмега считает свои 5 тактов дольше чем СТМ32 12 тактов)))

У СТМ32 нет эпрома? Уверены? STM32L152 - 8кБ эпрома! А у атмеги? 512 Байт? О как много!!! Даже не знаю что же такого туда б записать. Давайте подумаем... ммм... 16 переменных по 4 Байта)) Ну прямо гроза среди контроллеров))

SIM31 30.06.19 19:29

По потреблению можно еще сравнить, новые atmega, attiny весьма экономичны.
А так всему свое применение. Если нужна мощность, берем Raspbery Pi 4 и не паримся, на Питоне еще больше возможностей, хоть web сервер поднимай полноценный, хоть Quake 3D гоняй.
Если нужны потоки данных обрабатывать есть плис (смотрите проект "Марсоход" "Марсоход2")
Автору гора плюсов, но то что Ардуина живее всех живых, говорит что не все так просто.


Уже много лет радиолюбители применяют восьмиразрядные микроконтроллеры семейств 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. Все прошивки и схемы будут общедоступны.

© 2024 baraxlo2020.ru -- Немного о компьютере и современных гаджетах