Stm32

Содержание

Библиотека ST ZigBee Pro

Компания STMicroelectronics предоставляет своим клиентам библиотеку ST ZigBee Pro, которая совместно с библиотекой для стандартной периферии позволяет реализовывать надежные и экономичные сети на базе микроконтроллеров STM32W108. Примеры использования библиотеки ST ZigBee Pro показаны на рис. 2.

Рис. 2. Использование библиотеки ST ZigBee Pro

В зависимости от сложности приложения используются соответствующие модули библиотеки. Стек ZigBee PRO занимает на 20% меньше места, чем предыдущее поколение программных продуктов.

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

Обзор продуктовых линеек

STM32L

Семейство STM32 имеет широкий ассортимент изделий, различающихся по объему памяти, производительности, потреблению энергии и другим характеристикам.

Серии STM32F-1, STM32F-2 и STM32L полностью совместимы. Каждая из серий имеет десятки микросхем, которые можно без труда поменять на другие изделия. STM32F-1 была первой линейкой, ее производительность была ограничена. Из-за этого по характеристикам контроллеры быстро догнали изделия семейства Stellaris и LPC17. Позднее была выпущена STM32F-2 с улучшенными характеристиками – тактовая частота достигала 120 МГц. Отличается высокой процессорной мощностью, которая достигнута благодаря новой технологии производства 90 нм. Линейка STM32L представлена моделями, которые изготовлены по специальному технологическому процессу. Утечки транзисторов минимальны, благодаря чему приборы показывают лучшие значения.

Важно отметить, что контроллеры линейки STM32W не имеют pin-to-pin совместимости с STM32F-1, STM32F-2 и STM32L. Причина заключается в том, что линейку разрабатывала компания, которая предоставила радиочастотную часть

Это наложило ограничения на разработку для компании ST.

STM32F100R4

Микросхема STM32F100R4 имеет минимальный набор функций. Объем флэш памяти составляет 16 Кбайт, ОЗУ – 4 Кбайт, тактовая частота составляет 12 МГц. Если требуется более быстрое устройство с увеличенным объемом флэш-памяти до 128 Кбайт, подойдет STM32F101RB. USB интерфейс имеется у изделия STM32F103RE. Существует аналогичное устройство, но с более низким потреблением – это STM32L151RB.

Использование STM32H7 в разработке

В семейство STM32H7 входит множество контроллеров, часть из них с одним ядром Cortex-M7, а некоторые с двумя ядрами Cortex-M7 и Cortex M4. В модификациях контроллера присутствует различное  количество и комбинация стандартных периферийных устройств, таких как GPIO, I2C, I2S, SPI, таймеры, USARTS.

В серии представлены и некоторые более продвинутые периферийные устройства, которые обычно отсутствуют в менее производительных микроконтроллерах. К ним относятся USB OTG, контроллеры Ethernet и CAN, последовательные аудиоинтерфейсы (SAI), интерфейс камеры, интерфейсы TFT дисплея и аппаратные графические ускорители. Семейство также поддерживает механизмы аппаратного криптографического шифрования и функции для обеспечения безопасной загрузки и обновления кода прошивки.

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

Один из лучших способов узнать о любом семействе процессоров — это потратить некоторое время на работу с отладочной платой, решая типичные задачи, возникающие в процессе разработки. Для этого ST Microelectronics выпускает множество различных оценочных плат и программных продуктов. Практика работы с ними поможет вам быстро разработать собственное устройство.

Для оценки всей функциональности серии STM32H7 рекомендуются платы STM32H7x3I-EVAL. Эти платы позволяют оценить возможности продвинутых периферийных устройств семейства STM32H7.

Рис. 3. Оценочная плата STM32H7531

Платы среднего уровня на основе микроконтроллера STM32H7 представлены семейством Discovery. Они имеют несколько менее богатую периферию.

Наиболее бюджетные платы из серии Nucleo (рис. 4). Как правило, эти платы содержат только микроконтроллер с необходимой обвязкой. Периферия представлена разъемами Ethernet и USB. Но, поскольку все контакты микроконтроллера доступны на разъемах по краям платы, есть хорошая возможность сопряжения MCU с внешним оборудованием.

Рис. 4. Плата Nucleo для одного из микроконтроллеров STM32H7

