Поделки на stm32f103c8t6 с lcd экраном

Добавил пользователь Владимир З.
Обновлено: 19.09.2024

Основные возможности таймеров

Кто в теме и знает возможности таймеров в AVR думаю поймут какие преимущества дает STM32. И они не ограничиваются таймерами. Контроллер прерываний поддерживает так называемые вложенные прерывания и позволяет более приоритетному прерыванию, прервать выполнение менее приоритетного, что позволяет не пропустить и обработать важные прерывания. Во многих случаях вместо прерываний от периферии возможно использование DMA (по русски ПДП - прямой доступ к памяти) который копирует данные из периферии в память или наоборот. Таким образом можно принимать и передавать данные по интерфейсам USART, SPI, I2C и др. максимально быстро и без "лишних" прерываний.
Система тактирования намного гибче чем у ATmega328.
Тактирование STM32F103C8T6 Clock. STM32 - замена Arduino. Автоматика. Программно можно выбрать источник тактирования - внутренний RC генератор HSI или внешний кварцевый. Присутствует умножитель частоты и несколько делителей, которые позволяют индивидуально задать частоты тактирования различных блоков МК, таких как ядро, периферийные шины APB1 и APB2, блоки USB и ADC (АЦП). Этим можно программно управлять во время работы МК, а не как у AVR где конфигурация задается фьюзами при прошивке.
Предусмотрена защита от сбоев работы внешнего кварцевого генератора и в случае нестабильной работы или вовсе прекращения, тактирование автоматически переключается на встроенный RC генератор HSI.
В микроконтроллер встроены часы реального времени (RTC) с возможностью тактирования от внешнего кварца с частотой 32768 Гц или внутреннего RC генератора LSI. У МК имеется специальный вывод для подключения батарейки питающей часы при отсутствии основного напряжения.

Разрабатывать программу можно в Arduino IDE, но как я написал выше, при этом не совсем рационально используются ресурсы микроконтроллера. Гораздо лучше разрабатывать программу в одной из IDE для STM32, позволяющей использовать библиотеки функций от STMicroelectronics.
Сперва я выбрал mikroBasic который показался мне простым и понятным (просто знаю бейсик), но как выяснилось, это не намного лучше Arduino IDE. Затем пробовал Keil, TrueSTUDIO, CooCox, EmBitz и др.
Наиболее простая и понятная IDE для начала на мой взгляд это EmBitz. Это простая и логичная среда, которая добавляет в проект все необходимые файлы включая библиотеки CMSIS и SPL. Остается только открыть файл main.с и написать код программы. В других перечисленных IDE с этим сложнее.

Дистрибутив EmBitz можно скачать с официального сайта. Устанавливается как любая другая программа и особенностей нет.

Ряд окон, появляющихся при первом запуске Необходимо выбрать первую строку с компилятором EmBitz.
Embitz_compiler. STM32 - замена Arduino. Автоматика.

Выбор файловых ассоциаций. Можно оставить вариант по умолчанию и файлы с EmBitz ассоциироваться не будут.
Embitz_fileassociate. STM32 - замена Arduino. Автоматика.
Чтобы начать разработку программы, следует создать проект.
Основные этапы создания проекта Сначала нужно приступить к созданию проекта.
Embitz_project_1. STM32 - замена Arduino. Автоматика.

Следует выбрать тип микроконтроллеров STMmicro-ARM и нажать GO.
Embitz_project_2. STM32 - замена Arduino. Автоматика.

В следующем окне нужно задать имя проекта и место размещения на диске.
Embitz_project_3. STM32 - замена Arduino. Автоматика.

Далее выбирается компилятор и настраиваются конфигурации. Нужно оставить то что по умолчанию и перейти к следующему шагу.
Embitz_project_4. STM32 - замена Arduino. Автоматика.

После нужно выбрать семейство МК. В данном случае это Cortex_M3 поскольку такое ядро у STM32F103C8T6.
Embitz_project_5. STM32 - замена Arduino. Автоматика.

После выбираем серию STM32F10x.
Embitz_project_6. STM32 - замена Arduino. Автоматика.

