Урок 1 - GPIO. По рты ввода-вывода.



· Для каждого порта можно выбрать свою скорость тактирования для каждой ножки МК

· Каждый порт может контролировать до 16ти выводов МК

· На смену режима порта уходит около 2х тактов

· На выход данные могут поступать из регистра вывода GPIOx_ODR (или отдельного периферийного блока, запомним на будущее)

· Сигнал, поступивший на вход записывается в аналогичный регистр ввода GPIOx_IDR (или идет на периферийный блок)

· У нас есть специальный механизм блокировки конфигурации порта посредством регистра GPIOx_LCKR. Очень хорошо, такой подход добавляет надежности. Ведь при «случайной» записи не той конфигурации можно легко спалить вывод МК или того хуже: представьте, что наш STM32 управляет устройством, от которого зависит жизнь людей, только представьте, к чему может привести появление «не того» сигнала на выходе МК. А как известно, в процессе написания кода довольно легко допустить ошибку, которую так сразу и не выявить. Под «не тем сигналом» я подразумеваю, например, случайную смену режима «двухтактный выход» на режим «открытый сток» или наоборот. Об этих режимах поговорим чуть ниже.

· У нас есть мультиплексирование выводов. Такой подход позаимствован из FPGA. Использование мультиплексирование позволяет сделать дизайн более гибким и значительно упростить разводку и улучшить частотные свойства, у нас ведь предел 168 MHz. Тем не менее, мультиплексирование — не панацея и учитывать расположение выводов все же придется.

 

Перейдем к режимам работы порта. Смотрим в пункте 8.3 GPIO functional descriptionрежимы:


· Input floating
По-нашему это высокоимпедансный вход, он же плавающий, он же Hi-Z. На выходе МК установлена комплементарная пара полевых транзисторов (один n-канальный и один p-канальный). В закрытом состоянии сопротивление сток-исток стремится к бесконечности, следовательно, ток через вывод МК, можно сказать, не течет. Говорят, что в таком случае выход ведет себя как «плавающий», т.е. отключенный от схемы. КомплиментарнуюКомплементарную пару можно увидеть на Figure 25. Более подробно об этом типе входа можно почитать на Википедии

· Input pull-up
Это вход с подтяжкой к питанию, т.е. между входом и питанием включен подтягивающий резистор(номинала порядка килоом). Подтягивающий резистор позволяет выходу находиться либо в высоком (подтянут к питанию), либо в низком (подтянут к земле) состоянии, когда к выходу не приложено внешнее напряжение. Это позволяет избежать спонтанных появлений 0 и 1 на входе. Подробнее о подтяжке можно.

· Input-pull-down
По аналогии с предыдущим, этот вход — с подтяжкой к земле. Если открыть стр. 110 Даташита на STM32F407, а конкретно таблицу Table 47. I/O s tatic characteristics, можно увидеть, что значение подтягивающих резисторов обычно равно 40 кОм (кроме выводов PA10 и PB12 — для них 11 кОм).

· Analog
Вывод может быть сконфигурирован как аналоговый вход или выход. Это касается отдельных периферийных блоков (АЦП, ЦАП), так что пока просто запомним, что такой режим есть.

· Output open-drain with pull-up or pull-down capability
По-нашему звучит как «выход с открытым коллектором», но я с этим определением не согласен, транзисторы-то полевые. Так что назовем его "выход с открытым стоком". Ну и конечно МК позволяет подключить к выводу подтяжку. Почитать можно тут(только не забывайте про тип транзистора). Ну и управляем при этом мы только n-канальным транзистором, опять-таки, это можно увидеть на Figure 25.

· Output push-pull with pull-up or pull-down capability
Push-pull означает «двухтактный выход». Пожалуй, самый часто используемый тип выхода: подали 0 — выход подключился к земле, 1 — подключился к питанию. Вот тутрассказывается об этом режиме выхода и дается сравнение с другими режимами.

· Alternate function push-pull with pull-up or pull-down capability
Уже описанный ранее двухтактный выход, только для альтернативной функции. Пока не затрагиваем.

· Alternate function open-drain with pull-up or pull-down capability
И соответственно выход с открытым стоком, так же для альтернативной функции, так же пока не трогаем. Важно пока просто запомнить, что нечто подобное есть.

 