Программирование плат осуществляется через встроенный программатор STLink-V3

Обратите внимание, что STLink-V3 встречается только на платах с новейшими микроконтроллерами STM32, такими как семейство STM32H7. Старые оценочные платы STM32 содержат STLINK-V2, который среди прочего обеспечивает существенно более низкую скорость загрузки около 12 Мбит/с по сравнению с STLINK-V3 (480 Мбит/с)

Регистры CR и CFGR

Открываем Reference manual на микроконтроллер STM32F103x8 и переходим к разделу 7: Low-, medium-, high- and XL-density reset and clock control (RCC). RCC имеет довольно много регистров, целых 10 штук. Однако, для настройки источника тактирования и делителей шин нам понадобится только 2 из них.

Clock control register (RCC_CR)

Рис. 1. Биты регистра CR

Описание основных битов регистра:

PLLRDY — флаг готовности PLL. Устанавливается аппаратно и сигнализирует о том, что PLL заблокирован.

PLLON — Включить PLL. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно. Этот бит не может быть сброшен, если PLL используется как источник системного тактирования.

CSSON — включить систему CSS

HSEBYP — Если вместо кварцевого резонатора HSE мы хотим использовать внешний прямоугольный тактовый сигнал, то этот бит нужно установить в 1

HSERDY — Флаг готовности генератора HSE. Аппаратно устанавливается в 1 после успешного запуска и стабилизации частоты HSE-генератора

HSEON — Запустить HSE генератор. Устанавливается и сбрасывается программно. При переходе в режим Stop или Standby сбрасывается аппаратно и HSE генератор останавливается.  Этот бит не может быть сброшен, если HSE используется как источник системного тактирования.

HSIRDY — то же самое, что и HSERDY, только для встроенного RC-генератора HSI

HSION — то же самое, что и HSEON, только для встроенного RC-генератора HSI

Clock configuration register (RCC_CFGR)

Рис. 2. Биты регистра CFGR

Описание основных битов регистра:

MCO — подача тактового сигнала на MCO-пин микроконтроллера.

  • 0xx: Функция отключена
  • 100: Выбран System clock (SYSCLK)
  • 101: Выбран сигнал с HSI
  • 110: Выбран сигнал с HSE
  • 111: Выбран сигнал с PLL, который поделен на 2

PLLMUL — коэффициент умножения PLL. Эти биты могут быть записаны программно только при отключенном PLL

  • 0000: Входную частота PLL умножить на 2
  • 0001: —//— на 3
  • 0010: —//— на 4
  • 0011: —//— на 5
  • 0100: —//— на 6
  • 0101: —//— на 7
  • 0110: —//— на 8
  • 0111: —//— на 9
  • 1000: —//— на 10
  • 1001: —//— на 11
  • 1010: —//— на 12
  • 1011: —//— на 13
  • 1100: —//— на 14
  • 1101: —//— на 15
  • 1110: —//— на 16
  • 1111: —//— на 16

Два последних значения соответствуют одинаковому коэффициенту умножения.

PLLXTPRE — Делитель частоты с HSE генератора перед подачей на PLL. Этот бит не может быть изменен, если PLL запущен. При установке в 1 частота HSE будет поделена на 2, если 0, то делитель отключен.

PLLSRC — Источник входной частоты PLL. Не может быть изменен, если PLL запущен.

  • 0: частота HSI генератора поделенная на 2
  • 1: частота HSE генератора. Делитель может быть выбран PLLXTPRE битом.

PPRE2 — Делитель шины APB2 prescaler

  • 0xx: HCLK без деления
  • 100: HCLK / 2
  • 101: HCLK / 4
  • 110: HCLK / 8
  • 111: HCLK / 16

PPRE1 — Делитель шины APB1 prescaler. Частота шины APB1 не должна превышать 36 МГц.

  • 0xx: HCLK без деления
  • 100: HCLK / 2
  • 101: HCLK / 4
  • 110: HCLK / 8
  • 111: HCLK / 16

HPRE — AHB prescaler

  • 0xxx: SYSCLK без деления
  • 1000: SYSCLK / 2
  • 1001: SYSCLK / 4
  • 1010: SYSCLK / 8
  • 1011: SYSCLK / 16
  • 1100: SYSCLK / 64
  • 1101: SYSCLK / 128
  • 1110: SYSCLK / 256
  • 1111: SYSCLK / 512

