Предисловие
В виду того, что перед многими желающими начать изучение микроконтроллеров встает множество вопросов, таких как «С чего начать?», «Какой микроконтроллер взять для изучения, ведь их слишь много и все они такие разные?», «Какой язык программирования необходимо знать?», «Как запрограммировать микроконтроллер и что для этого нужно?», «Какую первую схему на нем собрать?», а также множество других вопросов. Почти все в связи с таким большим обилием вопросов уже в самом начале изучения пугаются кажущейся им сложности освоения микроконтроллеров, ведь для этого необходимо знать как электронику, чтобы уметь собирать схемы с микроконтроллерами, так и быть программистом, для написания программ. Но в действительности не все так сложно, как это может показаться на первый взгляд, ведь для написания своих первых программ достаточно изучить лишь основы языка программирования, а дальнейший опыт написания программ придет сам с практикой. Что же касается электронной части, то в мире существуют недорогие и в тоже время хорошие отладочные платы с программаторами, приобрести которые не составит проблем. Моей же задачей, при написании данного цикла статей, будет донести читателю базовые знания необходимые для возможности дальнейшего самостоятельного изучения микроконтроллеров. Я постараюсь преподнести всю информацию в наиболее доступном и понятном, для начинающих, виде, а в качестве микроконтроллера для своего рассказа я выбрал один из самых распространенных, дешевых, и, на мой взгляд, перспективных контроллеров STM32. Надеюсь, данный цикл статей будет для Вас полезен и интересен, и Вы тоже начнете создавать свои устройства на микроконтроллерах, ведь это очень интересно, увлекательно и раскроет перед Вами широкие возможности в плане создания собственных электронных устройств.
Почему ARM?
Технический прогресс не стоит на месте, появляются различные все более сложные устройства, и соответственно производители микроконтроллеров спешат не отстать от технического прогресса, разрабатывая все более мощные и «навороченные» микроконтроллеры, при этом постоянно снижая цены на них. В последнее время наметился рост популярности ARM микроконтроллеров, а с приходом бюджетных контроллеров с ядром Cortex-M цена стала наслишь доступной, что уже может спокойно конкурировать с 8 и 16 битными контроллерами, такими как AVR, PIC, MSP430 и т.п., а зачастую она даже бывают меньше цены своих восьмибитных собратьев. Помимо этого для ARM микроконтроллеров существует множество средств отладки и программирования, цены на которые, вполне доступные даже для покупки «для домашнего использования». Так, например, официальная отладочная плата STM32VL Discovery имеющая на борту внутрисхемный отладчик ST-LINK и отлаживаемый микроконтроллер STM32F100RBT со 128 кБайт флеш памяти, 8 кБайт ОЗУ и 24МГц тактовой частотой в розницу стоит 10-15 долларов.
Для сравнения возьмем несколько популярных контролеров находящихся примерно в одной ценовой категории и сравним их с ARM контроллером STM32F100C4T6B продающимся по цене менее 1 доллара.
Таблица 1. Сравнительная таблица параметров распространенных микроконтроллеров
Параметр
STM32F100C4T6B
ATmega48PA-PU
ATtiny13A-SSU
PIC16F505-I/SL
Средняя цена
30 руб.
55 руб.
30 руб.
35 руб.
Объем флеш памяти (ROM, памяти программ)
16 КБайт
4 КБайта
1 КБайт
1 КБайт
Объем оперативной памяти (RAM, памяти данных)
4096 Байт
512 Байт
64 Байта
72 Байта
Тактовая частота
24 МГц, 30 DMIPS
20 МГц
20 МГц
20МГц
Линий ввода/вывода
37
23
6
12
АЦП
16-каналов
12-бит
8-каналов
10-бит
4-канала
10-бит
0
ЦАП
12–битный
0
0
0
USART
2
1
0
0
SPI
1
1
1
0
I2C
1
1
0
0
Количество таймеров
5
3
1
1
DMA
7 каналов
0
0
0
Из таблицы явно видно, что ARM микроконтроллер STM32F100C4T6B по всем параметрам оставляет своих 8-и битных собратьев далеко отстающими. Помимо указанных в таблице особенностей следует также принять во внимание тот факт, что ARM контроллеры являются 32 разрядными, что означает возможность работы с 32 битными данными за один такт процессора, для 8 битных же процессоров для этого требуется гораздо большее количество тактов.
Ещё одной приятной особенностью использования микроконтроллеров STM32, является полная аппаратная совместимость в районе одного корпуса, т.е. если по каким-то причинам не хватает ресурсов заложенного в схему микроконтроллера, всегда можно на его место запаять другой подходящий микроконтроллер. При этом иногда может потребоваться лишь небольшое изменение программы, и таких изменений в программе, как правило, необходимо сделать существенно меньше, чем например при портировании программы с одного микроконтроллера AVR на другой микроконтроллер AVR.
Как мы уже убедились, ARM микроконтроллеры имеют гораздо более высокие технические характеристики и возможности. Мы провели сравнение на самом младшем микроконтроллере STM32, на текущий момент самым «навороченным» из этой серии можно назвать микроконтроллеры STM32F407, имеющий 1 мегабайт ROM памяти, 192 килобайта RAM памяти и работающем на частоте до 168 МГц, при этом выполняя до 210 миллионов операций в секунду.
Данный микроконтроллер включает в себя такие модули как:
- интерфейс камеры;
- крипто/хеш аппаратный процессор;
- Ethernet MAC10/100 с IEEE 1588 v2;
- 2 USB OTG;
- отдельный аудио PLL и 2 полнодуплексных I²S;
- до 15 коммуникационных интерфейсов включающих:
— 6x USART;
— 3x SPI;
— 3x I²C;
— 2x CAN;
— SDIO - 2x 12-bit АЦП;
- 3x 12-bit ЦАП;
- до 17 таймеров 16 и 32 битных работающих до 168 МГц;
- Шина (FSMC) подключения внешних RAM, ROM, NandFlash;
- Контроллер DMA используя его можно легко и непринужденно пересылать блоки данных между периферией и памятью без использования процессора.
Такому богатому набору периферийных модулей, пожалуй, может позавидовать любой 8и битный микроконтроллер.
Вопрос отладки и программирования также не является проблемой, поскольку за 10-15 долларов можно приобрести официальную отладочную плату STM32VL Discovery (см. рис. 1), имеющую выход для программирования внешних микроконтроллеров.
Рис. 1 Фотография STM32VLDiscovery
Но даже если у Вас нет такой платы, то Вы всегда сможете запрограммировать микроконтроллер, через имеющийся в нем заводской загрузчик (bootloader), подключив его через USART или USB к своему ПК, для этого не потребуется каких либо аппаратных программаторов. Для программирования микроконтроллера имеющего встроенный USB бутлоадер, достаточно скопировать файл прошивки на контроллер, как на USB-накопитель. Для программирования микроконтроллера через USART, необходимо произвести его подключение к ПК с помощью преобразователя уровней USART-RS232 либо USART-USB преобразователя и воспользовавшись программой Flash Loader Demonstrator произвести загрузку файла прошивки во флеш память микроконтроллера. Программу Flash Loader Demonstrator можно взять с официального сайта компании ST.
Кроме этого у микроконтроллеров с ядром ARM Cortex-M3, по сравнению, например с ATMega и т.п. нет фьюзов, все управление осуществляется полностью программно, таким образом, отсутствует вероятность испортить микроконтроллер неправильным программированием фьюз битов.
Так почему же, при всех этих преимуществах, ARM микроконтроллеры ещё не вытеснили другие контроллеры? Причин этому несколько. Во первых ядро ARM Cortex-M3, благодаря которому появились столь дешевые микроконтроллеры серии ARM, появилось относительно недавно и как следствие пока существует не так много примеров программ и библиотек, но их количество постоянно увеличивается с очень большой скоростью, в том числе большой вклад в это развитие вносят и сами производители микроконтроллеров ST и NXP, создавая различные апноуты и библиотеки. Другим фактором является лень многих людей осваивать новую для них архитектуру, а также необходимость приобретения средств для отладки, ведь им зачастую хватает и восьми битных микроконтроллеров, при этом они очень много сил и времени тратят на то, чтобы уложиться в имеющиеся в микроконтроллере ресурсы. Для начинающих же такое обилие имеющийся периферии и настроек пугает кажущейся сложностью в освоении, но в действительности это является заблуждением, поскольку производители микроконтроллеров позаботились и создали удобные библиотеки для работы с периферией, позволяющей практически не открывая даташит настроить основные периферийные модули. Также сдерживающим фактором на применение микроконтроллеров ARM Cortex-M3 в «домашних условиях» является наличие микроконтроллеров в корпусах LQFP с шагом ножек 0.5 мм, но тем не менее, такую плату при определенной сноровке изготовить ЛУТом не составит большого труда.
Таким образом, рассеяв последние опасения, и убедившись в том, что STM32 на ядре ARM Cortex-M3 это действительно достойный для изучения и применения микроконтроллер, можно смело переходить к первому шагу. Для начала нам потребуется скачать и установить необходимые для работы программы, справочные материалы и библиотеки. Поскольку большинство пользователей, работают под операционной системой Windows, то я буду рассматривать описание программ лишь для данной операционной системы, но хочу заметить, что пользователи других операционных систем также имеют возможность заниматься разработкой программ для МК ARM STM32. Для этого им необходимо использовать ПО для своей операционной системы, например все необходимое ПО для Linux можно скачать здесь. Но в любом случае описанные мною программы для Windows. возможно запустить под Wine, за исключением возможности внутрисхемной отладки и программирования.
—Flash Loader Demonstrator — программа необходима для загрузки микропрограммы во флеш контроллер, через встроенный бутлоадер;
—ST-LINK Utility – программа для записи/чтения флеш памяти микроконтроллера через отладчик ST-LINK;
—ST-LINK USB – драйвер для отладчика ST-LINK;
—UM0627: ST-LINK in-circuit debugger/programmer for STM8 and STM32 microcontrollers – документ описывающий какие выводы и как подключать к программатору/отладчику;
—UM0919: STM32VLDISCOVERY STM32 value line Discovery — описание отладочной платы STM32VL Discovery, включающее в себя назначение выводов платы и схему электрическую принципиальную;
—DS6517: Low & medium-density value line, advanced ARM-based 32-bit MCU with 16 to 128 KB Flash, 12 timers, ADC, DAC & 8 comm interfaces – описание аппаратной части микроконтроллера STM32F100;
—RM0041: STM32F100xx advanced ARM-based 32-bit MCUs – описание всех регистров микроконтроллера STM32F100;
—STM32F10x standard peripheral library – стандартная библиотека для работы с периферией от компании ST;
IAR Embedded Workbench for ARM — мощная и эффективная среда разработки для ARM микроконтроллеров на языке C. Поскольку программа является платной, то ссылку для скачивания не указываю, но хочу заметить, что помимо платной версии также существуют и бесплатные версии с ограничением по времени работы программы. Официально бесплатные версии можно скачать с сайта производителя http://www.iar.com, пробная 30 дневная версия доступна по ссылке.
Официальная утилита для конфигурирования периферии microxplorer — Пока что данная программа находится на этапе разработке и в ней реализованы ещё не все задуманные функции.
STM32 Генератор программного кода – бесплатная программа для наглядного создания кода настройки микроконтроллера. Данная программа пока что ещё является развивающейся и содержит много недоработок, но автор работает над данной программой, постоянно исправляя ошибки, совершенствуя программу и добавляя новые возможности.
Ознакомительное руководство по ARM-микроконтроллерам Cortex-M3– Данное руководство будет полезно для ознакомления со структурой микроконтроллеров семейства STM32 Cortex-M3.
STM_DOC_RU — содержит переводы 3-х документов с сайта фирмы ST:
Частичный перевод файла «STM32F10xxx Cortex-M3 programming manual.PDF» ревизия 2 от 18.01.2010.
Частичный перевод файла «STM32F105_107_Reference manual.pdf» ревизия 9 от 14.09.2009.
Полный перевод файла «Errata_stm32f107.pdf» ревизия 3 от 14.01.2010.
Работа с данными программами (за исключением IAR Embedded Workbench) довольна простая и не должна вызвать затруднения. О работе в среде программирования IAR Embedded Workbench будет рассказано в третьей части.
Скачав необходимую документацию и установив программы, можно переходить непосредственно к изучению микроконтроллеров.
Что такое микроконтроллер ARM STM32 и как он устроен?
Для начала выясним, что же такое микроконтроллер. Микроконтроллер (англ. Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает в себе функции процессора и периферийных устройств, содержит Оперативное Запоминающее Устройство (ОЗУ) или Постоянное Запоминающее Устройство (ПЗУ). По сути, это однокристальный компьютер, способный выполнять простые задачи. Как и компьютер, микроконтроллер — это электронное устройство, работой которого управляет программа — последовательность команд, заранее загруженная в память. В отличие от микропроцессоров, используемых в персональных компьютерах, микроконтроллеры содержат встроенные дополнительные устройства (такие периферийные модули как таймеры, SPI, USART и т.п.).
Для хранения исполняемого кода программ используется flash память, называемая также ROM памятью или памятью программ. Данная память является энергонезависимой, а количество циклов записи/стирания ограничено порядка 10 000 раз. Данная память является неким подобием жесткого диска компьютера.
Для хранения различных изменяющихся данных, используемых во время выполнения программы, предназначена оперативная память (RAM), или её также называют памятью данных. Эта память может быть записана/стерта любое количество раз, но данные в этой памяти могут сохраняться лишь пока на микроконтроллер подано питание. Данная память является подобием оперативной памяти компьютера.
Для сохранения редко изменяющихся данных и хранения их во время, когда питание микроконтроллера отключено, используется EEPROM память. Данная память имеется у некоторых видов микроконтроллеров, но в виду её отсутствия в микроконтроллерах ARM Cortex данный вид памяти эмулируется программно, и в качестве физической памяти для сохранения данных используется flash память.
Разумеется, любая выполняющаяся программа на любом микроконтроллере должна «общаться» с внешним миром, для этого у всех микроконтроллеров существуют группы выводов, называемых портами ввода/вывода. Для обозначения выводов портов используется буквенно-цифровое обозначение, такое как А0, А1, А5, В4 и т.п. Буквой обозначается имя самого порта, а цифрой указывается конкретный вывод данного порта. Все выводы одного порта могут быть одновременно изменены на требуемое состояние, выводы разных портов лишь поочередно, сперва изменяется состояние всех нужных выводов одного порта, далее другого порта. Количество выводов одного порта может насчитывать до 16шт, нумерация выводов начинается с нулевого.
Для примера рассмотрим микроконтроллер STM32F100Cxx. Данный микроконтроллер изготовлен в корпусе LQFP48, и имеет 48 выводов, 37 из которых могут использоваться как порты ввода/вывода. Этот микроконтроллер имеет 4 порта, два из которых, порт А и порт В полные, т.е. содержат все 16 выводов, и два не полных порта, это порты С и D, содержащие лишь 3 и 2 вывода соответственно.
Оставшиеся выводы задействованы для других функций, таких как питание самого микроконтроллера, выводы Vdd и Vss, питание аналоговой части Vdda и Vssa, вход батарейного питания Vbat, для работы встроенных часов реального времени и вход BOOT0, для выбора загрузки встроенного бутлоадера.
Рис. 2. Расположение выводов микроконтроллера STM32F100Cxx
Порты микроконтроллера могут быть сконфигурированы как на вход, так и как на выход, причем каждый вывод порта настраивается индивидуально. Если вывод порта настроен как вход, то возможны следующие режимы его работы:
- аналоговый вход (для выводов, на которые выведен вход АЦП, аналогового компаратора) (см. рис 3);
- цифровой вход, для непосредственной работы с портом (может иметь верхний (к питанию) и нижний (к общему проводу) подтягивающий резистор) (см. рис. 4);
- цифровой вход в режиме альтернативной функции (используется как вход для различных периферийных модулей) (см. рис. 6).
- В режиме работы на выход, выводы порта могут быть настроены следующим образом:
- выход с непосредственным программным управлением с симметричным выходом (push-pull) (см. рис. 5);
- выход с непосредственным программным управлением с открытым стоком (см. рис. 5);
- выход в режиме работы альтернативной функции (выход для различных периферийных моделей, таких как SPI, USART, ШИМ (PWM) и пр.), с симметричным выходом (push-pull) (см. рис. 6);
- выход в режиме работы альтернативной функции, с открытым стоком (например, выход ШИМ) (см. рис. 6).
Помимо этого, в настройках порта также задается максимальная частота работы порта, данная настройка позволяет снизить энергопотребление микроконтроллера, если не требуется высокая скорость переключения состояния вывода.
Рис. 3 Режим работы вывода порта в качестве аналогового входа
Рис. 4 Режим работы вывода порта в качестве цифрового входа
Рис. 5 Режим работы вывода порта в качестве цифрового выхода
Рис. 6 Режим работы вывода порта в качестве цифрового входа/выхода в режиме альтернативной функции
Несмотря на то, что для работы микроконтроллера достаточно процессорного ядра, RAM и ROM памяти, а также портов ввода/вывода, разработчики микроконтроллеров добавляют в свои изделия различные периферийные модули, позволяющие существенно упростить написание программ, а также повысить эффективность, надежность программ, сократить необходимое количество внешних элементов и многое другое.
Среди имеющихся в микроконтроллере периферийных модулей, можно выделить довольно большую группу, основной задачей которых является обмен данными с различными внешними устройствами, данные модули называются интерфейсами передачи данных. В микроконтроллерах STM32 доступны следующие интерфейсы передачи данных:
Таблица 2. Периферийные интерфейсные модули
Название интерфейса
Описание
FSMC
Интерфейс подключения внешней SRAM, PSRAM, NOR, NANDROM, RAM, NandFlash, Compact Flash памяти, а также для подключения LCD дисплеев с параллельной шиной.
Ethernet
Интерфейс для подключения к компьютерной сети.
SPI/(I2S)
Широко распространенный последовательный интерфейс передачи данных, служит для подключения различных микросхем, карт памяти, LCD дисплеев с последовательной шиной и многое другое.
I2C
Двухпроводная шина передачи данных, служит для подключения различных микросхем и других модулей.
USART
UART
Стандартный универсальный синхронный (асинхронный) приемо-передающий интерфейс, служит для обмена данными с другими устройствами через RS-232, RS-485 шины и т.п..
USB
Современный компьютерный интерфейс передачи данных, предназначен для подключения к микроконтроллеру USB клавиатур, flash накопителей, а также для подключения микроконтроллера к ПК, может работать как в режиме устройства (Device), так и в режиме хоста (Host).
CAN
Промышленный интерфейс передачи данных, также используется в автомобилестроении и т.п.
Camera interface
Специализированный интерфейс, предназначенный для подключения высокоскоростной цифровой камеры, с 8-, 10-, 12- или 14-битной параллельной шиной данных
SDIO
Интерфейс для высокоскоростного подключения SD карт памяти.
HDMI
Мультимедийный интерфейс высокой четкости
Благодаря наличию данных интерфейсов в микроконтроллере, существенно упрощается часть программы, отвечающая за обмен данными с внешними устройствами. Поскольку все функции по передачи и приему данных возлагаются на микроконтроллер, в программе достаточно лишь правильно настроить интерфейсный модуль, а для работы с ним необходимо лишь записать в соответствующий регистр данные для передачи, всю работу по передаче данных сделает сам микроконтроллер.
Помимо периферийных модулей, отвечающих за обмен данными с внешними устройствами, существуют также и другие различные периферийные модули, значение которых не менее важное, чем интерфейсных модулей. Список этих периферийных модулей приведен в таблице 3.
Таблица 3. Периферийные модули
Название модуля
Описание
Таймер
Очень важный модуль, позволяющий точно отмерять интервалы времени, генерировать выходной ШИМ сигнал, подключать энкодер, подсчитывать период входного сигнала и др.
ADC (АЦП)
Аналогово-цифровой преобразователь (имеет встроенный датчик температуры) предназначен для измерения значений аналоговых напряжений, также может работать как оконный компаратор.
DAC (ЦАП)
Цифро-аналоговый преобразователь выдает на выходе аналоговый сигнал соответствующий заданному цифровому значению.
CRC
Модуль подсчета CRC
RTC
Часы реального времени
DMA
Модуль прямого доступа к памяти
JTAG
Модуль внутрисхемной отладки программы
Прерывания
Поскольку программа выполняется микроконтроллером шаг за шагом в определенной последовательности, а, например, внешнее устройство, подключенное к микроконтроллеру через какой либо интерфейс, может передать данные в совершенно произвольное время, то было бы очень затруднительно постоянно следить за принятием данных от таких внешних устройств, помимо этого очень много процессорного времени уходило бы на постоянные проверки наличия таких событий. По этой причине в микроконтроллерах была добавлена возможность прервать последовательное выполнение основной программы, в случае возникновения определенных событий, и перейти к выполнению подпрограммы, занимающейся обработкой данного события. Такой переход называется «прерывание». По окончанию обработки события («обработчика прерывания») вызвавшего прерывание, программа возвращается к выполнению основной программы, к тому самому месту, с которого она была прервана.
Но прерывание может быть вызвано не лишь внешними сигналами, но и внутренними устройствами самого микроконтроллера: таймерами, часами реального времени и др… Опять-таки, делается это в основном для того, чтобы уменьшить количество выполняемых команд по анализу состояния этих периферийных устройств и облегчить написание программ.
Немного подытоживая описанное, можно сделать вывод, что любой микроконтроллер состоит из:
Ядра микроконтроллера (в нашем случае ARM Cortex-M3), выполняющего программные команды;
Flash памяти для хранения кода выполняемой программы;
RAM памяти, для хранения переменных данных;
Портов ввода/вывода, для «общения с внешним миром»;
Периферийных модулей, выполняющих программные и/или аппаратные действия;
Контроллера вложенных векторизованных прерываний, позволяющего по определенному событию прервать выполнение основной программы и перейти к выполнению другой подпрограммы;
Шины данных, соединяет всё вышеперечисленное в единое целое устройство.
Устройство микроконтроллера
Немного разобравшись со структурой микроконтроллеров серии STM32, можно переходить к более детальному изучению данной серии микроконтроллеров основываясь на конкретном микроконтроллере. Поскольку на нашей отладочной плате установлен микроконтроллер STM32F100RBT6B, то именно на его примере мы и продолжим наше изучение.
Для начала рассмотрим схему включения микроконтроллера STM32F100RBT6B в отладочной плате STM32VLDiscovery (см. рис. 7).
Рис. 7. Схема электрическая принципиальная включения отлаживаемого микроконтроллера платы STM32VLDiscovery
Как видно из схемы на рисунке 7, все выводы портов микроконтроллера выведены на внешний разъем, это сделано для возможности использования подключения к данному контроллеру внешних устройств и элементов.
На данной плате также имеется пользовательская кнопка В1, подключенная к нулевому выводу порта А (РА0). В свободном состоянии кнопка разомкнута и через резистор R21 вход порта подтянут на землю, конденсатор С22 защищает вход от внешних наводок. При нажатии на кнопку, вход микроконтроллера РА0 замыкается на плюс питания, таким образом на микроконтроллер подается логическая единица.
Кнопка В2 замыкает вывод микроконтроллера RESET на общий провод, таким образом, это приводит к аппаратному сбросу программы. По отпускании кнопки, через подтягивающий резистор R24, вход RESET подтягивается к +3,3В, и контроллер начинает выполнение программы с самого начала.
Вывод микроконтроллера BOOT0, разрешающий запуск встроенного загрузчика (бутлоадера), через резистор R14 и перемычку SB16 подключен к общему проводу, таким образом, он запрещает запуск встроенного бутлоадера. Для разрешения запуска встроенного бутлоадера необходимо замкнуть вывод BOOT0 на +3,3В. Если в момент сброса на BOOT0 окажется низкий логический уровень, то не зависимо от того, какой уровень на BOOT1 МК грузится из внутренней флеш памяти (запускается написанная нами программа). В случае если на BOOT0, во время перезагрузки/включения, окажется высокий уровень, тогда анализируется вход BOOT1, чтобы определить вариант дальнейшей загрузки, т.е. грузиться микроконтроллеру из внутреннего бутлоадера или из оперативной памяти.
К выводам 3 микроконтроллера (OSC32_OUT) и 4 (OSC32_IN) подключен кварцевый резонатор Х3, с рабочей частотой 32768Гц. Данный кварцевый резонатор предназначен для тактирования встроенных часов реального времени. Для тактирования самого микроконтроллера установлен кварцевый резонатор Х2, работающий на частоте 8МГц. Этот кварц установлен в специальную панельку и без проблем может быть заменен на другой либо убран.
К выводам 8 и 9 порта С через токоограничительные резисторы подключены зеленый LD3 и синий LD4 светодиоды.
Выводы 46 (TMS/SWDIO) и 49 (TCK/SWCLK) контроллера подсоединены к установленному на этой же плате ST-Link программатору-отладчику и используются для программирования и внутрисхемной отладки микроконтроллера.
Установленный микроконтроллер имеет следующие характеристики:
- ROM 128кБайт,
- 8кБайт RAM,
- 7 таймеров,
- 2 SPI интерфейса,
- 2 I2C интерфейса,
- 3 USART интерфейса,
- Один 16-и канальный, 12-и битный АЦП,
- Два 2-хканальных 12-и битных ЦАП,
- 7-и канальный DMA контроллер,
- 51 линию ввода/вывода
- Максимальная тактовая частота 24МГц,
- Диапазон питающих напряжений 2.0-3.6В
Расположение выводов микроконтроллера, с кратким описанием некоторых из них приведено в таблице 4.
Таблица 4. Назначение выводов микроконтроллера STM32F100RBT6B
№ вывода
Название основной функции
(описание)
Альтернативная функция
Перенаправление
1
Vbat (вход питания для часов от резервной батареи)
2
PC13
TAMPER-RTC
3
PC14 (выход для подключения кварцевого резонатора)
OSC32_IN (вход для подключения часового кварцевого резонатора (32768Гц))
4
PC15
OSC32_OUT (выход для подключения часового кварцевого резонатора)
5
OSC_IN (вход для подключения кварцевого резонатора)
PD0
6
OSC_OUT (выход для подключения кварцевого резонатора)
PD1
7
NRST (вход аппаратного сброса)
8
PC0
ADC1_IN10 (вход АЦП)
9
PC1
ADC1_IN11
10
PC2
ADC1_IN12
11
PC3
ADC1_IN13
12
VSSA (минус питания аналоговой части (аналоговая «земля»))
13
VDDA (+3,3В питание аналоговой части)
14
PA0
WKUP / USART2_CTS/ADC1_IN0 / TIM2_CH1_ETR
15
PA1
USART2_RTS/ADC1_IN1/TIM2_CH2
16
PA2
USART2_TX/ADC1_IN2/
TIM2_CH3/TIM15_CH1
17
PA3
USART2_RX/ADC1_IN3/
TIM2_CH4/TIM15_CH2
18
VSS_4 (минус питания цифровой части)
19
VDD_4 (+3,3В питание цифровой части)
20
PA4
SPI1_NSS / ADC1_IN4
USART2_CK / DAC1_OUT
21
PA5
SPI1_SCK /ADC1_IN5 / DAC2_OUT
22
PA6
SPI1_MISO /ADC1_IN6 / TIM3_CH1
TIM1_BKIN / TIM16_CH1
23
PA7
SPI1_MOSI /ADC1_IN7 / TIM3_CH2
TIM1_CH1N /
TIM17_CH1
24
PC4
ADC1_IN14
25
PC5
ADC1_IN15
26
PB0
ADC1_IN8/TIM3_CH3
TIM1_CH2N
27
PB1
ADC1_IN9/TIM3_CH4
TIM1_CH3N
28
PB2/BOOT1
29
PB10
I2C2_SCL / USART3_TX
TIM2_CH3 / CEC
30
PB11
I2C2_SDA / USART3_RX
TIM2_CH4
31
VSS_1 (минус питания цифровой части)
31
VDD_1 (+3,3В питание цифровой части)
33
PB12
SPI2_NSS / I2C2_SMBA /
TIM1_BKIN / USART3_CK
34
PB13
SPI2_SCK/TIM1_CH1N/USART3_CTS
35
PB14
SPI2_MISO/TIM1_CH2N/USART3_RTS
TIM15_CH1
36
PB15
SPI2_MOSI/TIM1_CH3N/TIM15_CH1N
TIM15_CH2
37
PC6
TIM3_CH1
38
PC7
TIM3_CH2
39
PC8
TIM3_CH3
40
PC9
TIM3_CH4
41
PA8
USART1_CK / MCO / TIM1_CH1
42
PA9
USART1_TX / TIM1_CH2
TIM15_BKIN
43
PA10
USART1_RX / TIM1_CH3
TIM17_BKIN
44
PA11
USART1_CTS / TIM1_CH4
45
PA12
USART1_RTS / TIM1_ETR
46
PA13
47
VSS_2 (минус питания цифровой части)
48
VDD_2 (+3,3В питание цифровой части)
49
PA14
50
PA15
TIM2_CH1_ETR/ PA15/ SPI1_NSS
51
PC10
USART3_TX
52
PC11
USART3_RX
53
PC12
USART3_CK
54
PD2
TIM3_ETR
55
PB3
TIM2_CH2 / PB3
TRACESWO
SPI1_SCK
56
PB4
PB4 / TIM3_CH1
SPI1_MISO
57
PB5
I2C1_SMBA / TIM16_BKIN
TIM3_CH2 /
SPI1_MOSI
58
PB6
I2C1_SCL / TIM4_CH1 / TIM16_CH1N
USART1_TX
59
PB7
I2C1_SDA / TIM17_CH1N / TIM4_CH2
USART1_RX
60
BOOT0 (вход выбора встроенного загрузчика (бутлоадера))
61
PB8
TIM4_CH3 / TIM16_CH1 / CEC
I2C1_SCL
62
PB9
TIM4_CH4 / TIM17_CH1
I2C1_SDA
63
VSS_3 (минус питания цифровой части)
64
VDD_3 (+3,3В питание цифровой части)
Некоторые периферийные модули в своих настройках позволяют изменить свои выводы на другие ножки микроконтроллера. Варианты ножек на которые возможно сделать такое перенаправление, для каждого конкретного модуля, указано в в столбце «Перенаправление» таблице 4. Возможность такого перенаправления выводов периферийных модулей позволяет более эффективно использовать имеющуюся на борту периферию, а также облегчает процесс трассировки платы, во время разработки устройства. Таблицу назначения выводов и возможных вариантов переназначения функций выводов для конкретного контроллера необходимо смотреть в разделе 3 «Pinouts and pin description» даташита на конкретный контроллер.
Управление контроллером
Для управления любым периферийным модулем микроконтроллера необходимо произвести запись соответствующих настроек в регистр данного периферийного модуля. Регистры микроконтроллера представляют собой специальные элементы памяти, предназначенные для организации управления (управление прерываниями, таймерами, интерфейсными модулями и т.д.) и ввода/вывода данных (регистры данных портов, интерфейсных модулей и т.д.). У каждого периферийного модуля имеется свой определенный набор регистров, каждый регистр представляет собой 32-х битное число. Описание всех регистров с возможными вариантами настройки находится в файле «RM0041 Reference manual.pdf», приводить полный список регистров и тем более их описания не вижу смысла, поскольку во первых это описание занимает более 600 страниц, и во вторых при написании нами программ, в последних частях данного цикла статей, я познакомлю вас работе с библиотеками от ST для периферии и ядра, делающих работу с микроконтроллером существенно нагляднее и понятнее. А сейчас рассмотрим основы работы с регистрами, для понимания принципов работы с настройкой микроконтроллера.
Любое устройство на микроконтроллере должно выполнять некоторое заложенные программой функции и в соответствии с этим алгоритмом управлять внешними элементами. Для возможности такого управления необходимо настроить соответствующие выводы порта на выход. В качестве примера можно включить светодиоды LD3 и LD4.
Перед настройкой любого периферийного модуля необходимо разрешить тактирование шины, на которой находится данный модуль. После включения микроконтроллера, все эти шины отключены от тактирования, это сделано для минимизации энергопотребления микроконтроллера. Светодиоды LD3 и LD4 подключены к порту С. За тактирование порта С отвечает регистр RCC_APB2ENR (см. таблицу 5 статьи, либо стр. 91, 92 файла RM0041 Reference manual.pdf).
Таблица 5. Структура регистра RCC_APB2ENR
Данный регистр является 32х битным, это значит, что он может содержать до 32х логических параметров. В нашем случае для порта С используется бит с номером 4, называющийся IOPCEN (расшифровывается как — Input/Output Port C clock ENabled). Для разрешения тактирования порта С, мы должны установить этот бит в логическую единицу (как производить такую установку на языке программирования, будет рассказано в следующих частях). После того как мы разрешили тактирование порта С, можно приступать к настройке самого порта.
Нам необходимо произвести настройку нашего порта на симметричный выход (в режиме полумоста (push-pull)). Рассмотрим, какие в микроконтроллере имеются регистры, относящиеся к настройке портов ввода/вывода, описание данных регистров начинается на стр. 111 (раздел 7.2 в файле RM0041 Reference manual.pdf).
GPIOx_CRL — Младший регистр конфигурации порта х;
GPIOx_CRH — Старший регистр конфигурации порта х;
GPIOx_IDR — Регистр данных входа, в этом регистре находятся значения входных логических уровней порта, данный регистр предназначен лишь для чтения физического состояния выводов порта x;
GPIOx_ODR – Выходной регистр осуществляет запись данных непосредственно в порт х;
GPIOx_BSRR – Регистр сброса/установки битов порта;
GPIOx_BRR – Регистр побитного сброса и установки состояния выходов порта;
GPIOx_LCKR – Регистр блокировки изменений настроек порта.
Рассмотрим подробнее назначение данных регистров.
Регистры конфигурации порта GPIOx_CRL и GPIOx_CRH
Таблица 6. Структура регистра GPIOx_CRL
Таблица 7. Структура регистра GPIOx_CRH
Настройка каждого вывода порта занимает четыре бита данных. Настройки младших 8 выводов порта расположены в регистре GPIOx_CRL, настройки старших 8 бит расположены в регистре GPIOx_CRH.
Группа битов MODEn определяет направление порта (на вход или выход) и максимальную частоту работы порта, если порт настроен на выход.
Таблица 8. Описание полей MODEn
MODEn[1]
MODEn[0]
Режим
0
0
Вход (режим по умолчанию)
0
1
Выход с максимальной частотой работы порта 10МГц
1
0
Выход с максимальной частотой работы порта 2МГц
1
1
Выход с максимальной частотой работы порта 50МГц
Группа битов CNFn определяет параметры порта, режим работы порта, который определяет данная группа битов, зависит от настройки направления порта.
Таблица 9. Описание полей CNFn
CNFn[1]
CNFn[0]
Порт настроен на вход
Порт настроен на выход
0
0
Аналоговый режим
Симметричный выход (push-pull)
0
1
Цифровой вход (режим по умолчанию)
Выход с открытым стоком
1
0
Цифровой вход с подтягивающими резисторами
Симметричный выход в режиме альтернативной функции
1
1
Зарезервирован
Выход в режиме альтернативной функции с открытым стоком
Поскольку нам требуется настроить выводы как симметричный выход, а большого быстродействия порта не требуется, то нам необходимо в регистр порта С GPIOC_CRH в бите вывода 8 MODE81 установить логическую единицу, а бит MODE80 сбросить в ноль (хотя он у нас является сброшенным по умолчанию), таким образом, мы настроим вывод как выход с максимальным быстродействием 2МГц. Для выбора работы порта с выходом в режиме push-pull необходимо в регистре GPIOС_CRH сбросить биты CNF81 и CNF80. Аналогично необходимо поступить и с выводом 9 порта С. В результате мы должны записать в регистр GPIOC_CRH число, представленное в двоичном виде — 0010 0010, это же число в шестнадцатеричном виде — 22. Содержимое данного регистра после этого будет соответствовать представленному в таблице 10.
Таблица 10. Содержимое регистра GPIOx_CRH после внесения изменений
Установку и сброс состояния выводов можно произвести двумя способами, первый способ это непосредственная запись в выходной регистр порта GPIOx_ODR значения всех выводов порта.
Если нам необходимо изменить содержимое не всего порта, а лишь некоторых выводов, то можно пойти другим путем. Для этого достаточно в регистре GPIOx_BSRR указать маску, по которой будут установлены в единицу и/или сброшены в ноль соответствующие выводы. Структура этого регистра представлена в таблице 11.
Таблица 11. Структура регистра GPIOx_BSRR
Данный регистр не может быть прочитан, он предназначен лишь для записи. Для установки нужных выводов в единицу, необходимо соответствующие выводам биты BS, регистра GPIOx_BSRR установить в единицу, выводы в которых биты BS небыли установлены, не будут изменены. Аналогично дело обстоит и со сбросом выводов в ноль, для этого в регистре GPIOx_BSRR имеются биты BR. Все выводы, для которых соответствующие биты BR были установлены, перейдут в нулевое логическое состояние. Использование данного регистра позволяет изменить состояние требуемых выводов порта, не изменяя состояния других выводов.
Так для того чтобы включить наши светодиоды, нам необходимо в регистре GPIOC_BSRR установить в единицу биты BS8 и BS9. Для этого достаточно в регистр GPIOC_BSRR записать число в двоичном виде 0000 0011 0000 0000, или это же число представленное в шестнадцатеричном виде 0х0000 0300. Для выключения лишь одного зеленого светодиода LD3 (он находится на выводе PC9) необходимо в регистре GPIOC_BSRR возвести бит BR9, т.е. число в этот регистр 0000 0001 0000 0000 (в двоичном виде) или оно же 0х0000 0100 (в шестнадцатеричном виде).
Аналогичным образом строится работа с настройкой и использованием других периферийных модулей. Изучать их мы будем постепенно, во время написания программ.
Следующим же шагом на пути к изучению микроконтроллеров я считаю разумным сделать изучение языка программирования, без знания которого изучение микроконтроллеров станет не интересным и затруднительным. В следующей части мы рассмотрим основы программирования на языке Си и напишем первую программу.
А сейчас на десерт, дабы ещё больше заинтересовать читателей в изучении микроконтроллеров STM32, приведу несколько небольших видео роликов, показывающих возможности этих контроллеров, просмотр этого видео покажет вам некоторые вещи которые возможно сделать на этих микроконтроллерах, и надеюсь, разовьет ваш интерес к их изучению ещё больше.
Подключение LCD дисплея к плате STM32VLDiscovery:
Демонстрация возможностей графической оболочки μU/GUI на плате STM32Mini+2.4″ LCD
Плеер с сенсорным графическим LCD дисплеем
Подключение камеры
Список использованных источников:
Серия STM32F100 (http://www.st.com/internet/mcu/product/216844.jsp)
Википедия (http://ru.wikipedia.org/wiki)
Ознакомительное руководство по ARM-микроконтроллерам Cortex-M3 (http://www.gaw.ru/html.cgi/txt/doc/micros/arm/cortex_arh/index.htm)
ARM – это просто (часть 2). Учимся говорить с электроникой на одном языке
Сторожев Денис (Дeн)