Представлено изображение (из Справочного руководства), иллюстрирующее как устроен GPIO в STM32F407:

 

 

Регистры GPIO

В соответствии с пунктом 8.1 GPIO introduction у нас есть 10 регистров для каждого порта. Разобьём их на типы:

Регистры конфигурации
Эти регистры позволяют задавать режим работы каждой ножки отдельно. Всего их 4 для каждого порта:

 

1. GPIOx_MODER. Этот регистр задает направление ввода-вывода каждой ножки. Направление может быть: вход, выход, альтернативная ф-я, аналоговый. По умолчанию (после сброса) направление всех ножек устанавливается на вход, кроме портов A и B (начальное состояние можно посмотреть в пункте 8.4.1. СР)

2. GPIOx_OTYPER. Этот регистр задает тип выхода: двухтактный или открытый сток. По умолчанию — двухтактный для каждой ножки

3. GPIOx_OSPEEDR. С помощью этого регистра задается частота тактирования каждого вывода. СР описывает частоты как: низкая, средняя, повышенная, высокая. После сброса скорость низкая (кроме В.3, тут высокая). Где же сами частоты? Их нужно смотреть в даташите, об этом ниже.

4. GPIOx_PUPDR. Этот регистр управляет подтяжкой каждой ножки. Нам предлагают на выбор: без подтяжки, подтяжка к питанию, подтяжка к земле. По умолчанию подтяжки нет (кроме портов А и В, их состояние уточняйте в пункте 8.4.4 СР)

Регистры данных

Тут все намного проще: два регистра, один на вывод, другой на ввод. Давайте рассмотрим их поподробнее:

5. GPIOx_IDR. Регистр ввода. Если вывод МК настроен на вход, то любой, поданный на ножку сигнал пройдет через триггер Шмитта и отразится в этом регистре в виде соответствующего 0 или 1.

6. GPIOx_ODR. Регистр вывода. То же самое, только задом-на-перед: то, что мы запишем в этот регистр (0 или 1) попадет на ножку МК в виде логического уровня цифрового сигнала.

Регистр установки/сброса
GPIOx_BSRR.

При помощи этого регистра осуществляется запись 0 или 1 в регистр вывода GPIOx_ODR. Вы спросите, зачем же нам нужен этот дополнительный регистр, если можно прочитать регистр вывода, установить и сбросить в нем нужные нам биты и снова записать результат регистр? Тут дело в атомарности операций. Без использования регистра установки/сброса такой подход занимает сразу несколько операций(тактов): сначала необходимо записать данные из регистра вывода в один из общих регистров, затем применить к данным в общем регистре логические операции (для переключения бита/битов используют XOR, для установки в 0 используют NOT затем AND, для установки в 1 используют OR), и наконец снова записать полученное значение из общего регистра обратно в регистр вывода. Как видим одна такая операция на самом деле состоит из 3-4 подопераций и не является единичной(атомарной). Такова особенность большинства архитектур. Неатомарность операций плоха тем, что если в момент выполнения одной из подопераций возникнет запрос прерывания, то МК переключится на выполнение кода прерывания и только после этого вернется к нашей подоперации. Следовательно, если в коде обработчика прерывания используется GPIO — можно получить на выводе МК не, то состояние. Есть много подходов к решению этой проблемы, словом некоторые(маскируемые) прерывания можно запретить на время выполнения операции, можно контролировать атомарность программно. Но STM предоставляет готовое решение — регистр установки/сброса, обращения через который атомарны и выполняются быстрее. О прерываниях мы поговорим в следующих уроках, а пока можно заглянуть сюда и вот сюда. При работе с МК знание булевой алгебры на начальном уровне обязательно, этой статьи нам будет вполне достаточно(только не забывайте, что она из цикла по MSP430, а мы изучаем STM32).

Регистр блокировки
GPIOx_LCKR. Этот регистр осуществляет управление механизмом блокировки конфигурации, о котором я уже говорил в начале статьи. Что бы не забивать голову с самого начала, останавливаться на этом регистре, впрочем как и на самом механизме, мы не будем. При желании можно заглянуть в пункт 8.3.6 GPIO locking mechanism СР. Упомяну лишь, что даже в заблокированном состоянии доступна работа с регистром установки/сброса(GPIOx_BSRR) и регистром вывода(GPIOx_ODR).

