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 реализуется с помощью следующего набора функций:

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

STM8+SPL+COSMIC+STVD: Быстрый старт

разделы: STM8, среда разработки, дата: 6 ноября 2016г.

Как всем известно, с марта этого года компилятор COSMIC for STM8 стал полностью бесплатен и без ограничений на размер генерируемого кода. Он имеет полную поддержку SPL(Standard Peripheral Library) и фирменой среды разработки - STVD(ST Visual develop IDE).

К сожалению, Cosmic работает только под операционными системами Windows, и для активации требует лецензионный ключ который можно прождать несколько дней. С другой стороны, stm8flash в Linux не умеет прошивать STM8L151C8, а с COSMIC через виртуалку вполне можно работать, да из под Wine он тоже запускается.

Ок, для начала нам потребуется скачать SPL и STVD c сайта https://my.st.com, а с сайта http://www.cosmic-software.com/download.php сам компилятор COSMIC. Как скачать SPL я рассматривал год назад в Введение в STM8: программирование и прошивка с помощью клона ST-Link v2, версия для Linux, а связку STVP+STVD весной в STM8 + IAR + ST-LINK2: программирование, прошивка и отладка из под Windows. Однако с тех многие ссылки побились, поэтому предлагаю пройти квест заново. Потому что поиск чего-то на st.com, действительно напоминает дурной квест.

В качестве целевого чипа я буду использовать STM8S103F3P6, изредка переключаясь на STM8L051/STM8L151 там, где есть необходимость.

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