Дополнительные инструменты

Основные возможности TrueStudio

Программная платформа. TrueStudio является полноценной интегрированной средой разработки встраиваемого ПО для микроконтроллеров STM32 (рисунок 8). Внешне TrueStudio чрезвычайно похожа на AC6 System Workbench. Это не удивительно, так как обе среды используют платформу Eclipse. Сходство на этом не заканчивается. В основе TrueStudio лежат те же открытые проекты компилятора GCC и отладчика GDB.

Рис. 8. Интерфейс TrueStudio

Поддерживаемые микроконтроллеры. TrueStudio работает только с STM32 и поддерживает все микроконтроллеры семейства. Кроме того, в TrueStudio есть поддержка большинства плат от STMicroelectronics. Пользователь может открыть готовые демонстрационные проекты без скачивания каких-либо дополнительных файлов.

Работа с проектами. TrueStudio позволяет создавать и редактировать проекты, написанные на С/С++. Существует возможность создания дерева проектов, что весьма удобно при параллельной работе с несколькими приложениями.

Работа с файлами. TrueStudio предлагает к услугам пользователей стандартный набор инструментов для работы с С/С++-файлами: поиск, интерактивный поиск, контекстную подсветку, шаблоны, дерево функций и т.д.

Компиляция и построение проекта. Как было сказано выше, TrueStudio использует GCC для компиляции проекта. При этом возможна оптимизация кода в процессе компиляции.

TrueStudio дает пользователям возможность ручного размещения кода и данных в памяти микроконтроллера.

Программа обеспечивает формирование исполнительного кода в различных форматах, а также позволяет создавать статические библиотеки, что значительно экономит время на перекомпиляцию.

Отладка. TrueStudio поддерживает работу с использованием всех популярных отладчиков, в том числе, ST-Link, SEGGER, P&E micro и др.

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

Стоит отметить, что процесс отладки в TrueStudio мало чем отличается от работы с другими аналогичными средами.

Поддержка систем контроля версий. TrueStudio обеспечивает одновременную работу нескольких пользователей над проектом за счет поддержки систем контроля версий: CVS, SVN, Git.

Взаимодействие с STM32Cube. Как было сказано выше, применение STM32Cube значительно упрощает работу программистов на этапе инициализации микроконтроллеров. Поэтому возможность совместной работы с STM32Cube является очень большим плюсом для TrueStudio.

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

Небольшой проект, демонстрирующий взаимодействие STM32Cube и TrueStudio, представлен в видеоролике, дополняющем данную статью. В этом проекте STM32Cube используется для настройки таймера TIM4, выходные каналы которого управляют яркостью светодиода с помощью ШИМ. Отладка выполняется с помощью TrueStudio и платы STM32F4DISCOVERY.

Библиотека

ST сделала такую штуку, которая называется STM8x Firmware library. Это – суть фрэймворк для микроконтроллеров.

Давайте, к примеру, запустим АЦП

1#include «stm8a_lib.h»

2

3void main(void)

4{

5 ADC_DeInit();

6 enableInterrupts();

7

8 /* Init ADC peripheral */

9 ADC_Init(ADC_CONVERSIONMODE_CONTINUOUS, ADC_CHANNEL_9,

10 ADC_PRESSEL_FCPU_D2, ADC_EXTTRIG_TIM, DISABLE,

11 ADC_ALIGN_RIGHT, ADC_SCHMITTTRIG_CHANNEL9, DISABLE);

12

13 /* Enable EOC interrupt */

14 ADC_ITConfig(ENABLE);

15

16 /*Start Conversion */

17 ADC_StartConversion();

18

19 while(1) { /* wait for interrupts */ }

20}

Красиво, не правда ли? Конечно, скорость работы с использованием такого “фрэймворка” будет ниже, чем без, но, как завещал Кнут – “premature optimization is the root of all evil”. Если будет совсем медленно, функции библиотеки всегда можно подменить своими.

Такая библиотека позволяет не только поднять скорость разработки, но и облегчает миграцию  между процессорами.

Документация на библиотеку, хоть и doxygen’овская, но довольно хороша!

Как использовать STVP_CMDLINE.exe

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>style=»clear:both;»>

I. Подготовка

