STM32F103C8T6 без SPL, HAL и без IDE: Система тактирования RCC, таймер SysTick, UART передатчик, планировщик задач, SPI и I2C модули в режиме мастера

разделы: STM32, дата: 19 октября 2018г.

Когда пару лет назад я писал вводную статью по STM32, то больше всего мне тогда запомнилось, что прошивки даже с самыми простыми алгоритмами (например Blink) - имеют огромный размер: от одного килобайта и больше. Поэтому целью этой статьи стала попытка написания прошивок для STM32 в стиле 8-битных микроконтроллеров, когда ты полностью контролируешь процесс компиляции, используя лишь: компилятор, флешер и текстовый редактор. Соответственно в статье рассматриваются типовые на мой взгляд вопросы при переходе с 8-битников на 32-разрядную архитектуру: как помигать светодиодом, как настроить тактирование, как завести SPI и поднять I2C.

Данная статья не рассчитана на новичков, я часто буду сравнивать STM32 c STM8, и по ходу повествования буду опускать многие элементарные, на мой взгляд, вещи. Статья предполагает, что вы уже знаете Cи, имеете опыт работы в консоли Linux или CYGWIN Windows. Также будет весьма кстати, если у вас уже есть опыт программирования в "Bare Metal" хотя бы на уровне микроконтроллеров STM8.

Если вам чего-то из этого не хватает, то вы легко сможете подтянуть "матчасть" по статьям на хабре: STM32F4: GNU AS: Программирование на ассемблере в семи частях, по методичке "Народная электроника" выпуск 2. А.В. Немоляев. GCC Cortex-M3. PDF, или по книге "Джозеф Ю. Ядро Cortex - МЗ компании ARM. Полное руководство". Также, в какой-то мере, могут быть полезны материалы данного сайта.

Оборудование. В статье я буду использовать популярную плату "Blue Pill" на микроконтроллере STM32F103C8T6, программатор ST-LINK v2 (китайская реплика), USB-UART преобразователь FT232RL, 4-x разрядный семисегментный индикатор, на SPI интерфейсе и RTC DS3231 на I2C интерфейсе.

    Список используемой документации:
  1. Cortex-M3: Руководство программиста (PM0056), для чипов серий: STM32F10xxx/20xxx/21xxx/L1xxxx.
  2. Справочное руководство (Reference Manual: RM0008), для чипов следующих серий: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm.
  3. Datasheet на чипы: STM32F103x8/STM32F103xB.
  4. STM32F10xxx I2C optimized examples, Application note AN2824
  5. Шпаргалка по набору инструкций 16-битных инструкций Thumb.
  6. Шпаргалка по набору инструкций Thumb2.
  7. ARM. Учебный Курс. SysTick — Системный таймер | Электроника для всех
  8. ARM Учебный курс. USART | Электроника для всех
  9. Статья на хабре: STM32: SPI: LCD — Вы всё делаете не так [восклицательный знак]
  10. SPI (перевод из книги Mastering STM32) – Radiotech
  11. Статья на хабре: Бюджетный отладчик к ESP-32 и его настройка
  12. Статья на хабре: FT232H, MPSSE и SPI-программатор за 15 евр
  13. Статья на хабре: FT232H и почти универсальный USB<->JTAG-адаптер за 15 евро

Содержание:

    I. Программирование и отладка STM32 в консоли
  1. Работа с GPIO на регистрах, без использования SPL или HAL
  2. Минималистичный Blink размером в 148 байт
  3. Добавляем к проекту таблицу векторов и Makefile
  4. Настройка системы тактирования - RCC (Reset and Clock Control)
  5. Функция задержки на ассемблерных инструкциях
  6. Функция задержки на прерывании таймера SysTick
  7. Настройка UART интерфейса в режиме передатчика
  8. Простой бенчмарк на операции деления
  9. Пишем простой планировщик задач (RTOS)
  10. Драйвер 4-x разрядного семисегментного индикатора (программный SPI)
  11. Настройка аппаратного интерфейса SPI для драйвера 4-х разрядного семисегментного индикатора
  12. Регистры I2C интерфейса, делаем сканер I2C шины
  13. Однобайтный режим чтения по шине I2C
  14. Двухбайтный режим чтения по шине I2C
  15. Запись массива через шину I2C
  16. Чтение массива через шину I2C
  17. Отладка в консоли с использованием OpenOCD
  18. Отладка с помощью JTAG адаптера на чипе FT232H

Посмотреть исходники, сборочные файлы, скачать скомпилированные прошивки, можно с портала GITLAB https://gitlab.com/flank1er/stm32_bare_metal

Читать дальше

STM32F103C8T6 aka Blue Pill + STM32duino + IAR ARM: быстрый старт

разделы: STM32, STM32duino, дата: 08 сентября 2017г.

