ARM это просто (часть 1)
В виду того, что перед многими желающими начать изучение микроконтроллеров встает множество вопросов, таких как [С чего начать?k, [Какой микроконтроллер взять для изучения, ведь их столько много и все они такие разные?k, [Какой язык программирования необходимо знать?k, [Как запрограммировать микроконтроллер и что для этого нужно?k, [Какую первую схему на нем собрать?k, а также множество других вопросов. Многие в связи с таким большим обилием вопросов уже в самом начале изучения пугаются кажущейся им сложности освоения микроконтроллеров, ведь для этого необходимо знать как электронику, чтобы уметь собирать схемы с микроконтроллерами, так и быть программистом, для написания программ. Но в действительности не все так сложно, как это может показаться на первый взгляд, ведь для написания своих первых программ достаточно изучить только основы языка программирования, а дальнейший опыт написания программ придет сам с практикой. Что же касается электронной части, то в мире существуют недорогие и в тоже время хорошие отладочные платы с программаторами, приобрести которые не составит проблем. Моей же задачей, при написании данного цикла статей, будет донести читателю базовые знания необходимые для возможности дальнейшего самостоятельного изучения микроконтроллеров. Я постараюсь преподнести всю информацию в наиболее доступном и понятном, для начинающих, виде, а в качестве микроконтроллера для своего рассказа я выбрал один из самых распространенных, дешевых, и, на мой взгляд, перспективных контроллеров STM32. Надеюсь, данный цикл статей будет для Вас полезен и интересен, и Вы тоже начнете создавать свои устройства на микроконтроллерах, ведь это очень интересно, увлекательно и раскроет перед Вами широкие возможности в плане создания собственных электронных устройств.
Технический прогресс не стоит на месте, появляются различные все более сложные устройства, и соответственно производители микроконтроллеров спешат не отстать от технического прогресса, разрабатывая все более мощные и [навороченныеk микроконтроллеры, при этом постоянно снижая цены на них. В последнее время наметился рост популярности ARM микроконтроллеров, а с приходом бюджетных контроллеров с ядром Cortex-M цена стала настолько доступной, что уже может спокойно конкурировать с 8 и 16 битными контроллерами, такими как AVR, PIC, MSP430 и т.п., а зачастую она даже бывают меньше цены своих восьмибитных собратьев. Помимо этого для ARM микроконтроллеров существует множество средств отладки и программирования, цены на которые, вполне доступные даже для покупки [для домашнего использованияk. Так, например, официальная отладочная плата 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, на текущий момент самым [навороченнымk из этой серии можно назвать микроконтроллеры STM32F407, имеющий 1 мегабайт ROM памяти, 192 килобайта RAM памяти и работающем на частоте до 168 МГц, при этом выполняя до 210 миллионов операций в секунду.
Данный микроконтроллер включает в себя такие модули как:
Такому богатому набору периферийных модулей, пожалуй, может позавидовать любой 8и битный микроконтроллер.
Вопрос отладки и программирования также не является проблемой, поскольку за 10-15 долларов можно приобрести официальную отладочную плату STM32VL Discovery (см. рис. 1), имеющую выход для программирования внешних микроконтроллеров.
Рис. 1 Фотография STM32VLDiscovery
Но даже если у Вас нет такой платы, то Вы всегда сможете запрограммировать микроконтроллер, через имеющийся в нем заводской загрузчик (bootloader), подключив его через USART или USB к своему ПК, для этого не потребуется каких либо аппаратных программаторов. Для программирования микроконтроллера имеющего встроенный USB бутлоадер, достаточно скопировать файл прошивки на контроллер, как на USB-накопитель. Для программирования микроконтроллера через USART, необходимо произвести его подключение к ПК с помощьюPпреобразователя уровней 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 в [домашних условияхk является наличие микроконтроллеров в корпусах 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 DiscoveryP- описание отладочной платы 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_RUP- содержит переводы трех документов с сайта фирмы 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 будет рассказано в третьей части.
Скачав необходимую документацию и установив программы, можно переходить непосредственно к изучению микроконтроллеров.
Для начала выясним, что же такое микроконтроллер. Микроконтроллер (англ. Micro Controller Unit, MCU) микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает в себе функции процессора и периферийных устройств, содержит Оперативное Запоминающее Устройство (ОЗУ) или Постоянное Запоминающее Устройство (ПЗУ). По сути, это однокристальный компьютер, способный выполнять простые задачи. Как и компьютер, микроконтроллер это электронное устройство, работой которого управляет программа последовательность команд, заранее загруженная в память. В отличие от микропроцессоров, используемых в персональных компьютерах, микроконтроллеры содержат встроенные дополнительные устройства (такие периферийные модули как таймеры, SPI, USART и т.п.).
Для хранения исполняемого кода программ используется flash память, называемая также ROM памятью или памятью программ. Данная память является энергонезависимой, а количество циклов записи/стирания ограничено порядка 10P000 раз. Данная память является неким подобием жесткого диска компьютера.
Для хранения различных изменяющихся данных, используемых во время выполнения программы, предназначена оперативная память (RAM), или её также называют памятью данных. Эта память может быть записана/стерта любое количество раз, но данные в этой памяти могут сохраняться только пока на микроконтроллер подано питание. Данная память является подобием оперативной памяти компьютера.
Для сохранения редко изменяющихся данных и хранения их во время, когда питание микроконтроллера отключено, используется EEPROM память. Данная память имеется у некоторых видов микроконтроллеров, но в виду её отсутствия в микроконтроллерах ARM Cortex данный вид памяти эмулируется программно, и в качестве физической памяти для сохранения данных используется flash память.
Разумеется, любая выполняющаяся программа на любом микроконтроллере должна [общатьсяk с внешним миром, для этого у всех микроконтроллеров существуют группы выводов, называемых портами ввода/вывода. Для обозначения выводов портов используется буквенно-цифровое обозначение, такое как А0, А1, А5, В4 и т.п. Буквой обозначается имя самого порта, а цифрой указывается конкретный вывод данного порта. Все выводы одного порта могут быть одновременно изменены на требуемое состояние, выводы разных портов только поочередно, сперва изменяется состояние всех нужных выводов одного порта, затем другого порта. Количество выводов одного порта может насчитывать до 16шт, нумерация выводов начинается с нулевого.
Для примера рассмотрим микроконтроллер STM32F100Cxx. Данный микроконтроллер изготовлен в корпусе LQFP48, и имеет 48 выводов, 37 из которых могут использоваться как порты ввода/вывода. Этот микроконтроллер имеет 4 порта, два из которых, порт А и порт В полные, т.е. содержат все 16 выводов, и два не полных порта, это порты С и D, содержащие только 3 и 2 вывода соответственно.
Оставшиеся выводы задействованы для других функций, таких как питание самого микроконтроллера, выводы Vdd и Vss, питание аналоговой части Vdda и Vssa, вход батарейного питания Vbat, для работы встроенных часов реального времени и вход BOOT0, для выбора загрузки встроенного бутлоадера.
Рис. 2. Расположение выводов микроконтроллера STM32F100Cxx
Порты микроконтроллера могут быть сконфигурированы как на вход, так и как на выход, причем каждый вывод порта настраивается индивидуально. Если вывод порта настроен как вход, то возможны следующие режимы его работы:
Помимо этого, в настройках порта также задается максимальная частота работы порта, данная настройка позволяет снизить энергопотребление микроконтроллера, если не требуется высокая скорость переключения состояния вывода.
Рис. 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 |
Модуль внутрисхемной отладки программы |
Поскольку программа выполняется микроконтроллером шаг за шагом в определенной последовательности, а, например, внешнее устройство, подключенное к микроконтроллеру через какой либо интерфейс, может передать данные в совершенно произвольное время, то было бы очень затруднительно постоянно следить за принятием данных от таких внешних устройств, помимо этого очень много процессорного времени уходило бы на постоянные проверки наличия таких событий. По этой причине в микроконтроллерах была добавлена возможность прервать последовательное выполнение основной программы, в случае возникновения определенных событий, и перейти к выполнению подпрограммы, занимающейся обработкой данного события. Такой переход называется [прерываниеk. По окончанию обработки события ([обработчика прерыванияk) вызвавшего прерывание, программа возвращается к выполнению основной программы, к тому самому месту, с которого она была прервана.
Но прерывание может быть вызвано не только внешними сигналами, но и внутренними устройствами самого микроконтроллера: таймерами, часами реального времени и др... Опять-таки, делается это в основном для того, чтобы уменьшить количество выполняемых команд по анализу состояния этих периферийных устройств и облегчить написание программ.
Немного подытоживая описанное, можно сделать вывод, что любой микроконтроллер состоит из:
Ядра микроконтроллера (в нашем случае ARM Cortex-M3), выполняющего программные команды;
Flash памяти для хранения кода выполняемой программы;
RAM памяти, для хранения переменных данных;
Портов ввода/вывода, для [общения с внешним миромk;
Периферийных модулей, выполняющих программные и/или аппаратные действия;
Контроллера вложенных векторизованных прерываний, позволяющего по определенному событию прервать выполнение основной программы и перейти к выполнению другой подпрограммы;
Шины данных, соединяет всё вышеперечисленное в единое целое устройство.
Немного разобравшись со структурой микроконтроллеров серии 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 МК грузится из внутренней флеш памяти (запускается написанная нами программа). В случае если на BOOT1, во время перезагрузки/включения, окажется высокий уровень, тогда анализируется вход BOOT1, чтобы определить вариант дальнейшей загрузки, т.е. грузитьсяPмикроконтроллеру из внутреннего бутлоадера или из оперативной памяти.
К выводам 3 Pмикроконтроллера (OSC32_OUT) и 4 (OSC32_IN) подключен кварцевый резонатор Х3, с рабочей частотой 32768Гц. Данный кварцевый резонатор предназначен для тактирования встроенных часов реального времени. Для тактирования самого микроконтроллера установлен кварцевый резонатор Х2, работающий на частоте 8МГц. Этот кварц установлен в специальную панельку и без проблем может быть заменен на другой либо убран.
К выводам 8 и 9 порта С через токоограничительные резисторы подключены зеленый LD3 и синий LD4 светодиоды.
Выводы 46 (TMS/SWDIO) и 49 (TCK/SWCLK) контроллера подсоединены к установленному на этой же плате ST-Link программатору-отладчику и используются для программирования и внутрисхемной отладки микроконтроллера.
Установленный микроконтроллер имеет следующие характеристики:
Расположение выводов микроконтроллера, с кратким описанием некоторых из них приведено в таблице 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/ |
|
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). Учимся говорить с электроникой на одном языке