Далее в списке нужно выбрать STM32F103C8 или STM32F103CB. Они отличаются только размером памяти программ (64 и 128 КБ), но поскольку реально в C8 содержится 128 КБ, то разницы нет что выбрать.
Embitz_project_7. STM32 - замена Arduino. Автоматика.

В завершении создания проекта появятся несколько окон настройки отладки. Нужно оставить по умолчанию и закрыть окна кнопкой OK.
Embitz_project_8. STM32 - замена Arduino. Автоматика.
После создания проекта можно начать работу, открыв файл main.с где есть минимально необходимая часть кода.
Embitz_main. STM32 - замена Arduino. Автоматика.

Проект можно скомпилировать и принеобходимости запустить отладку (на скриншоте показаны кнопки панели инструментов производящие эти действия). Выполнение программы начинается с функции main, точнее перед этим выполняется очистка оперативной памяти и настройка тактирования так чтобы при частоте внешнего кварцевого генератора 8 МГц, частота ядра была номинальной и составляла 72 МГц.
Подробнее о том как это происходит Проще всего отследить последовательность выполнения программы аппаратным отладчиком ST-Link или подобным. Следует соединить плату с отладчиком через интерфейс SWD, подключить отладчик к USB порту компьютера и запустить отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов).
Если все сделано правильно, появится окно с таким содержимым.
Embitz_init_1. STM32 - замена Arduino. Автоматика.

А после в IDE откроется файл startup_stm32f10x_md.S в котором отобразится текущая выполняемая строка с ассемблерным кодом, выполняемым при старте или сбросе микроконтроллера.
Embitz_init_2. STM32 - замена Arduino. Автоматика.

Чуть ниже расположен вызов функции SystemInit.
Embitz_init_3. STM32 - замена Arduino. Автоматика.

Нажав на F11 на клавиатуре можно выполнить ассемблерную инструкцию и перейти в функцию (откроется файл system_stm32f10x.c).
Embitz_init_4. STM32 - замена Arduino. Автоматика.

В функции производится инициализация и конфигурация системы тактирования микроконтроллера. В этой же функции вызывается функция SetSysClock.
Embitz_init_5. STM32 - замена Arduino. Автоматика.

В ней вызывается одна из функций настраивающая умножитель на требуемую частоту, в данном случае SetSysClockTo72 для настроки на 72 МГц.
Embitz_init_6. STM32 - замена Arduino. Автоматика.

Теперь произведем отладку этой программы. К боковому разъему SWD платы следует подключить аппаратный отладчик ST-Link.
Это выглядит так Stm32_st_link. STM32 - замена Arduino. Автоматика. Далее подключаем отладчик к USB порту компьютера и запускаем отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов). Перед этим обязательно в выпадающем списке на панели инструментов должна быть выбрана конфигурация Debug и скомпилирован проект, потому что при выборе конфигурации Release из-за оптимизации кода будет нарушено соответствие номеров строк кода и скомпилированной прошивки.
По умолчанию выполнение программы начнется с ассемблерного файла startup_stm32f10x_md.S поскольку в нем располагается код выполняющийся сразу после сброса. Это не всегда удобно и чтобы отладчик останавливал программу (устанавливал скрытую точку останова) в начале функции main, следует открыть окно Debug interfase options (меню Debug -> Interfases) и для конфигурации Debug отметить Run to main().
Debug_interfase_options. STM32 - замена Arduino. Автоматика.

Отладка программы После запуска отладки программа в микроконтроллере начнет выполнятся под управлением отладчика и автоматически будет остановлена на первой строке кода в функции main. Желтая стрелка между номерами строк и кодом, показывает текущую выполняемую строку.
Embitz_debug_1. STM32 - замена Arduino. Автоматика.

Если несколько раз нажать на кнопку F10 дойдя до функции GPIO_Init и навести курсор мышки на структуру Init, то можно увидеть ее тип, адрес в памяти и содержимое полей.
Embitz_debug_2. STM32 - замена Arduino. Автоматика.

Более подробно о назначении кнопок клавиатуры, используемых при отладке можно увидеть в меню Debug.
Embitz_debug_3. STM32 - замена Arduino. Автоматика.

Далее нажимая кнопку F10 можно дойти до цикла while и при выполнении функции GPIO_SetBits светодиод будет гаснуть, а при выполнении GPIO_ResetBits начинать светится.