1. Установите STVP-программное обеспечение

STVP_CMDLINE включена в установочный пакет STVP, адрес загрузки установки STVP. http://www.st.com/content/st_com/en/products/development-tools/software-development tools/stm8-software-development-tools/stm8-programmers/stvp-stm8.html

2. Установите драйвер Stlink

II. Как использовать

Метод 1: Двойной щелчок stvp_cmdline.exe

Если вы не успешны, вы можете отправить его на свой ярлык на рабочем столе, щелкните правой кнопкой мыши свойстве

Добавить C: \ Windows \ Syswow64 \ C: \ Windows \ Syswow64 \ cmd.exe / k «перед оригинальным объективным контентом, чтобы открыть

Метод два

Запуск CMD напрямую

CD входитSTVP_CMDLINE.EXE папка

Запустите STVP_CMDLINE.exe -Help Просмотр справки документа

Среди них необходимо установить красный элемент стрелки.

1. Настройки загрузки Wordname Мы установлены на ST-Link (-BOBLAME = ST-LINK)

2. — Настройки идентификатора горелки Tool_id, если мы подключаем несколько бугорков на нашем компьютере, мы можем различить этот элемент, здесь мы устанавливаем 0 (-Tool_id = 0)

3. Настройка режима записи Progmode, я могу выбрать SWD и плавать, здесь мы используем плавание. (-Прогмод = плавать)

4. Настройка названия чипов устройства, здесь мы используем STM8S003F3. (-Device = STM8S003F3)

5. — Прогресс отображает прогресс каждого действия, чтобы мы могли смотреть информацию о жжении. (-Прогресс)

6. — Проверьте ожоги деньги для проверки чипов, это мы должны выбрать проверить. (-Проверять)

7.-FileProg Выберите файл шестигранного файла, который вы хотите сжечь мой файл Hex в C: \ Users \ Lx \ Desktop \ Demo.hex. (-Fileprog = c: \ users \ lx \ desktop \ demo.hex)

Наконец, нам нужно ввести вышеуказанную команду один раз.

STVP_CmdLine.exe -BoardName=ST-LINK -ProgMode=SWIM -Tool_ID=0 -Device=STM8S003F3 -progress -verif -FileProg=C:\Users\lx\Desktop\demo.hex

Показать проверяющие программные успехи программы, это успешно.

Наконец, выйдите из зажигания, щелкните пробел, а затем выберите другие клавиши.

Интеллектуальная рекомендация

ArrayList: Нижний слой представляет собой массив, хорошо подходящий для поиска данных (доступа) LinkedList: Базовый связанный список, удобный для изменения данных (включая добавление и удаление данных…

nginx скомпилируйте и установите 1. Установите среду компиляции 2. Установите программный пакет pcre (сделайте так, чтобы nginx поддерживал модуль перезаписи http) 3. Установите openssl-devel (сделайт…

цель: Изучите анализ преобразования Фурье и другие методы анализа. Понять взаимосвязь между частотной областью преобразования Фурье и временной областью. Используйте MATLAB, чтобы нарисовать трехмерну…

1. Текущее состояние3 февраля 2011 года адреса IPv4 были выделены, и основные операторы ждут, чтобы исчерпать свои сбережения. Люди все больше полагаются на проводные и беспроводные маршрутизаторы, та…

The note introduces basic Python syntax and strings. Python notes of open courses @Codecademy. Brief Introduction Python is a high level scripting language with object oriented features. Python progra…

Вам также может понравиться

1. Настройка микросервиса с использованием ip для регистрации на сервере euraka Конфигурация Springcloud 2.0 выглядит следующим образом: 2. Соответствующая конфигурация при загрузке вложений размером …

Структура данных Java и алгоритм тип данных 1 Введение в типы данных 2 Массив с разреженными типами данных 2.1 Введение в примеры 2.2 Базовое введение в разреженные массивы 2.3 Примеры применения 2.4 …

Обширные стандартные библиотеки, сторонние библиотеки и модули Python стали одной из причин его популярности. А PyPI — это склад, который нужно установить каждому, прежде чем думать о сторо…

Добавить зависимость Добавить в код класс конфигурации RestTemplate СоздайтеRestClientConfigClass, установите размер пула соединений, период ожидания, механизм повтора и т. Д. Конфигурация следующая: …

scroll-view прокрутка-просмотр прокручиваемая область просмотра. атрибут прокрутки Если вы используете вертикальную прокрутку, вам нужно задать <scroll-view> фиксированную высоту и установить вы…

Что еще?

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

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.

Setting up toolchain

The biggest downside is that STM8 processors are not supported by GCC. There are 3 commercial compilers available for these processors: Raisonance, Cosmic and IAR. Some of these compilers have free versions with code size limit, but none of them are available for linux. Luckily, SDCC supports STM8 and that’s what we’re going to use. SDCC is being actively developed, so I suggest trying the latest snapshot build instead of the stable version. To program the microcontroller we’ll be using stm8flash. The first step is to download all the necessary tools:

  1. sdcc
  2. stm8flash

Extract SDCC under ~/local/sdcc. Now extract stm8flash, build it with and copy stm8flash binary to ~/local/sdcc/bin. I prefer to keep flasher with compiler for convenience. Next, add the following line to your .bashrc file (replacing username with your user name):

1
export PATH=$PATH:/home/username/local/sdcc

If everything was done properly, you should be able to run . The last remaining thing is to write udev rule for ST-Link programmer. Create a file :

123
# ST-Link v1/v2ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="0666"ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666"

Finally, run as root. Now we’re all set and ready to start.

ШИМ

ШИМ на втором таймере настраивается так же, как в предыдущей истории, с двумя отличиями:

Во-первых, нам надо включить прерывание на Update Event (UEV), которое будет вызывать функцию, переключающую активный LED. Делается это изменением бита Update Interrupt Enable в регистре с говорящим названием

Второе отличие связано с таким явлением мультиплексинга, как ghosting – паразитное свечение диодов. В нашем случае оно может появитсья из-за того, что таймер, вызвав прерывание на UEV, идет тикать дальше, и обработчик прерывания не успевает переключить LED прежде чем таймер уже начнет что-то писать в выводы

Для борьбы с этим придется инвертировать логику (0 = максимальная яркость, 255 = ничего не горит) и не допускать крайних значений скважности. Т.е

добиться того, чтобы после UEV светодиоды полностью гасли на один такт ШИМ.

Меняем полярность:

Избегаем установки r, g и b в 255 и не забываем их инвертировать при использовании.

Прерывания

Суть прерывания в том, что при определенных обстоятельствах чип прекращает выполнять основную программу и вызывает какую-то внешнюю функцию. Прерывания возникают из-за внешних или внутренних воздействий, в том числе от таймера.

Когда мы в первый раз создали проект в ST Visual Develop, то кроме мы получили окно с загадочным файлом , автоматически включенным в проект. В этом файле на каждое прерывание привязана функция . Нам надо привязать свою функцию к нужному прерыванию.

В даташите есть таблица векторов прерываний, где мы находим нужные:

Нам надо менять LED при UEV, так что нужно прерывание №13.

Соответственно, во-первых, в файле меняем имя функции, отвечающей за прерывание №13 (IRQ13) по умолчанию на свое:

Во-вторых, нам придется создать файл такого содержания:

Ну и, наконец, прописать эту функцию в своем :

Осталось включить прерывания. Делается это ассемблерной командой – искать ее придется в :

Другая ассемблерная команда – – выключает прерывания. Их надо отключать на время записи новых значений в «видеопамять», чтобы вызванное в неудачный момент прерывание не испортило массив.

Весь код – .

Если хоть кому-то эта статья пригодится, значит, я не зря ее писал. Буду рад комментариям и замечаниям, постараюсь ответить на все.

Features

The hardware features are quite similar to an ATmega8:

Boardname stm8blue
CPU STM8S103F3P6
Clock 16MHz, internal oscillator
Flash 8kB
RAM 1kB
EEPROM 640 byte
I/O voltage 3.3V
GPIO 14
serial connections UART, SPI, I2C
PWM 4 (up to 7 via alternate mapping)
ADC 5 channel, 10 bit
LED PB5 (Arduino D3), active low, shared with I2C, red
programming interface SWIM, no serial bootloader
USB connector mini, power only (data lines not connected)

One (red) LED is connected to GPIO PB5 (CPU pin 11). This LED is low active.
Please keep in mind that this is one of the I2C signals and using the LED
blocks the I2C bus. The push button is for reset. The CPU runs on 3.3V, a
linear regulator is integrated on the board. The micro USB connector is only
for (5V) power supply, the data lines are not connected.

All CPU pins are easily accessible on (optional) pin headers (pitch 2.54mm,
perfect for breadboards).

They are very similar to the ESP14 Wifi-boards and
most programs will work fine on those chinese gems as well.

Preface

STM8 is a cheap 8-bit microcontroller aimed towards low-cost mass-market devices. Initially I came across this part while searching for a simple microcontroller as a replacement for AVRs. Despite having various ARM Cortex-M0 devices available on the market for quite attractive prices, AVRs have one advantage — simplicity. Utilizing an ARM Cortex core to switch some lights on and off seems like an overkill. Some applications just don’t require that amount of flexibility and performance.

The main goal of this article is to demonstrate that ‘bare metal’ programming is not a difficult task and to give you an overview of STM8’s architecture and peripherals. Even though writing peripheral drivers from scratch might seem like reinventing the wheel, in many cases it is easier and faster to implement the functionality that you need for a specific task, instead of relying on vendor-supplied libraries that try to do everything at once (and fail).

Включаем тактирование

За тактирование отвечают часики, они же Clock. И мы уже могли заметить аббревиатуру RCC. Ищем ее в документации: это Reset and Clock Control (Управление сбросом и тактированием).

Как выше было сказано, к счастью, самое сложное из темы тактирования за нас сделали люди из STM, за что им большое спасибо (еще раз дам ссылку на , чтобы было понятно, насколько это заморочено). Нам нужны всего лишь регистры, отвечающие за включение тактирования периферии (Peripheral Clock Enable Registers). Для начала найдем базовый адрес RCC, он в самом начале «Карты памяти»:

И в них, соответственно, биты, включающие тактирование SPI2, IOPB (I/O Port B) и альтернативных функций (AFIO).

Финальный код можно найти .

Если есть возможность и желание потестить, то подключаем DM634 так: DAI к PB15, DCK к PB13, LAT к PB14. Питаем драйвер от 5 вольт, не забываем объединить земли.

ШИМ на STM8

Когда я только планировал эту статью, я решил для примера попробовать освоить какой-нибудь функционал незнакомого мне чипа с помощью только даташита, чтобы не получался сапожник без сапог. STM8 на эту роль подходил идеально: во-первых, у меня была пара китайских плат с STM8S103, а во-вторых, он не слишком популярен, а потому соблазн почитить и найти решение в интернете упирается в отсутствие этих самых решений.

К чипу также есть и , в первом распиновка и адреса регистров, во втором – все остальное. Программируется STM8 на C в страшненькой IDE .

Тактирование и ввод-вывод

По умолчанию STM8 работает на частоте 2 МГц, это надо сразу исправить.

Находим адрес регистра в даташите, описание в refman и видим, что регистр надо очистить:

Поскольку мы собираемся запускать ШИМ и подключать светодиоды, смотрим распиновку:

Чип маленький, многие функции подвешены на одни и те же пины. То, что в квадратных скобках – «альтернативный функционал», он переключается «байтами опций» (option bytes) – что-то вроде фьюзов Атмеги. Менять их значения можно программно, но не нужно, т.к. активируется новый функционал только после перезагрузки. Проще воспользоваться ST Visual Programmer (качается вместе с Visual Develop), умеющим менять эти байты. В распиновке видно, что выводы CH1 и CH2 первого таймера спрятаны в квадратные скобки; надо в STVP проставить биты AFR1 и AFR0, причем второй также перенесет вывод CH1 второго таймера с PD4 на PC5.

Таким образом, управлять светодиодами будут 6 пинов: PC6, PC7 и PC3 для первого таймера, PC5, PD3 и PA3 для второго.

Настройка самих пинов ввода-вывода на STM8 проще и логичнее, чем на STM32:

  • знакомый по Atmega регистр направления данных DDR (Data Direction Register): 1 = вывод;
  • первый контрольный регистр CR1 при выводе задает режим «тяни-толкай» (1) или открытый сток (0); поскольку я подключаю светодиоды к чипу катодами, оставляю тут нули;
  • второй контрольный регистр CR2 при выводе задает скорость тактирования: 1 = 10 МГц

ST Visual Programmer (STVP) метод программирования для чипов серии STM8

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>yle=»margin-bottom:5px;»>Теги:  STVP  STLINK скачать

Из-за сбоя программы загрузки IAR ранее вам нужно использовать ST Visual Programmer (STVP) для записи программы для микросхемы серии STM8. Ниже в основном представлены шаги загрузки: (1). Вам необходимо использовать файл .s19, который может быть сгенерирован IAR. Откройте IAR и откройте существующий проект -> Щелкните заголовок проекта и выберите «Параметры». -> Выбрать конвертер вывода -> выберите «Создать дополнительный вывод» -> выберите формат выводаВарианты Motorola -> выбрать переопределение по умолчанию -> Суффикс имени выходного файлаИзменено.s19 –>Перекомпилировать весь проект ->. s19 находится в каталоге Debug \ Exe (2) Откройте ST Visual Programmer (STVP) и установите режим аппаратного соединения и модель MCU. Здесь мы в качестве примера используем соединение ST-Link STM8S003F. Импортировать файл .s19 для записи (т.е. открыть файл непосредственно в верхнем левом углу),Установите, нужно ли блокировать чип (может быть не установлен) Нажмите, чтобы загрузить, вкладка Программы-> Все

Интеллектуальная рекомендация

ArrayList: Нижний слой представляет собой массив, хорошо подходящий для поиска данных (доступа) LinkedList: Базовый связанный список, удобный для изменения данных (включая добавление и удаление данных…

nginx скомпилируйте и установите 1. Установите среду компиляции 2. Установите программный пакет pcre (сделайте так, чтобы nginx поддерживал модуль перезаписи http) 3. Установите openssl-devel (сделайт…

цель: Изучите анализ преобразования Фурье и другие методы анализа. Понять взаимосвязь между частотной областью преобразования Фурье и временной областью. Используйте MATLAB, чтобы нарисовать трехмерну…

1. Текущее состояние3 февраля 2011 года адреса IPv4 были выделены, и основные операторы ждут, чтобы исчерпать свои сбережения. Люди все больше полагаются на проводные и беспроводные маршрутизаторы, та…

The note introduces basic Python syntax and strings. Python notes of open courses @Codecademy. Brief Introduction Python is a high level scripting language with object oriented features. Python progra…

Вам также может понравиться

1. Настройка микросервиса с использованием ip для регистрации на сервере euraka Конфигурация Springcloud 2.0 выглядит следующим образом: 2. Соответствующая конфигурация при загрузке вложений размером …

Структура данных Java и алгоритм тип данных 1 Введение в типы данных 2 Массив с разреженными типами данных 2.1 Введение в примеры 2.2 Базовое введение в разреженные массивы 2.3 Примеры применения 2.4 …

Обширные стандартные библиотеки, сторонние библиотеки и модули Python стали одной из причин его популярности. А PyPI — это склад, который нужно установить каждому, прежде чем думать о сторо…

Добавить зависимость Добавить в код класс конфигурации RestTemplate СоздайтеRestClientConfigClass, установите размер пула соединений, период ожидания, механизм повтора и т. Д. Конфигурация следующая: …

scroll-view прокрутка-просмотр прокручиваемая область просмотра. атрибут прокрутки Если вы используете вертикальную прокрутку, вам нужно задать <scroll-view> фиксированную высоту и установить вы…

Datasheet

Datasheet содержит в себе информацию о наличии определенной периферии в конкретном МК, цоколевке, электрических характеристиках и маркировке чипов для STM32F103x8 и STM32F103xB, то есть для вот этих, которые обведены красным прямоугольником:

Некисло, один даташит на 8 микроконтроллеров.

Основное в Datasheet-е

В первую очередь нужно обратить внимание на раздел 7. Ordering information scheme, в котором указано, то обозначает каждый символ в маркировке. Например, для STM32F103C8T6: корпус  LQFP-48, 64Кб flash-а, температурный диапазон –40 to 85 °C

Далее 2.1 Device overview. В нем есть таблица, в которой сказано, какая периферия есть в конкретном микроконтроллере и в каком количестве:

Основное различие между микроконтроллерами из разных колонок в количестве ножек и объеме флеша, остальное все одинаково. Небольшое исключение составляет первая колонка версий Tx: в этих микроконтроллерах поменьше модулей SPI, I2C и USART-ов. Нумерация периферии идет с единицы: то есть, если в STM32F103Cx у нас 2 SPI, то они имеют имена SPI1 и SPI2, а в STM32F103Tx у нас только SPI1. Так как Datasheet у нас на микроконтроллеры STM32F103x8 и STM32F103xB, то эта таблица справедлива только для этих моделей. К примеру STM32F103C8 или STM32F103CB соответствуют этой таблице, а STM32F103C6 нет, для него есть отдельный даташит.

В разделе 2.2 Full compatibility throughout the family говорится о том, что устройства STM32F103xx являются программно, функционально и pin-to-pin (для одинаковых корпусов) совместимыми.

В reference manual-е есть разделение на следующие «виды» микроконтроллеров: STM32F103x4 и STM32F103x6 обозначены как low-density devices, STM32F103x8 и STM32F103xB как medium-density devices, STM32F103xC, STM32F103xD и STM32F103xE как high-density devices. В устройствах Low-density devices меньше Flash и RAM памяти, таймеров и периферийных устройств. High-density devices имеют больший объем Flash и RAM памяти, а так же имеют дополнительную периферию, такую как SDIO, FSMC, I2S и DAC, при этом оставаясь полностью совместимыми с другими представителями семейства STM32F103xx. То есть, если на каком-то этапе разработки стало ясно, что выбранного микроконтроллера не хватает для реализации всех возможностей, то можно безболезненно выбрать более навороченный камень без необходимости переписывать весь существующий софт, при этом, если новый камень будет в том же корпусе, то отпадает необходимость заново разводить печатную плату.

Настройка порта 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

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

Плюсы и минусы

Естественно, плюсы и минусы я оцениваю по применимости в моих проектах, для вас они могут отличаться в ту или иную сторону. Я буду сравнивать с AVR, потому, как на них многие уже скушали небольшую собачку.

Плюсы:

  1. Цена. Не смотря на мало распространенность, stm8 стоит по три копейки за ведро.
  2. Еще одна цена. Отладочные платы и отладчики стоят копейки. Можно забыть про всю ту ораву самопальных программаторов, что расплодились для AVR’ов. Также, можно забыть про программаторы без отладчиков – за минимальные деньги все включено.
  3. У stm8 в отличии от AVR нет фьюзов. И это меня очень радует. Теперь вся программа действительно содержится в одном hex файле. Ну согласитесь, фьюзы в AVR– чистейшее зло!
  4. Есть очень дешевые контроллеры с 12-битными АЦП и ЦАПами, и это – очень хорошо!
  5. Классный отладочный интерфейс. Задумка об отладке по одному проводу у AVR была хороша, но чтобы ее включить, приходилось подключать еще три. В итоге, JTAG был не намного хуже пресловутого debugWire. ST довела идею до логического завершения. Отладка по двум проводам. Супер!
  6. Работает от пяти вольт. Не знаю, можно ли это назвать достоинством в нынешнем мире, но олдфагам это точно понравится.
  7. Встроенный bootloader. Умеет загружать программы по uart, spi, can, i2c.
  8. На халяву дается библиотека драйверов периферии.

Недостатки:

  1. Нет контроллеров в маловыводных корпусах (типа so8).
  2. Нет контроллеров с USB. ST предлагает пересаживаться на ее кортексы, если нужен USB.
  3. Не слишком пока распространены. Соответственно, и доставать сложно, и цены выше, чем могли бы быть.

DM634

Тайваньский чип с 16-ю 16-битными ШИМ-выходами, можно соединять в цепочки. Младшая 12-битная модель известна по отечественному проекту . В свое время, выбирая между DM63x и хорошо известным TLC5940, остановился на DM по нескольким причинам: 1) TLC на Алиэкспрессе точно поддельный, а этот – нет; 2) у DM автономный ШИМ со своим генератором частоты; 3) его можно было недорого купить в Москве, а не ждать посылки с Али. Ну и, конечно, было интересно самому научиться управлять чипом, а не использовать готовую библиотеку. Чипы сейчас в основном представлены в корпусе SSOP24, их несложно припаять на переходник.

Поскольку производитель тайваньский, к чипу написан на китайском английском, а значит, будет весело. Сперва смотрим на распиновку (Pin Connection), чтобы понять, к какой ноге что подключать, и описание пинов (Pin Description). 16 выводов:

Sink / Open-drain output – сток; источник втекающего тока; выход, в активном состоянии подключенный к земле, – светодиоды к драйверу подключаются катодами. Электрически это, конечно, никакой не «открытый сток» (open drain), но в даташитах такое обозначение для выводов в режиме стока встречается часто.

Между пином REXT и землей устанавливается референсный резистор, контролирующий внутреннее сопротивление выходов, см. график на стр. 9 даташита. В DM634 этим сопротивлением можно также управлять программно, устанавливая общую яркость (global brightness); в этой статье вдаваться в подробности не буду, просто поставлю сюда резистор на 2.2 – 3 кОм.

Чтобы понять, как управлять чипом, посмотрим на описание интерфейса устройства:

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

Latch – задвижка/защелка/фиксатор.Rising edge – передний фронт импульсаMSB first – старшим (крайним левым) битом вперед.to clock data – передавать данные последовательно (побитно).

Слово latch часто встречается в документации к чипам и переводится разнообразно, поэтому для понимания позволю себе

LED-драйвер – по сути сдвиговый регистр. «Сдвиг» (shift) в названии – побитное перемещение данных внутри устройства: каждый новый засунутый внутрь бит пихает всю цепочку перед собой вперед. Поскольку во время сдвига никто не хочет наблюдать хаотичное мигание светодиодов, процесс происходит в буферных регистрах, отделенных от рабочих заслонкой (latch) – это своего рода предбанник, где биты выстраиваются в нужную последовательность. Когда все готово, заслонка открывается, и биты отправляются работать, заменяя предыдущую партию. Слово latch в документации к микросхемам почти всегда подразумевает такую заслонку, в каких бы сочетаниях оно ни использовалось.

Итак, передача данных в DM634 осуществляется так: выставляем вход DAI в значение старшего бита дальнего светодиода, дергаем DCK вверх-вниз; выставляем вход DAI в значение следующего бита, дергаем DCK; и так далее, пока все биты не будут переданы (clocked in), после чего дергаем LAT. Это можно сделать вручную (bit-bang), но лучше воспользоваться специально под это заточенным интерфейсом SPI, благо он представлен на нашем STM32 в двух экземплярах.

Семейства

Существует 3 семейства stm8.

  1. stm8s – “стандартные” контроллеры общего применения, обычно 10 битная аналоговая периферия, среднее по современным стандартам энергопотребление. Диапазон питания – 2.95 – 5.5в
  2. stm8l – “low-power” контроллеры с низким потреблением, 12 битный аналог, улученная электромагнитная совместимость. Диапазон питания – 1.8-3.6в. По сравнению со стандартными контроллерами, тут добавляется небольшая кучка периферии, в частности, DMA.
  3. stm8a – “автомобильные” – все сосредоточено на безопасности и CAN’е. Котроллеры выдерживают больше издевательств над ножками, чем обычные, работают при 145 градусах,   Диапазон питания – 2.95 – 5.5в

Putting it all together

We have enough building blocks — now it’s time to put them together into some ‘real-world’ application. For this demo I picked up MMA8452 3-axis I2C accelerometer and a standard HD44780 1602 LCD, which is extremely popular among electronics enthusiasts for some reason.

The demo application will calculate inclination angle based on accelerometer readings and output it to the LCD. Calculating inclination angle will require some trigonometry and floating point arithmetic, which will consume a good amount of resources. Despite the floating point operations being quite slow, STM8 managed this task decently.

You might have noticed the lack of contrast adjustment potentiometer. The LCD module that I’m using is rated for 5V, however my setup uses 3.3V supply. I couldn’t be bothered with a separate supply for the display, so I cheated: the LCD is initialized in 1-line mode, which results in 1/8 duty cycle, and pin is tied to ground.