SWS — Состояние переключателя тактирования системы. Устанавливается аппаратно и указывает на текущий источник тактирования.

  • 00: HSI генератор используется как источник тактирования системы
  • 01: HSE генератор используется как источник тактирования системы
  • 10: PLL используется как источник тактирования системы

SW — Переключатель источника тактирования системы. Изменяется программно для выбора источника SYSCLK. Устанавливается аппаратно для принудительного переключения на HSI генератор переходе в режим Stop или Standby или в случае срыва генерации HSE, который используется в качестве источника SYSCLK (только если активна система CSS)

  • 00: HSI выбран в качестве источника системного тактирования
  • 01: HSE выбран в качестве источника системного тактирования
  • 10: PLL выбран в качестве источника системного тактирования

Что еще?

Здесь мы не рассмотрели еще некоторые блоки системы тактирования, о которых хочется упомянуть.

Clock security system (CSS) — переводится примерно как «система безопасности тактирования». Если, при использовании генератора HSE в качестве источника тактового сигнала для SYSCLK или PLL, произойдет срыв генерации HSE, то CSS автоматически переключит всю систему на работу от встроенного RC-генератора HSI. Таким образом, если что-то случится с кварцем, система не зависнет намертво в неопределенном состоянии, а сможет выполнить какие-то действия, например, перевести объект управления в безопасное состояние (закрыть все вентили, отключить силовые установки, и т.д.)

Модуль часов реального времени RTC может тактироваться от встроенного LSI генератора на 40 КГц, от HSE через делитель на 128, либо от LSE с внешним кварцем на 32768 Гц. Источник тактовых импульсов выбирается с помощью RTCSEL.

Модуль USB получает тактовый сигнал от PLL, причем при частоте на выходе PLL равной 72 МГц есть возможность активировать USB Prescaler с коэффициентом деления 1.5 для получения необходимой частоты 48 МГц.

Microcontroller clock output (MCO) — вывод микроконтроллера, на который можно вывести частоту от одного из источников сигнала: SYSCLK, HSE, HSI либо сигнал с выхода PLL, поделенный пополам. Нужный источник выбирается с помощью битов MCO.

Некоторые настройки IDE и параметры компилятора

Repository

View -> Repository

Здесь мы выбираем библиотеки, которые необходимы для нашего проекта. При этом IDE копирует в папку stm_lib вашего проекта нужные файлы.

Закладка Compile

в этой закладке устанавливаются ключи компилятора

Мы сюда еще будем возвращаться, а пока обратим внимание на поле Optimization. Это поле задает параметр оптимизации для компилятора

Об оптимизации будет отдельный разговор, пока Вам нужно усвоить, что оптимизация Optimizate Size (-Os) максимально уменьшает объем скомпилированных программ. Но при этом компилятор может выбросить (оптимизировать) некоторые операции, и программа может работать не так, как Вам бы хотелось. Поэтому, на первых этапах, я не рекомендую использовать этот метод оптимизации. Установите Optimizate (-O1).

Закладка Link

В этой закладке пока нас интересует только поле Library и Linked Libraries. Если Вы будете использовать стандартные библиотеки С, например библиотеку математических функций math Вам нужно будет выбрать «Use base C Library». Если этого не сделать, то компилятор выдаст ошибку.

Здесь указываются куда складывать скомпилированные файлы и в каких форматах.

Пока в ней мы ничего делать не будем.

Закладка Debugger

В этой закладке устанавливаются параметры дебаггера. Поскольку мы будем использовать ST-Link, здесь ничего менять не придется.

1.6. Работа с аналоговыми сигналами

На борту содержится три АЦП и два одноканальных ЦАП.