Отладочная плата на микроконтроллере stm32f103c8t6, является одной из самых популярных в любительской среде "электронщиков". Это одна из самых удачных плат в соотношении "цена/функционал", а сам stm32f103xxxx, который выпускается уже 10 лет, является ветераном и первопроходцем микроконтроллеров на ядрах ARM Cortex M3.

    Для быстрого знакомства с платой я предлагаю пройтись по следующим пунктам:
  • Краткий обзор платы;
  • Исправление аппаратного бага с помощью термофена и паяльника;
  • Прошивка загрузчика STM32duino;
  • "Подъем" виртуального COM порта на USB-модуле микроконтроллера stm32f103c8t6 с помощью STM32Cube MX и IAR ARM. Подключение микроконтроллера к планшету на Android.
  • Подключение и написание программы опроса I2C модуля RTC DS3231 с помощью STM32duino.

Вроде не много.

    Краткое описание

  • В отличии от Maple Mini, данная плата имеет штыревой разъем для подключения китайского клона ST-Link. Что на мой взгляд является большим плюсом, т.к. на проверку, загрузчик Leafmaple/STM32duino из-за постоянного переключения между DFU-загрузчиком и виртуальным COM-портом, оказался довольно проблемным.
  • Плата имеет на борту два кварца: на 8 MHz для тактирования HSE и на 32768 Hz для LSE. Для сравнения, на Maple Mini установлен только кварц на 8 MHz.
  • Сам микроконтроллер stm32f103c8t6, несмотря на то что по документации поставляется с флешпамятью на 64KБайта, фактически поставляется с флеш-памятью на 128КБайт(!) Хотя, гарантии на это никто не дает конечно.
  • Также имеется два джампика для прошивки микроконтроллера через USB-TTL конвертер, кнопка сброса Reset, два светодиода: красный для индикации питания и зеленый подключенный к выводу PC13. Причем загорается он при логическом нуле.
  • Цифровые выводы имеют маркировку в соответствии с даташитом, за тем исключением, что из их обозначения отброшена литера "P".
  • Довершает "обвес" микро-USB разъем, который мы сегодня попытаемся задействовать.
  • Сфера применения микроконтроллера, на мой взгляд- это коммутация по USB-интерфейсу с традиционными компьютерами, одноплатными компьютерами, устройствам на Android которые возможно использовать как дисплеи(вторая жизнь для устаревших телефонов и планшетов) и т.д. Также думаю, что будет неплохая связка микроконтроллеров STM32 с SPI-дисплеями.

Полезная информация о плате собрана на страничке проекта STM32duino.

Для начала взглянем на раcпиновку платы:

Читать дальше

STM32duino - наследник проекта LeafMaple

разделы: STM32, Arduino, STM32duino, дата: 6 февраля 2017г.

Как я уже упоминал, проект LeafMaple после нескольких лет простоя свернулся, а его поддержку и развитие передали на сайт http://stm32duino.com/ который выполнен в виде форума. Впрочем, имеется там и Вики http://wiki.stm32duino.com.

Первым преимуществом STM32duino является то, что он поддерживает не только платы LeafMaple и их клоны, STM32duino можно установить на целый набор плат на stm32f103 а так же на stm32f4. Списки поддерживаемых плат, а также уровень их поддержки можно посмотреть в Вики.

Второй "плюс" проекта, то что там сделали таки драйвера для систем Windows 7 и выше. Т.е. то, что не могли сделать на leafmaple.com несколько лет.

Как следует из названия, в качестве IDE проект использует Arduino IDE, что упрощает жизнь, т.к. он поддерживает внешние IDE.

1) Установка загрузчика

Первым делом нужно будет прошить загрузчик. Напомню, что я работаю c клоном Maple Mini и в качестве программатора использую опять же клон ST-Link v2. Для тех кто использует Blue Pill и прошивает микроконтроллер через встроенный загрузчик, возможно будет полезна следующая статья: Дешевая STM32 плата + Arduino IDE UPD 15.07.2016.

Загрузчик для своей платы можно скачать здесь: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries. В случае с Maple Mini это - maple_mini_boot20.bin

Читать дальше

STM32F103+SPL+HAL: интерфейс UART и реализация функции printf()

разделы: STM32, UART, дата: 19 ноября 2016г.

В stm32f103cbt6 имеется три аппаратных USART интерфейса. По возможностям они соответствуют USART в STM8S, т.е. имеется синхронный и асинхронный режимы, SmartBus, IrDA, LIN, CAN. С USART интерфейсами можно работать чрез "события", прерывания или DMA. Предлагаю рассмотреть простейшее использование UART через printf() функцию.

На плате Maple Mini все три интерфейса подписаны на плате:

В данном случае будем задействовать первый USART, т.е. понадобится контакт 26(Tx).

В SPL регистры UART представлены следующей структурой:

typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USART_TypeDef;

Заметьте, что регистры шестнадцатибитные. Почитать про регистры и сам UART можно здесь: ARM Учебный курс. USART

В HAL интерфейс работы в синхронном режиме вынесен в отдельные файлы: stm32f1xx_hal_usart.h/stm32f1xx_hal_usart.с, которые нас сейчас не будут интересовать. Работа асинхронного передатчика реализована в stm32f1xx_hal_uart.c и описывается следующими функциями:

Читать дальше

STM32F103 + SPL + HAL: GPIO и внешние прерывания

разделы: STM32, дата: 13 ноября 2016г.