Сборка проекта и заливка прошивки в микроконтроллер В списке конфигураций на панели инструментов нужно выбрать Release и пересобрать проект.

compile.jpg STM32 - замена Arduino

compile.jpg STM32 - замена Arduino. Автоматика.

При отсутствии ошибок внизу окна будет показана информация о сборке.

compile_log_2.jpg STM32 - замена Arduino

compile_log_2.jpg STM32 - замена Arduino. Автоматика.

LCD и STM32

В уроке расскажу об использовании совместно с контроллерами STM32 знакосинтезирующих жидкокристаллических (LCD) дисплеев. Представлю свою библиотеку для управления ими.

Речь идет о LCD дисплеях с управляющими контроллерами HD44780 или совместимыми с ними (SPLC780, KS0066 и подобными).

На рынке существует громадное число разнообразных дисплеев этого класса. Они имеют разную организацию отображаемой информации. Мне известны дисплеи с форматами от 1 строка 8 символов до 4 строки 40 символов. Но при этом у всех LCD дисплеев практически одинаковые параметры, одни и те же сигналы интерфейса и команды.

Достаточно подробно об этом я писал в уроке 23 Ардуино. Там есть справочная информация, описаны сигналы подключения к микроконтроллеру. Не буду повторяться.

Аппаратное подключение LCD дисплея к плате STM32.

Я буду использовать в примерах урока индикатор WH2004A (4 строки по 20 символов) в четырех битном режиме обмена.

Схема подключения к плате STM32 выглядит так.

Схема подключения LCD к STM32

Я выбрал первые попавшиеся выводы из разных портов, пропуская те, что уже заняты кнопкой, светодиодом и UART1. Дисплей питается от 5 В, значит выводы должны быть толерантными к 5 В.

О назначении резисторов можно почитать в уроке 23 Ардуино.

Дисплей я припаял к отладочной плате из предыдущих уроков.

LCD и STM32

Теперь есть все, чтобы использовать его в программе.

Библиотека LCD780.

Я разработал библиотеку для управления LCD дисплеями. Как мне кажется, работать с ней очень удобно.

Библиотека LCD780 предназначена для управления знакосинтезирующими LCD дисплеями с контролерами HD44780 и совместимыми с ними.

Интерфейс подключения дисплея к STM32 – параллельный в 4х битном режиме. Я посчитал, что необходимости в 8ми битном подключении нет. Зачем тратить для связи с индикатором 10 выводов, когда можно обойтись шестью.

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

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

Временные задержки, необходимые для сигналов связи с дисплеем, рассчитываются с учетом тактовой частоты STM32. Используется библиотека DelayDWT.

Поддерживаются разные форматы дисплеев (число строк, число символов).

Может быть включен режим поддержки кириллических символов.

Используются следующие команды-функции:

  • Инициализация дисплея.
  • Вывод символа с заданным кодом.
  • Вывод массива символов.
  • Вывод на экран числа uint32_t с выбранной системой исчисления.
  • Вывод на экран числа int32_t с выбранной системой исчисления.
  • Вывод текстовой строки.
  • Вывод числа float с выбранным количеством разрядов после запятой.
  • Очистка экрана.
  • Перемещение курсора в начало экрана.
  • Установка курсора в заданную позицию.
  • Выключение и включение дисплея.
  • Выключение и включение отображения курсора.
  • Выключение и включение режима мигания курсора.
  • Установка направления сдвига при печати символов.
  • Выключение и включение автопрокрутки.
  • Создание пользовательского символа.
  • Запись байта в контроллер дисплея.

Несмотря на обилие функций и широкие функциональные возможности библиотека компактная. Она занимает менее 2 кбайт программной памяти.

Библиотеку можно загрузить по ссылке LCD780.

Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Я буду рассказывать о функциях библиотеки и одновременно демонстрировать ее работу на примерах.

Я создал проект Lesson25_1, в котором конфигурировал только систему тактирования на частоту 72 мГц. Все остальные установки сделает библиотека при инициализации.

Еще необходимо создать в проекте папку Libraries и копировать в нее папки с библиотеками LCD780 и DelayDWT.