АЦП имеет хорошую разрешающую способность 12 бит и очень высокую скорость преобразования, составляющую 2,4 МСемпла в одиночном режиме и 7,2 МСемпла – в тройном режиме. Максимально доступное число аналоговых каналов – 24. Как и в большинстве современных МК, присутствует генератор опорного напряжения. Гибкая система настроек встроенного аналогового мультиплексора позволяет задавать любые последовательности преобразования аналоговых каналов (за исключением одновременного преобразования одного канала на нескольких АЦП). Настройки АЦП позволяют производить однократные и циклические измерения. Для проведения преобразования на максимальных скоростях необходимо соблюдать диапазон напряжения питания 2,4…3,6 В. При снижении напряжения до 1,8 (1,7) В скорость преобразования снижается до 1,2 мегасемплов. Для контроля внутренней температуры микроконтроллера встроен температурный датчик. На его выходе формируется напряжение в зависимости от окружающей температуры. Выход датчика через мультиплексор подключается к АЦП. Используя температурный датчик, можно измерять температуру от -40 до 125°C с точностью ±1,5°C.

ЦАП обладает разрешающей способностью 12 бит, преобразование возможно в 8/12-битовом формате с выравниванием этого результата по левому или правому краям. Так как ЦАП содержит два канала, то есть возможность формирования стереосигнала. Доступна функция автоматической генерации шумового сигнала с меняющейся амплитудой или треугольного сигнала.

Разработка приложений для STM32H7

Семейство STM32H7 представляет собой сложный одноядерный или двухъядерный высокопроизводительный микроконтроллер с усовершенствованной периферией. Разработка приложений с нуля, как это часто делается с небольшими микроконтроллерами, в большинстве случаев приведет к большим затратам времени. К счастью, богатый выбор готовых библиотек и примеров кода позволяет избежать этого.

Для разработки можно использовать IDE и компиляторы, которые выпускают различные производители, например, Atollic, Keil или IAR Systems. Можно использовать и бесплатные программы, например, Eclipse IDE, к которой можно подключить множество дополнительных компиляторов, таких как GCC, GNU Compiler Collection, tool chain для STM32.

Как упоминалось ранее, производители, такие как ST Microelectronics, лицензируют ядра Cortex от ARM Holdings, а затем интегрируют собственный набор периферийных устройств, таких как UART, CAN, I2C, Ethernet или SPI, в конкретные микроконтроллеры. При разработке встраиваемых приложений часть кода управляет ядром системы, а часть — периферийными устройствами, такими как таймеры или порты ввода-вывода. Конфигурирование ядра или любых периферийных устройств включает запись определенных значений конфигурации во внутренние регистры контроллера. Для этого требуется полностью разобраться в технической документации, описывающей регистры контроллера и их связь с периферией. Обойти это просто невозможно. Например, ядро ARM может иметь много источников тактирования с различными делителями (ведь различные блоки, такие как память и периферийная шина, могут работать на разных тактовых частотах). Или, например, таймеры. Они могут работать во многих режимах — захват входа, сравнение выходов, широтно-импульсная модуляция (ШИМ), с прерыванием или без него, или с автоматической перезагрузкой и тактироваться от различных источников. То же самое относится к USART, SPI, I2C, USB и другим периферийным устройствам. Каждое из них управляется отдельным разделом таблицы регистров.

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

К счастью, и ARM, и ST Microelectronics сделали жизнь проще, разработав слои аппаратной абстракции или HAL. HAL — это библиотека, входящая во встроенное программное обеспечение, которая позволяет абстрагироваться от управляемого ею аппаратного обеспечения и предоставляет унифицированный способ доступа к этому аппаратному обеспечению для разработки прошивки.

Например, регистрам, которые используются для настройки конкретного аппаратного блока, присваиваются соответствующие имена. Существуют предварительно определенные функции, которые можно использовать для настройки портов ввода-вывода, источников синхронизации или таймеров. HAL для ядра ARM Cortex называется CMSIS (Cortex Microcontroller Software Interface Standard), и он не зависит от производителя микроконтроллера. Периферийные устройства STM описываются в библиотеке STM HAL.

Но, как бы ни был хорош HAL, пользователю все равно нужно вызывать множество соответствующих функций для настройки оборудования. Для облегчения этой задачи ST предоставила инструмент, который называется STMCubeMx. Этот инструмент позволяет пользователю настраивать регистры микроконтроллера через графический интерфейс без написания большого количества кода. Код конфигурации автоматически генерируется программой, и пользователю остается вставить полученный код в свое приложение.