Внешние прерывания в STM32 походят на прерывания STM8 "L"-серии, с той оговоркой, что если в STM8L можно было прерывания назначить по номеру пина или/и букве порта, то в STM32 прерывания назначаются только по номеру пина, плюс еще несколько прерываний от периферии для "пробуждения" микроконтроллера.

С GPIO ситуация тоже аналогична STM8, здесь было лишь добавлено несколько "плюшек" в сравнение с режимами GPIO в STM8.

В файле stm32f10x.h SPL, регистры GPIO описаны следующей структурой:

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

В stm32f103xb.h HAL структура идентичная.

Здесь, CRL/CRH - управляющие регистры, аналог Px_DDR/Px_CR1 в STM8 и PORTx в AVR. IDR и ODR аналогичны своим тезкам в STM8. BSRR и BRR - регистры битового доступа. BSRR устанавливает определенный бит в ODR, BRR - сбрасывает нужный бит в ODR. LCKR - устанавливает порт в режим Read-Only. Подробно про регистры GPIO для STM32F10x почитать можно здесь: ARM. Учебный Курс. Порты GPIO

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

Читать дальше

STM32F103 + HAL: Использование STM32CubeMX и библиотеки HAL в среде Linux/SW4STM32

разделы: STM32, среда разработки, дата: 20 октября 2016г.

HAL - это дальнейшее развитие библиотеки SPL, выпущенной фирмой "ST Microelectronics", ориентированный на то, что бы дать разработчику единый инструмент для работы со всеми чипами STM32. Этим единым инструментом стала кросс-платформенная утилита с графическим интерфейсом STM32CubeMX, а сам фреймворк HAL стал называться STM32Cube. И если утилита STM32CubeMX действительно одна для всех микроконтроллеров STM32, то фреймворк STM32Cube/HAL для каждой линейки чипов свой. Т.е. все так же как и в SPL.

STM32CubeMX - позволяет сгенерироваль проект на основе CMSIS+HAL под различные IDE, что помогает избежать многих граблей, на начальном этапе освоения STM32.

Нас будет интересовать линейка STM32F1xx, документация по HAL для этой линейке доступна на официальном сайте Description of STM32F1xx HAL drivers. User Manual UM1850

Установка связки STM32CubeMX + IDE в системах Windows, тривиальна и многократно описана в сети, а вот в Linux могут возникнуть сложности.

Для Eclipse существует плагин STM32Cube, который позволяет запустить STM32CubeMX в окошке Eclipse. Есть в сети пошаговая инструкция как этим плагином пользоваться: Установка и настройка Eclipse, STM32CubeMX под Windows, и я даже где-то видел видео, где все работает. Но в моем случае, проект который в итоге генерировался, Eclipse-ом почему-то не желался приниматься:

Читать дальше

STM32F103 + SPL: Программирование, прошивка, отладка микроконтроллеров STM32 в средах Windows/IAR и Linux/Eclipse используя программатор ST-Link v2

разделы: STM32, STM32duino, среда разработки, дата: 14 октября 2016г.

Архитектуру STM32 можно мысленно разделить на две части. Первая часть, это ядро Cortex-M3, которое спроектировали в ARM и которое примерно одинаковое для всех. "Примерно", потому что, содержит опциональные модули которые могут быть у одного производителя и отсутствовать у другого. Вторая часть, это периферия знакомая по STM8, с тем отличием, что был добавлен USB2.0 интерфейс, хотя точнее было бы сказать, что этот интерфейс был "откручен" от STM8(такая у STM политика: хочешь аппаратный USB, используй STM32).

    Справочники и руководства которые нужны для работы c STM32F103x8/STM32F103xB:
  1. Справочное руководство по 32-битным микроконтроллерам серий STM32F10x Reference Manual. STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM®-based 32-bit MCUs или RM 0008
  2. Руководство на чипы STM32F103x8/STM32F103xB STM32F103x8 STM32F103xB Medium-density performance line ARM®-based 32-bit MCU with 64 or 128 KB Flash, USB, CAN, 7 timers, 2 ADCs, 9 com. interfaces
  3. Ядро Cortex - МЗ компании ARM. Полное руководство. Книга не обязательная, но на мой взгляд очень полезная.

Читать дальше

Leaf Maple: введение в STM32

разделы: STM32, STM32duino, дата: 17 сентября 2015г.

Проект Leaf Maple призван стать аналогом Arduino для микроконтроллеров STM32. Пока нельзя сказать, что проект "выстрелил", но на мой взгляд достоин внимания. Заказать китайский клон Maple Mini можно всего за 4USD.

 

    На борту чип STM32F103CBT6, содержащий множество интересных штук:
  1. ядро ARM CortexM3;
  2. 32-разрядность;
  3. частота 72 МГц;
  4. 128 кБайт встроенной флеш памяти;
  5. 20 кБайт оперативки;
  6. 12-битный АЦП;
  7. семь DMA каналов;
  8. аппаратные USB2.0, CAN, USART, I2C, SPI интерфейсы.

Полную спецификацию можно посмотреть на официальном сайте фирмы STMicroelectronics: STM32F103x8 STM32F103xB datasheet

Читать дальше