Регистры альтернативных функций
GPIOx_AFRL и GPIOx_AFRH.

 

 

                                STM32CubeMX

STM32CubeMX

- программная платформа с графическим интерфейсом, которая максимально упрощает построение программных проектов для микроконтроллеров STM32. STM32CubeMX позволяет работать не только с семейством STM32F7, но и со всеми существующими семействами микроконтроллеров STM32 (рисунок 12).

Рис. 12. Структура программной платформы STM32Cube

STM32CubeMX позволяет выполнять следующие операции (рисунок 13):

Рис. 13. Возможности STM32CubeMX

§ выбирать оптимальный микроконтроллер или отладочную плату с учетом особенностей конкретного приложения. Фильтрация производится по различным полям, таким как серия, корпус, объем памяти и так далее;

§ конфигурировать выводы микроконтроллера с помощью утилиты Pin Wizard;

§ настраивать частоты глобальных тактовых сигналов и тактовых сигналов периферийных устройств с помощью утилиты Clock Wizard;

§ настраивать параметры ПО промежуточного уровня, такие как файловая система, стеки протоколов, операционные системы и прочее, а также периферийные блоки с помощью утилиты Perepherial and middleware Wizard;

§ оценивать уровень потребления и срока службы аккумулятора при заданных настройках микроконтроллера с помощью утилиты Power consumption Wizard;

§ Создавать и редактировать проекты для микроконтроллеров STM32 с последующей генерацией С-кода для конкретных IDE (IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32)). При этом для генерации С-кода могут использоваться различные библиотеки нижнего уровня от ST: HAL или LL.

STM32CubeMX доступен для бесплатного скачивания на сайте www.st.com. После установки программы пользователь должен скачать библиотеки для требуемого семейства STM32, в нашем случае речь идет о программном пакете FW.F7.x.x.x. Скачивание можно производить непосредственно из STM32CubeMX. Для этого на заглавной странице, появляющейся сразу после запуска, нужно перейти на вкладку INSTALL/REMOVE (рисунок 120). Очень часто на сайте компании появляются обновления как самой программы STM32CubeMX, так и отдельных библиотек. Пользователям рекомендуется периодически проверять обновления (есть функция автообновления). Для этого необходимо заходить на вкладку CHECK FOR UPDATES (рисунок 14).

Рис. 14. Обновление STM32CubeMX и программных библиотек

Рассмотрим процесс создания проекта в STM32CubeMX, который представляет собой последовательность из нескольких шагов.

Для создания нового проекта пользователь должен выбрать подходящий микроконтроллер или отладочную плату. В этом ему помогут утилиты MCU Selector или Board Selector (рисунок 15).

Рис. 15. Создание проекта начинается с выбора микроконтроллера или отладочной платы

Если пользователь начинает проект с нуля без отладочной платы, то STM32CubeMX предложит выбрать контроллер по заданным параметрам с помощью фильтров. Основными фильтрами являются: процессорное ядро, семейство, линейка, корпус, периферия, встроенный графический контроллер и другие (рисунок 16).

Рис. 16. Выбор контроллера производится с помощью фильтров

После выбора подходящего контроллера разработчику предлагается определить назначение выводов с помощью утилиты Pin Wizard (рисунок 123). При этом выводы могут настраиваться индивидуально с помощью удобной диаграммы либо с помощью окна периферии. В последнем случае пользователь выбирает активные периферийные блоки, а программа автоматически подсвечивает занимаемые выводы. При этом стоит отметить удобную систему подсветки:

§ выводы питания окрашены желтым цветом;

§ неиспользуемые выводы окрашены серым цветом;

§ используемые выводы окрашены зеленым цветом;

§ используемые выводы окрашиваются оранжевым, если работа выбранного периферийного блока не разрешена.

Аналогичным образом подсвечиваются названия периферийных блоков в окне периферии. Настройка периферии выполняется в специальном окне, как показано на рисунке 17.

Рис. 17. Работа с утилитой Pin Wizard

Кроме периферийных блоков, пользователь может выбрать и настроить дополнительные библиотеки, в частности – файловую систему FATFS, операционную систему FreeRTOS и другие (рисунок 18).