В Atollic TrueStudio:

  • Правой кнопкой мыши нажимаем на папку LCD780 в проекте, Add/Remove Include Path -> OK
  • Ту же операцию повторяем с папкой DelayDWT.
  • Правой кнопкой по Libraries, Properties -> C/C++ General -> Paths and Symbols -> Source Location -> Add Folder -> Apply

Теперь можно работать с функциями библиотеки.

Функции библиотеки LCD780.

void init_LCD( GPIO_TypeDef *GPIOx_RS, uint16_t GPIO_Pin_RS, GPIO_TypeDef *GPIOx_EN, uint16_t GPIO_Pin_EN, GPIO_TypeDef *GPIOx_D4, uint16_t GPIO_Pin_D4, GPIO_TypeDef *GPIOx_D5, uint16_t GPIO_Pin_D5, GPIO_TypeDef *GPIOx_D6, uint16_t GPIO_Pin_D6, GPIO_TypeDef *GPIOx_D7, uint16_t GPIO_Pin_D7, uint8_t col, uint8_t row, uint8_t cirill)

Инициализация дисплея. Параметры:

  • GPIO_TypeDef *GPIOx_RS, uint16_t GPIO_Pin_RS – порт и вывод сигнала RS;
  • GPIO_TypeDef *GPIOx_EN, uint16_t GPIO_Pin_EN – порт и вывод сигнала EN;
  • GPIO_TypeDef *GPIOx_D4, uint16_t GPIO_Pin_D4 – порт и вывод сигнала D4;
  • GPIO_TypeDef *GPIOx_D5, uint16_t GPIO_Pin_D5 – порт и вывод сигнала D5;
  • GPIO_TypeDef *GPIOx_D6, uint16_t GPIO_Pin_D6 – порт и вывод сигнала D6;
  • GPIO_TypeDef *GPIOx_D7, uint16_t GPIO_Pin_D7 – порт и вывод сигнала D7;
  • uint8_t col – число символов в строке;
  • uint8_t row – число строк;
  • uint8_t cirill – признак поддержки кириллических символов.

Функция должна вызываться до работы с дисплеем. До функции инициализации необходимо разрешить тактирование используемых портов и инициализировать библиотеку DelayDWT.

Перед циклом while добавляем в проект