Описание работы USB

  • USB устройства подключаются к Хосту (чаще всего, это — компьютер). Хост — главный, он всем управляет.
  • USB устройство не может быть инициатором передачи данных. То есть, оно сидит и молчит, пока его не спросят. Спросили или прислали данные, — оно ответило или приняло данные и замолчало.
  • USB устройство имеет уникальный идентификатор. Каждое USB устройство может иметь несколько конечных точек, каждая из которых имеет уникальный адрес. Именно через конечные точки передаются данные или команды.
  • USB устройство имеет Дескриптор. Это массив данных, в котором содержится описание устройства. Благодаря дескриптору, операционная система получает информацию о USB устройстве и использует для общения с ним соответствующий драйвер.
  • Хост идентифицирует USB-устройство по ID вендора и ID продукта (Vendor ID — VID и Product ID — PID)

http://microtechnics.ru/osnovy-interfejsa-usb/http://webhamster.ru/mytetrashare/index/mtb0/1410507212bb4zf8gacjhttp://radiokot.ru/circuit/digital/pcmod/63/http://microtechnics.ru/mikrokontroller-stm32-i-usb/http://microtechnics.ru/stm32-peredacha-dannyx-po-usb/

Что такое STM32

STM32 – это платформа, в основе которой лежат микроконтроллеры STMicroelectronics на базе ARM процессора, различные модули и периферия, а также программные решения (IDE) для работы с железом. Решения на базе stm активно используются благодаря производительности микроконтроллера, его удачной архитектуре, малом энергопотреблении, небольшой цене. В настоящее время STM32 состоит уже из нескольких линеек для самых разных предназначений.

История появления

Серия STM32 была выпущена в 2010 году. До этого компанией STMicroelectronics уже выпускались 4 семейства микроконтроллеров на базе ARM, но они были хуже по своим характеристикам. Контроллеры STM32 получились оптимальными по свойствам и цене. Изначально они выпускались в 14 вариантах, которые были разделены на 2 группы – с тактовой частотой до 2 МГц и с частотой до 36 МГц. Программное обеспечение у обеих групп одинаковое, как и расположение контактов. Первые изделия выпускались со встроенной флеш-памятью 128 кбайт и ОЗУ 20 кбайт. Сейчас линейка существенно расширилась, появились новые представители с повышенными значениями ОЗУ и Flash памяти.

Достоинства и недостатки STM32

Основные преимущества:

  • Низкая стоимость;
  • Удобство использования;
  • Большой выбор сред разработки;
  • Чипы взаимозаменяемы – если не хватает ресурсов одного микроконтроллера, его можно заменить на более мощной, не меняя самой схемы и платы;
  • Высокая производительность;
  • Удобная отладка микроконтроллера.

Недостатки:

  • Высокий порог вхождения;
  • На данный момент не так много литературы по STM32;
  • Большинство созданных библиотек уже устарели, проще создавать свои собственные.

Минусы STM32 не дают пока микроконтроллеру стать заменой Ардуино.

Плюсы и минусы микроконтроллеров Arduino и STM32

Начнём с достоинств преждевременного фаворита – самого ардуино. И главное из них известно всем, кто работал с данным чипом и его собратьями – собственная экосистема. Вы можете найти ответы на все возникающие вопросы в интернете, ведь база знаний и количество пользователей микроконтроллера даже в СНГ сегменте поражает. А это значит, что не придётся искать инструкции на английском, чего не скажешь об stm32f103c8t6 arduino. Большое количество пользователей подразумевает и широкий программный функционал, лишь крупинка которого предоставляется самими производителями.

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

Отсюда выплывают доступные шилды, простота использования, чем не могут похвастаться микроконтроллеры stm, и простое программирование под Atmel, без необходимости учить все тонкости языка на практике. Ну а более продвинутые оценят EEPROM, идущий с коробки, чем микроконтроллер stm32 не может похвастаться.

Однако, как и везде, есть свои недостатки:

  1. Низкий порог вхождения предполагает большое количество кривых и неотлаженных библиотек, работающих чуть ли не на последнем издыхании. Наткнувшись пару раз на такой софт и занимаясь его дебагингом в течение пары дней, вы решите, что проще написать собственный.
  2. Следующее преимущество stm32 ардуино не предоставляет нормальной отладки, из-за чего поиск ошибок в тех же кривых библиотеках и занимает так много времени.
  3. Нормальная производительность на Атмега – миф, и на деле вам потребуется изворачиваться и отказываться от многих функций продукта, чтобы он работал без подлагиваний. Нормальных планировщиков тоже не найти, а те, что можно подсоединить, съедают слишком много ресурсов. Из-за чего поделки на ардуино славятся кривым и лагающим интерфейсом с долгим временем отклика, если речь идёт о чём-то сложнее, чем электронная щеколда или конструкция из микроконтроллера и датчика движений.
  4. Множество кривой и откровенно бесполезной продукции на этих платах, в особенности от китайцев, лишь ухудшает имидж Ардуино.
  5. Нормальных книг по микроконтроллерам stm32, конечно, не найти, но и ардуино не предоставляет много профессиональной информации, помимо форумов, где отладкой занимаются сами пользователи.
  6. А сама среда разработки софта под неё требует просто невероятной производительности, не сравнимой ни с чем, что есть на рынке. Притом, куда идут все съедаемые ресурсы, не совсем понятно. А соответственно, виной всему – ужасающая оптимизация.

С другой стороны, перед пользователем встаёт arduino stm32f103 и arduino stm8 высокопроизводительный контроллер, упрощающий переход с микроконтроллера stm32 на микроконтроллер миландр и множеством периферии в дополнение.

Вы можете скачать файлы поддержки stm32 плат на Arduino IDE 1.8.x по этой ссылке.

Проектировка плат значительно облегчается благодаря свободному ходу ног, стоковая среда разработки – достаточно мощный инструмент, а отладка изначально построена так, чтобы работать без нареканий даже в чужих средах. Вам предоставляют красочные графики и точки, не говоря уже о текстовой информации. Простой перенос кода, возможность запускать отдельные контроллеры в 41 Мбитной развёртке и наличие USB портов практически везде. Всё это может запросто завлечь более продвинутых разработчиков, но им стоит ознакомиться и с рядом недостатков:

  1. Высокий порог входа, для нормального пользования необходим хороший базис.
  2. Библиотеки также присутствуют, но большинство из них устарели или же сделаны каждым лично для себя. Проще уже создать собственную. Но если вспомнить о проблемах Ардуино, то вполне вероятно, что вы уже умеете это делать.
  3. Нижние пробелы и, в целом, некрасивая семантика в сравнении с простыми функциями конкурента.
  4. С99 это всё же далеко не С++, и вы сразу прочувствуете все сложности перехода. Однако многие утверждают, что спустя время – наоборот, рады такому нюансу.
  5. В целом, дешевизна плат в сравнении с Ардуино.

Распиновка MINI-M4 для STM32

Настройка порта GPIO

Итак, с регистрами разобрались, настало время практики. Все примеры в этой статье для микроконтроллера STM32F103C8. В моем распоряжении есть вот такая отладочная плата:

На ней установлен кварцевый резонатор на 8 МГц и светодиод на порту PB12. Вот с помощью этого светодиода мы и устроим Hello, World!

Задача ясна: настраиваем PB12 на выход в режиме push-pull и с помощью регистра ODR дергаем 12-й пин порта GPIOB туда-сюда! Но мы забыли об одной маленько детали: RCC. Дело в том, что по-умолчанию после сброса микроконтроллера все периферийные модули отключены от источника тактового сигнала, в том числе и GPIO. А подать тактирование можно с помощью регистров RCC. В 3-ей части я про это говорил. Для начала нужно определить, к какой шине у нас подключен GPIOB. Открываем даташит на микроконтроллер, ищем вот эту таблицу:

Рис. 8. Таблица шин и периферийных устройств

GPIOB у нас подключен к шине APB2. Идем в Reference manual, открываем раздел про RCC, переходим к пункту 7.3.7 APB2 peripheral clock enable register (RCC_APB2ENR). С помощью этого регистра можно подать тактовый сигнал на устройства шины APB2:

Рис. 9. Регистр RCC_APB2ENR

В регистре RCC_APB2ENR много флагов для разной периферии, в том числе и для нашего GPIOB, флаг называется IOPBEN. Перед началом инициализации PB12 нам надо установить этот бит в единицу.

Поехали программировать! За основу возьмем проект из 2-й части: https://github.com/DiMoonElec/stm32f103c8_empty_project. Создадим функцию инициализации порта:

void PortInit(void)
{
}

GPIOB

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB

PB12CRH:

GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
//MODE: выход с максимальной частотой 2 МГц
//CNF: режим push-pull
GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
void PortInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB
  
  GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
  //MODE: выход с максимальной частотой 2 МГц
  //CNF: режим push-pull
  GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
}

ODRPB12

void PortSetHi(void)
{
  GPIOB->ODR |= (1<<12);
}
void PortSetLow(void)
{
  GPIOB->ODR &= ~(1<<12);
}

GPIOB->ODR |= (1<<12)STM32

void PortSetHi(void)
{
  GPIOB->BSRR = (1<<12);
}

void PortSetLow(void)
{
  GPIOB->BRR = (1<<12);
}

 (1<<12)0x1000BSRRBRRрис. 5, 6

Ни и простой main() для проверки:

void main()
{
  int i;
  PortInit();
  
  for(;;)
  {
    PortSetHi();
    for(i=0; i<0x40000; i++)
      ;

    PortSetLow();
    for(i=0; i<0x40000; i++)
      ;
  }
}

BP12«Hello, World!»

Давайте теперь настроим какой-нибудь вывод порта, например PB15, на вход с подтяжкой к питанию. При подключении PB15 к минусу, у нас будет зажигаться светодиод. Задача ясна, преступаем к реализации. В PortInit() добавим пару строк:

/// Настраиваем PB15 на вход с подтяжкой к питанию ///
GPIOB->CRH &= ~(GPIO_CRH_MODE15 | GPIO_CRH_CNF15);
//MODE: вход, оставляем в нуле
//CNF: вход с pull-up / pull-down
GPIOB->CRH |= (0x00 << GPIO_CRH_MODE15_Pos) | (0x02 << GPIO_CRH_CNF15_Pos);

GPIOB->ODR |= (1<<15); //Включаем подтяжку вверх

PB12MODE/CNFODRODRCNF=10Input with pull-up / pull-downODRReference manual

Рис. 10. Таблица конфигурации порта

Функция PortInit() приобретает такой вид:

void PortInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование порта GPIOB
  
  /// Настраиваем PB12 на выход ///
  GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12); //для начала все сбрасываем в ноль
  
  //MODE: выход с максимальной частотой 2 МГц
  //CNF: режим push-pull
  GPIOB->CRH |= (0x02 << GPIO_CRH_MODE12_Pos) | (0x00 << GPIO_CRH_CNF12_Pos);
  
  /// Настраиваем PB15 на вход с подтяжкой к питанию ///
  GPIOB->CRH &= ~(GPIO_CRH_MODE15 | GPIO_CRH_CNF15);
  //MODE: вход, оставляем в нуле
  //CNF: вход с pull-up / pull-down
  GPIOB->CRH |= (0x00 << GPIO_CRH_MODE15_Pos) | (0x02 << GPIO_CRH_CNF15_Pos);
  
  GPIOB->ODR |= (1<<15); //Включаем подтяжку вверх
}

PB15IDR

int ReadPort(void)
{
  if(GPIOB->IDR & (1<<15))
    return 1;
  return 0;
}

IDR

В этом случае main() будет выглядеть вот так:

void main()
{
  PortInit();
  
  for(;;)
  {
    if(ReadPort())
      PortSetHi();
    else
      PortSetLow();
  }
}

stm32f103c8PB12PB15PP12PB15PB15ReadPort()PB12

На этом все, продолжение следует! Продолжение.

Стартовый набор ZigBee® STM32W108

Для ускорения разработки и отладки беспроводных приложений на базе микроконтроллера STM32W108 компания STMicroelectronics в январе-феврале 2010 года планирует начать выпуска набора STM32W108 ZigBee Starter Kit.

Стартовый набор представляет собой инструментарий, который можно использовать, чтобы оценить возможности микросхемы STM32W108 для радиочастотного (РЧ) беспроводного обмена данными, основанном на стандарте IEEE 802.15.4-2006 и протоколе ZigBee.

Набор обеспечивает всем необходимым для разработки:

  • Оценочного РЧ-приложения, которое имеет целью выполнить РЧ-тестирование, обмен данными и разрабатывать программное обеспечение ZigBee.
  • РЧ-сетевого приложения, которое имеет целью ознакомить с более сложным ZigBee приложением.