Рис. 18. Настройка промежуточного ПО

Настройка системы тактирования производится с помощью вкладки Clock Configuration (утилита Clock Wizard), при этом пользователь работает с визуализированным деревом тактирования (рисунок 19). Clock Wizard позволяет за несколько кликов мыши выбрать источник системного тактового сигнала, значения делителей и умножителей, а также источники тактирования периферийных блоков. При этом если какой-либо тактовый сигнал выходит за границы допустимых значений, программа сразу же сообщает об ошибке.

Рис. 19. Работа с деревом тактирования в Clock Wizard

После того как все выводы и периферия настроены, а также сконфигурировано дерево тактирования, можно переходить к генерации кода. Это выполняется на вкладке Project Manager (рисунок 20). Здесь пользователь может настроить параметры проекта (название и путь), а также определить тип создаваемого проекта, который определяется выбором целевой IDE. В настоящий момент STM32CubeMX поддерживает следующие IDE:

Рис. 20. Настройка проекта и кодогенератора

§ EWARM (версии 7 и 8);

§ MDK-ARM (версии 4 и 5);

§ TrueStudio;

§ SW4STM32;

§ кроме того, кодогенератор может создавать makefile.

Далее на вкладке Code Generator следует определиться с составом копируемых в директорию проекта библиотек, настройками обработки пользовательского кода при регенерации (например, сохранять или удалять), настройками использования HAL. Стоит отметить важную особенность: если при настройке выводов в разделе HAL Settings поставить галочку напротив пункта «set all free pins as analog», и если при этом в Pin Wizard интерфейсы SWD/JTAG не были определены, то дальнейшая отладка микроконтроллеров с помощью этих интерфейсов будет невозможна.

Для более детальной настройки кодогенератора следует перейти на вкладку Advanced Settings. Главной особенностью С-генератора в STM32CubeMX является возможность использования как HAL, так и LL-драйверов. В рамках одного и того же проекта на STM32CubeMX можно одновременно использовать как HAL, так и LL, но для разных периферийных блоков. Подробнее об этих драйверах рассказывается в следующем разделе.

После нажатия на кнопку «GENERATE CODE» STM32CubeMX создает С-проект для выбранной IDE. Проект уже содержит весь код необходимый для конфигурации тактирования, выводов и периферии, выбранной пользователем. Чтобы в дальнейшем без проблем повторно генерировать код конфигурации без стирания пользовательского кода, разработчик должен помещать свой код в специальные секции (User code).

Еще одной полезной утилитой в составе STM32CubeMX является Power Consumption Calculator (рисунок 21). Этот калькулятор позволяет не просто рассчитать потребление микроконтроллера в различных режимах, но и определить срок службы различных элементов питания.

Рис. 21. Окно расчета потребления микроконтроллера

В STM32Cube примеры классифицированы в соответствии с уровнем ПО:

§ Examples – группа примеров, в которых используются только драйверы HAL и BSP, а ПО промежуточного уровня не используется. Целью этих примеров является демонстрация работы того или иного периферийного блока. Некоторые примеры достаточно просты и касаются только одного периферийного блока, другие могут демонстрировать совместную работу нескольких блоков, например, АЦП и DMA.

§ Examples_LL – группа примеров, в которых используются только драйверы LL, а HAL и ПО промежуточного уровня не используется. Эти примеры являются наименее ресурсоемкими и максимально простыми. Как правило, в них используется только один периферийный блок. Стоит отметить, что эти примеры предназначены исключительно для работы с платами Nucleo.

§ Examples_MIX – группа примеров, в которых используются драйверы HAL, LL и BSP, а ПО промежуточного уровня не используется. Главной задачей этих примеров становится демонстрация оптимального совместного использования HAL и LL, с учетом их достоинств. Примеры предназначены исключительно для работы с платами Nucleo.

§ Applications – группа примеров, предназначенных для демонстрации особенностей работы с ПО промежуточного уровня.

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

§ Template project – шаблоны проектов для IDE, предназначенные для быстрого создания проектов на базе отладочных плат.

                                    

                            STM32

 

                         Экосистема микроконтроллеров STM32


Дата добавления: 2020-01-07; просмотров: 215; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!