// инициализация дисплея
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN ;
initDelayDwt();
init_LCD(GPIOA, 1

Выводы я определил в соответствии со схемой урока. Дисплей у меня 4 строки по 20 символов. Включил поддержку кириллических символов.

void write_LCD(uint8_t valChar)

Выводит на экран символ с кодом, заданным в параметре uint8_t valChar .

Следующий код напечатает ”Проверка дисплея!”.

LCD и STM32

void writeBuf_LCD(uint8_t * buf, uint16_t length)

Вывод массива символов на экран.

  • uint8_t * buf – указатель на массив.
  • uint16_t length – количество символов.

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

uint8_t str[] = "Проверка дисплея!";
writeBuf_LCD(str, 17);

void print_uint_LCD(uint32_t n, uint8_t base)

Выводит текстовое представление беззнакового целочисленного числа в заданной системе исчисления.

  • uint32_t n – число.
  • uint8_t base – основание системы исчисления.

Следующий код печатает в цикле числа от 0 в десятичной, двоичной и шестнадцатеричной системах исчисления.

LCD и STM32

void print_int_LCD(int32_t n, uint8_t base)

Выводит текстовое представление знакового целочисленного числа в заданной системе исчисления. Аналог предыдущей функции, только с учетом знака числа.

  • int32_t n – число.
  • uint8_t base – основание системы исчисления.

void print_float_LCD(float number, uint8_t digits)

Вывод числа float в текстовом виде.

  • float number – число.
  • uint8_t digits – количество знаков после запятой.

Программа выводит числа с плавающей запятой.

print_float_LCD(3.1415926, 5);
write_LCD(' ');
print_float_LCD(3.1415926, 1);
write_LCD(' ');
print_float_LCD(-3256.123, 2);

LCD и STM32

void print_str_LCD(const uint8_t str[])

Печатает текстовую строку. Конец строки определяется байтом 0.

uint8_t str[] = "Проверка print_str\0";
print_str_LCD(str);

LCD и STM32

void clear_LCD(void)

Очищает экран, курсор устанавливает в верхнюю левую позицию.

void home_LCD(void);

Курсор устанавливает в верхнюю левую позицию.

void setCursor_LCD(uint8_t col, uint8_t row)

Устанавливает курсор в заданную позицию.

  • uint8_t col – позиция в строке, начиная с 1.
  • uint8_t row – номер строки, начиная с 1.

Следующий код выводит число в заданной позиции, увеличивая его в цикле.

print_str_LCD("Число в строке 4");
setCursor_LCD(1, 2);
print_str_LCD("в позиции 10");
for( uint16_t i=0; ; i++)
setCursor_LCD(10, 4);
print_uint_LCD(i, 10);
HAL_Delay(1000);
>

LCD и STM32

void noDisplay_LCD()

void display_LCD()

print_str_LCD("Проверка выключения");
HAL_Delay(1000);
noDisplay_LCD();
HAL_Delay(1000);
display_LCD();

void cursor_LCD()

Включение отображения курсора.

void noCursor_LCD()

Выключение отображения курсора.

После инициализации библиотеки курсор не отображается на экране. Этими 2мя функциями можно включить и отключить его.

cursor_LCD();
print_str_LCD("Проверка курсора");

LCD и STM32

void blink_LCD()

Включение мигания курсора.

void noBlink_LCD()

Выключение мигания курсора.

Можно включить и отключить мигание знакоместа курсора.

void scrollDisplayLeft_LCD()

Сдвиг информации на экране влево.

void scrollDisplayRight_LCD()

Сдвиг информации на экране вправо.

Можно сдвигать текст на экране влево и вправо. Следующая программа 2 раза сдвигает текст вправо, а затем возвращает его назад.

print_str_LCD("Проверка сдвига");
HAL_Delay(1000);
scrollDisplayRight_LCD();
HAL_Delay(1000);
scrollDisplayRight_LCD();
HAL_Delay(1000);
scrollDisplayLeft_LCD();
HAL_Delay(1000);
scrollDisplayLeft_LCD();

void leftToRight_LCD()

Вывод символов слева направо.

void rightToLeft_LCD()

Вывод символов справа налево.

По умолчанию символы печатаются слева направо. Так мы пишем. Но можно изменить на противоположное направление. Даже не могу предположить, кому это может потребоваться. Следующий код выводит символы с 10 позиции справа налево.

LCD и STM32

void autoscroll_LCD()

void noAutoscroll_LCD()

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

void createChar_LCD(uint8_t location, uint8_t charmap[])

Функция позволяет создать пользовательский символ.

  • uint8_t location – код символа (0…7).
  • uint8_t charmap[] – массив пикселей символа (5x8).

Следующий код задает и выводит новый символ – ”рожицу”.

createChar_LCD(1, smile); // создаем символ
clear_LCD();
print_str_LCD("Новый символ: ");
write_LCD(1);

LCD и STM32

void writeByte_LCD(uint8_t dt)

Запись байта в контроллер дисплея. Функция может быть использована для реализации пользовательских команд.

Все примеры урока есть в этом проекте.

Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!

Библиотека LCD780 не использует объектно-ориентированные возможности программирования. Ее можно применять в обоих вариантах языка: С и C++. Скорее это положительное свойство. Я специально создавал не объектно-ориентированный вариант библиотеки.

Но планирую сделать и ООП-вариант библиотеки. Конечно, если у меня до этого ”дойдут руки” или ”голова”. Постараюсь.


Я покажу вам некоторые важные функции этой платы, как настроить существующую среду Arduino для работы с этой платой, а также написать первую программу, которая является ничем иным, как, как вы уже догадались, Blink. Итак, начнем.

Вступление

В последнее десятилетие Arduino стала платформой для быстрого создания прототипов, хобби-проектов или в качестве платы отладки для начинающих радиолюбителей. Но мы все знаем об ограничениях платы Arduino. Давайте обсудим Arduino UNO, так как это самый популярный Arduino.

Эта плата медленная, работает на частоте 16 МГц, имеет очень ограниченное внутреннее оборудование и не имеет достаточной вычислительной мощности, ОЗУ и Flash для запуска приложения на основе FreeRTOS (теоретически вы можете запустить FreeRTOS на Arduino, но это не практично).

Альтернативой Arduino является плата разработки на основе микроконтроллера STM32F103C8T6, которую часто называют Blue Pill. Этот микроконтроллер основан на архитектуре ARM Cortex-M3 производства STMicroelectronics.

STM32F103C8T6 является очень мощным микроконтроллером и с 32-разрядным процессором легко может превзойти по производительности Arduino UNO. В качестве дополнительного бонуса вы можете легко запрограммировать эту плату, используя вашу Arduino IDE (хотя и с некоторыми хитростями и дополнительным программатором, например конвертером USB в U (S) ART).

Краткая заметка о плате разработки STM32F103C8T6

На следующем рисунке показана лицевая и задняя стороны типичной платы Blue Pill STM32. Как видите, макет платы очень прост, и некоторые могут даже спутать ее с Arduino Nano.


Важной особенностью этих плат является то, что они очень дешевы, дешевле, чем клонированная версия Arduino UNO. Я получил эту плату примерно за 2,5 доллара в местном магазине электроники. Таким образом, это, очевидно, клонированная версия (возможно, поддельный микроконтроллер STM32). На рынке доступно много клонированных версий этой платы.



Особенности платы

  • Она содержит основной микроконтроллер — STM32F103C8T6.
  • Кнопка сброса — для сброса микроконтроллера.
  • Порт microUSB — для последовательной связи и питания.
  • Перемычки выбора BOOT — перемычки BOOT0 и BOOT1 для выбора загрузочной памяти.
  • Два светодиода — пользовательский светодиод и индикатор питания.
  • Кварц на 8 МГц.
  • Кварц 32,768 кГц — часы RTC.
  • SWD Interface — для программирования и отладки с использованием ST-Link.
  • Стабилизатор питания 3,3 В — преобразует 5 В в 3,3 В для питания микроконтроллера.

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

Как видно из приведенного выше изображения, каждый вывод микроконтроллера STM32F103C8T6 может иметь несколько функций (но необходимо выбрать только одну). Также обратите внимание, что некоторые контактыввода / вывода допускают 5 В, что означает, что вы можете подключить 5 В совместимый ввод / вывод на эти контакты без каких-либо проблем.

Проблемы с STM32 Blue Pill Board

Если вы планируете купить более дешевую версию (вероятно, большинство из нас так и поступают), то есть некоторые известные проблемы с платами, о которых вы должны знать. Я собрал эти вопросы на разных форумах и сам столкнулся с некоторыми проблемами (связанными с USB).

  • Первым основным вопросом является стабилизатор напряжения 3,3 В. Хотя на некоторых платах использовались оригинальные регуляторы напряжения 3,3 В на LM1117 от TI, на большинстве дешевых плат разработки установлены не имеющие аналогов стабилизаторы напряжения. Эти стабилизаторы не имеют никакой тепловой защиты и легко выходят из строя. Решением является использование внешнего регулируемого источника питания, если у вас есть такая возможность.
  • Следующие две проблемы связаны с USB. Во-первых, качество пайки порта microUSB очень низкое, и если вы часто отсоединяете и вставляете кабель в этот порт, то существует высокая вероятность того, что разъем microUSB отсоединится от платы. Вы можете использовать горячий клей для усиления разъема.
  • Другой проблемой, связанной с USB, является использование неправильного подтягивающего резистора. Согласно справочному руководству MCU, USB D + (называемый USBDP) должен быть поднят до 3,3 В с использованием резистора 1,5 кОм. Но согласно схемам нескольких плат Blue Pill, все они используют резистор 10 кОм. Если вы планируете работать с передачей данных через USB, вы можете не получить точных результатов. Если вы хотите испровить это, тогда вы можете припаять резистор 1,8 кОм параллельно существующему резистору 10 кОм. Для этого подключите резистор 1,8 кОм между контактами A12 и 3,3 В.
  • Другие известные проблемы: очень трудно нажимать на кнопку сброса, аналоговое питание подключено к цифровому питанию, нет защиты диода Шоттки для USB и т. д.

Основные моменты STM32F103C8T6

Теперь, когда мы немного узнали о плате Blue Pill, давайте теперь разберемся с некоторыми важными особенностями самой платы, то есть микроконтроллера STM32F103C8T6. Как упоминалось ранее, этот микроконтроллер содержит 32-битное ядро ​​ARM Cortex-M3 с максимальной частотой 72 МГц.

Давайте теперь посмотрим, какие технические характеристики этого микроконтроллера реализованы на плате Blue pill.

Характеристики STM32F103C8T6

  • Память: содержит 64 Кбайт Flash и 20 Кбайт SRAM
  • GPIO Pins — 32 с возможностью внешнего прерывания
  • Таймеры — 3 16-битных таймера, 1 16-битный ШИМ-таймер
  • PWM Pins — 15
  • Аналоговый — 10 каналов 12-битного АЦП
  • I2C — 2 периферийных устройства I2C
  • USART — 3 периферийных устройства USART с аппаратным управлением
  • SPI — 2 SPI периферийных устройства
  • Другие периферийные устройства — USB 2.0 Full Speed, CAN 2.0B

Это некоторые из основных моментов, и если вы хотите узнать больше информации о периферийных устройствах, вам следует обратиться к datasheet (настоятельно рекомендуется).

В качестве дополнительной темы позвольте мне рассказать вам о маркировке, используемое в микроконтроллерах STM32 на примере STM32F103C8T6. Каждая буква в названии микроконтроллера обозначает особую характеристику:


Как использовать выводы BOOT ?

Как упоминалось ранее, контакты BOOT0 и BOOT1 микроконтроллера используются для выбора памяти, с которой он загружается. На следующем рисунке показаны три различных варианта загрузочных пространств на основе этих контактов:


Когда контакты BOOT0 и BOOT1 имеют НИЗКИЙ уровень, тогда внутренняя флэш-память выступает в качестве основного загрузочного пространства, а когда BOOT0 — ВЫСОКИЙ, а BOOT1 — низкий, системная память выступает в качестве основного загрузочного пространства. Эти два варианта важны для нас.

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

Загрузив в системную память, т. е. в bootloader ROM, вы можете перепрограммировать флэш-память в своем приложении, используя последовательный интерфейс USART1.

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

Если вы заметили, в обоих случаях, т.е. при выборе флэш-памяти и выборе системной памяти в качестве загрузочных пространств, вывод BOOT1 имеет НИЗКИЙ. Только BOOT0 переключается между LOW (флэш-память) и HIGH (системная память).

Для удобства, давайте назовем эти варианты загрузки как режим программирования и рабочий режим. Для режима программирования вывод BOOT0 устанавливается ВЫСОКИМ, а для режима работы вывод BOOT0 — НИЗКИМ (по умолчанию). В обоих режимах контакт BOOT1 остается НИЗКИМ.

Требования к оборудованию для проекта

Поскольку это наша вводная часть, и все, что мы будем делать, это мигать светодиодом (который уже присутствует на плате), нам не нужно много оборудования в отношении проекта и микроконтроллера.

Но для программирования микроконтроллера нам нужен модуль USB-последовательный преобразователь, такой как плата FTDI (или что-то подобное). Как упомянуто в разделе BOOT Pins, к загрузчику можно получить доступ с помощью контактов USART1 микроконтроллера для программирования флэш-памяти. И чтобы микроконтроллер мог обмениваться данными с USART1, нам необходим USB-последовательный преобразователь.

Список необходимых компонентов

  • STM32F103C8T6 на основе STM32 Blue Pill Development Board
  • Модуль преобразования USB в последовательный интерфейс (например, программатор FTDI)
  • Соединительные провода
  • ПК или ноутбук с ОС Windows и подключением к Интернету

ПРИМЕЧАНИЕ. У меня нет программатора в стиле FTDI, но есть конвертер USB в последовательный интерфейс более старого типа. Вы можете использовать любые модули USB to Serial Converter, если они имеют контакты VCC (5 В), GND, RX и TX.

Соединение

Для упрощения представления я использую FTDI, такой как USB to Serial Converter.

Соединения должны быть следующими:

STM32 Blue Pill — программатор FTDI

  • 5 В — VCC
  • GND — GND
  • A9 — RX
  • A10 — TX


Настройка Arduino IDE для STM32F103C8T6 Blue Pill


Если у вас уже есть несколько URL-адресов в этом разделе, вы можете добавить больше, разделив их запятой. Если вы работали с платами ESP8266, то вы, возможно, уже знакомы с этим процессом. После добавления URL нажмите ОК.

Это займет некоторое время, так как загрузит и установит некоторые необходимые файлы и инструменты. (Я сказал кое-что, потому что вам нужно скачать другой инструмент от STMicroelectronics, чтобы это работало).




Загрузка STM32CubeProgrammer

Итак, мы должны установить его вручную. Для этого перейдите на официальную страницу загрузки STM32CubeProgrammer, предоставленную STMicroelectronics, по следующей ссылке.

Нажмите на опцию Get Software, и вы попадете на страницу входа / регистрации. Я предлагаю вам зарегистрироваться в STMicroelectronics с действительным адресом электронной почты. После регистрации вы можете войти и загрузить программное обеспечение.

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


ПРИМЕЧАНИЕ. Это может быть либо Program Files, либо Program Files (x86) по указанному выше пути.

На этом завершается настройка программного обеспечения для Arduino IDE для программирования STM32 Blue Pill. Давайте приступим к написанию небольшой программы для мигания светодиода и загрузки ее в нашу плату STM32 Blue Pill.

Программа Blink для платы Blue Pill STM32F103C8T6

Убедитесь, что вы внесли необходимые изменения в IDE Arduino, как указано в предыдущем разделе (выбор правильной платы и т. д.). Как только это будет сделано, установите соединение между программатором FTDI (т. е. с USB Serial Converter) и платой STM32, как указано выше.

Напишите программу Blink следующим образом. Это похоже на скетч Arduino Blink, но вместо этого LED_BUILTIN я использовал PC13, так как светодиод подключен к этому выводу микроконтроллера.



Как только компиляция будет завершена, она автоматически вызовет инструмент STM32CubeProgrammer. Если все пойдет хорошо, IDE успешно запрограммирует плату STM32.


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

Вывод

Это было длинное руководство по началу работы с STM32 Blue Pill Board, т.е. STM32F103C8T6. Я обсудил некоторые важные функции платы, основные сведения о микроконтроллере, известные проблемы платы и способы их устранения, настройки Arduino IDE, загрузки необходимых инструментов, написания нашей первой программы для STM32 для Arduino Ide и, наконец, загрузки программы.

Дело было так, один из посетителей сайта выслал мне в качестве подарка 5 дюймовый TFT дисплей, который управляется драйвером SSD1963. Дней через десять посылка прибыла, но на коробке, в которую он был упакован, была вмятина, а сам дисплей был разбит. Написал об этом отправителю и он сразу же заказал на моё имя такой же дисплей на ebay, за что ему спасибо.
Прошло не более двух недель с момента заказа и вот дисплей у меня, подключать его к Atmega16, не имеет смысла, уж очень он большой(800x480 пикселей ), поэтому решил сразу подключить его к имеющейся у меня плате с STM32F103VET6 на борту, конечно же по FSMC.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .

Если кто не знаком с FSMC, советую к прочтению эту статью так, как далее не будет рассматриваться принцип работы шины и тонкости подключения.

Схему подключения взял из статьи указанной выше.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .

По питанию дисплея обязательно поставить электролит или тантал номиналом 10uF, зашунтировав его керамикой 0.1uF, иначе дисплей будет мерцать.

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

Прямая.
Функция рисует прямую линию, заданного размера и цвета по двум точкам.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .

Ещё для удобства были написаны две функции одна из которых рисует горизонтальную, вторая — вертикальную линию.


Прямоугольник.
Функции предназначены для рисования закрашенного и не закрашенного прямоугольника с заданными параметрами. У не закрашенного прямоугольника можно также указать толщину линий с помощью параметра size.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .


Окружность.
Функция позволяет рисовать закрашенную и не закрашенную окружность, отвечает за это параметр fill( 1 — закрашенная окружность, 0 — не закрашенная).

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .


Прямоугольник с закругленными краями.
Функции предназначены для рисования закрашенного и не закрашенного прямоугольника с закруглёнными краями.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .


Треугольник.
Функция рисует треугольник по трём точкам со сторонами заданной толщины и цвета.

Подключение TFT дисплея по FSMC к STM32, на примере SSD1963 .


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

Читайте также: