STM32 Nucleo. Подключаем TFT LCD на базе чипа ILI9341

image
На Хабре уже есть две публикации о платформе STM32 Nucleo и разработке в среде mbed.org. Это «обзор платформы» и «быстрый старт». Я же в данной публикации расскажу, как быстро подключить недорогой модуль TFT LCD на базе чипа ILI9341. Статья будет полезна и любителям Arduino, желающих перейти на более современные и мощные микроконтроллеры, используя уже накопленные знания.

Ознакомится с ценами на дисплей вы можете, например, на Ebay.
Я буду использовать плату NUCLEO-F401RE, вы же можете использовать любую из данной линейки.

Итак, вы уже ознакомились с двумя предыдущими статьями, поэтому сразу приступим к делу.

Открываем наш on-line compiler. Создаём новую программу.



Назовём её, например, ili9341_display_test.



Импортируем в наш проект официальную библиотеку mbed.



Находим и импортируем.



Проверяем, что импортируется в наш проект.



Таким же образом импортируем графическую библиотеку для нашего дисплея.

В поиске по запросу «ili9341» находим библиотеку от Peter Drescher.



Ещё нам понадобятся шрифты, импортируем так же, по запросу в поиске «TFT_fonts».



Тем, кто хочет использовать любой другой шрифт или разработать свой, есть в помощь программа GLCD font creator. Программа бесплатна, но для корректного импорта приходится шаманить, а это уже другая тема.

Теперь создадим главный файл, в котором будет наша программа.



Назовём его main.cpp.



Теперь у нас есть проект с двумя библиотеками, набором шрифтов и главным файлом программы.
Щелкаем мышью по main.cpp и пишем вставляем наш код.



А вот и код.

#include "mbed.h"                                       //включаем основную библиотеку mbed
#include "SPI_TFT_ILI9341.h"                            //включаем библиотеку нашего дисплея на чипе ili9341
#include "Arial28x28.h"                                 //включаем выбранный шрифт 
SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT");  // (mosi, miso, sck, cs, reset, dc)

int main()
{
    TFT.set_orientation(3);                             // выбираем ориентацию дисплея
    TFT.background(Blue);                               // выбираем цвет фона (можно словами)
    TFT.foreground(0xFFFF);                             // выбираем цвет шрифта (или в формате rgb565)
    TFT.cls();                                          // заливаем экран цветом фона
    TFT.set_font((unsigned char*) Arial28x28);          // выбираем наш шрифт
    TFT.locate(30, 100);                                // координаты начала текста (горизонталь, вертикаль)
    TFT.printf("Hello habrahabr.ru");                   // выводим на экран
}


Как же подключить дисплей? Да очень просто!
Заходим на страничку нашей платы (у меня это ST-Nucleo-F401RE).
Находим картинку Arduino-compatible Headers.



Это распиновка нашей платы с так знакомыми всем Arduino-любителям названиями пинов.
Находим контакты интерфейса SPI.
SCK — D13
MISO — D12
MOSI — D11
Ещё нам понадобятся контакты CS, reset, DC, я использовал соответственно D8, D9, D10.
В нашей программе это указывается в виде строки:

SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT");  // (mosi, miso, sck, cs, reset, dc)

Подключаем их к соответствующим контактам на нашем дисплее.
Так же дисплей необходимо подключить к питанию.
Я использовал VCC — +5v (на плате дисплея стоит стабилизатор на 3.3 вольта, если его замкнуть предусмотренной перемычкой, то можно использовать питание 3.3 вольта).
GND — GND
LED — подсветка, рассчитана на 3.3 вольта, поэтому подключаем к контакту +3.3v.
Логика дисплея работает от 3.3 вольт, как и наш микроконтроллер, поэтому использовать конвертер логических уровней, как в случае с arduino uno, нам не потребуется.

Теперь можно скомпилировать нашу программу, для этого в онлайн компиляторе жмём кнопку Compile и сохраняем полученный файл прямо на нашу плату (при подключенной плате у нас появляется съёмный носитель «NUCLEO»).
Если всё сделано верно, то увидим на экране надпись «Hello habrahabr.ru».

Полезные ссылки

Здесь вы найдёте примеры кода и использования, это официальная страница библиотеки SPI_TFT_ILI9341.
Здесь описаны функции работы с данной библиотекой, такие как построение линий, квадратов и прочего.
Здесь много полезной информации по mbed.

Have fun!
Поделиться публикацией
Комментарии 38
    0
    Ну вот только я соскочил с Ардуины на 32-х битные АРМы, так сразу же начинают снова на них заманивать печеньками)))

    Спасибо за публикацию. Надеюсь mbed будет набирать обороты, так как многие уже выросли из 8-и битной мейнстримовой ардуины но к 32-х битным АРМам еще не приросли.
      +1
      Хотя наверно печеньки эти надо попробовать.
      Вот только один вопрос у меня — вот Вы сказали, что можно брать для реализации подключения любую плату. Но у них ведь разные процы стоят. Например на Вашей Cortex M4 стоит. На NUCLEO-F030R8 Cortex M0. Это достаточно разные процы. И код без изменений будет работать на обоих? Когда я на я Keil-е писал код для подключения дисплея — программу приходилось переделывать. Переписывать драйвер подключения и т.д.
        0
        По идее они так и задумывали, один код работает на разных платформах (оф. поддерживаемых), библиотека mbed содержит все необходимые порты для каждой платы. То есть мой код заработает на любой из этих плат (только естественно нужно будет подправить кусок кода отвечающий за названия пинов и правильно соеденить с lcd).

        На мой взгляд mbed это такой ардуино для взрослых. STM даже линейку Nucleo сделало с разъёмом как на ардуино, плюс к этому поддержка в коде названий пинов типа A0, D13. Да и вообще, сделали функции типа AnalogIn\Out. И это всё тот же синтаксис С++, перейти с ардуино будет легко! )

        Вот и хорошо бы тему эту развивать, распространять, писать статьи для новичков и не только!
          0
          Ну так и давайте! Я на самом деле хоть на ардуину и ворчу но все равно переодически то там то здесь использую ее.
          Тема это очень интересная.

          Осталось только определится с тем какую Нуклео купить. Склоняюсь пока к L0, так как судя по некоторым описаниям это «убийца» MSP430 — в плане энергопотребления. А две обычных отладки F4 и F429(с дисплеем) уже есть.
            0
            Один только минус для меня — Иногда хочется свое устройство на ардуино самому спроектировать, сделать или заказать плату и т.д. В итоге максимум компактности и аутентичности. Паяется все легко и просто. А вот STM-овские процы впаивать и платы под них делать все таки посложней. Поэтому что то попроще начинаешь или на ардуине делать или на MSP430. Но это опять же наверно ворчание)))
              0
              Тут исходя из целей зависит. Если что-то не требующее компактности и быстро, использую да хоть ту же atmega8, всё-таки dip корпус и выводные компоненты намного проще паять, да и платы в домашних условиях делать легко, да и код быстренько в Arduino написать, порой устраивает. Но есть моменты когда производительности уже не хватает, например при работе с таким дисплеем. Обновление экрана занимает целую вечность, а ведь нужно ещё помимо вывода на экран что-либо обрабатывать. Вот тут уже на помощь приходит stm32. По сути отладочные платы для того и нужны, чтобы на них используя выбранный МК или компонент какой, что-либо спроектировать, обкатать, попробовать. А дальше рисуем схему, создаём печатную плату, отправляем заказ в Китай, получаем компактную платку. Согласен, паять smd посложнее, в смысле сноровка нужна, но получается намного быстрее! Раскидал на плату smd, прошелся феном, поставил чип и быстренько его микроволной. Отмыл и готово! С выводными же тоже возня, тут согни, тут отрежь, каждый вывод припаяй.
                0
                Да не, я DIP и выводные вообще не использую больше — места они всегда больше занимают и на плате и в шкафах коробки с этим барахлом.
                Купил семпл буки резисторов и керамики и всегда их использую и меги только в TQFP. Причем перешел на 0603 — все очень быстро и хорошо. Платы под них фоторезистом делаются быстрее чем ЛУТом даже. Но вот паять TQFP100 и более как то пока не очень. Сделал тут месяц назад плату под TQFP64 и впаял ее, пришлось все таки попотеть немного))
                Для мелких и средних проектов — много возни.
                А ведь прежде чем делать готовое устройство все равно нужно несколько прототипов сделать — а заказывать каждый прототип в Китае не выгодно. Нужна то одна плата, а платишь как за 10 да еще и жди их 3-4 недели. А Отладки — это очень здорово! Я под STM-овские даже уже свои шилды проектирую — просто кайф — одел, вот тебе GPRS модем, а рядом можно пристегнуть GPS.
        0
        я так подключал недавно к этой же плате TFT дисплей с параллельным портом.
        Единственное что мне не понравилось это дребезг резистивной тач-панели(хотя может быть я что-то не так считывал).
        Пришлось делать выборку и \з большого количества данных и использовать медианный фильтр на основе QuickSelect.

        0
        Я использовал VCC — +5v (на плате дисплея стоит стабилизатор на 3.3 вольта, если его замкнуть предусмотренной перемычкой, то можно использовать питание 3.3 вольта).
        Логика дисплея работает от 3.3 вольт, как и наш микроконтроллер, поэтому использовать конвертер логических уровней, как в случае с arduino uno, нам не потребуется.


        Где же вы были год назад. Я так надолбался с этими китайскими экранчиками, пытаясь понять почему ничего не работает :-) Всему виной конечно невнимательность, я далеко не сразу понял что в поставке «по умолчанию на ebay» их таки надо от +5V запитывать при логике 3.3V.
          0
          Год назад я сам стал свидетелем бурления интернета на эту тему, но у меня была платка freaduino, там был переключатель, выбирающий значение напряжения питания МК, 3.3v либо 5v.
          0
          А можно вместо нуклео с mbed использовать мапл?
            0
            по простому вроде нельзя, но все равно интересно.
              0
              Как вариант в он-лайн компиляторе mbed можно выбрать экспорт проекта в например Keil uVision, а уже в нём скомпилировать hex файл, и уже его прошить доступными для Вас методами.
            –8
            Какой ужас! Это что — эпидемия ардуйни?
              0
              От Arduino здесь лишь Arduino-compatible Headers.
                –6
                А жутчайшие библиотеки?
                Ē-моē, там еще и C++! Вы б еще пхытон запихали на микроконтроллер! Жуть!!!
                  +2
                  «А мужики то и не знали». Нет серьезно, вы знаете сколько С++ работает на эмбеддедах в продакшене?
                    –6
                    Я знаю, что извращенцев везде полно. Вон, некоторые даже жабку пытаются в МК запихать. И им пофиг, что вместо одного килобайта их код десятки килобайт занимает!
                    Ардуйня — такая ардуйня…
                      +3
                      Взгляните на современный С++, вы будете серьезно удивлены.
                        –7
                        С++ — для гуйни. Для нормальных задач этот говноязык непригоден.
                        Но, думаю, ардуйне это не понять.
                          +3
                          Ох, я надеюсь вы не летаете на самолетах с таким то подходом.
                            –6
                            К счастью, там не используют подобного шлака.
                              +4
                              Боюсь вас расстроить, но в авиации используют С++ на равне с С (и ada), в частности боинг использует С++ с vxworks. Автомобили? С++ как в эмбеддеде так и и в схемах контроля «самоуправляемых машин».
                    +2
                    Вы б еще пхытон запихали на микроконтроллер!

                    Как вам угодно, сэр: STM32 и Питон.
                      +1
                      А ведь питон это еще даже и ничего, еще и JS есть ;-)
                        +1
                        Я вот например скоро туда попробую mruby специально для embedded штук сделанный. Я его уже собрал для arm-none-eabi
                +1
                Если кому интересно серьезнее штуки с Nucleo, то есть ОС реального времени Nuttx (http://nuttx.org) и в ней уже есть готовые порты для Nucleo 401 и 411, с 411 пока не так все хорошо с частотами, но я постараюсь доделать этот порт.

                PS
                Nuttx это именно та ОС, на которой работает известный в узких кругах автопилот pixhawk, apm.
                  0
                  Кстати у mbed есть RTOS (Real-time Operating System)
                    0
                    Да, но мне показалось, что этот проект как-то заглох, и ничего на нем известного не выходило, а вот на Nuttx для stm32f4 есть этот интересный автопилот.

                    PS
                    Еще я знаю точно на этой плате работает ChibiOS, одна из самых известных RTOS сейчас.
                  0
                  А у вас случайно нет примера для работы с SD картой этого дисплея в mbed?
                    +1
                    По запросу «SD Card» довольно много примеров на самом mbed.
                    Вот например — developer.mbed.org/components/22-QVGA-display-with-SD-card-socket/ — такой дисплей?
                    Import Program и вперед, из комментариев к коду вроде все понятно
                      +1
                      #include "SDFileSystem.h"
                        // connect a sd-card to the second spi or use the local filesystem of the LPC   
                        SDFileSystem sd(p11, p12, p13, p14, "sd"); // mosi,miso,sck,cs
                        TFT.cls();
                        TFT.locate(10,110);
                        TFT.printf("Graphic from external SD-card");
                        int err = TFT.BMP_16(1,140,"/sd/test.bmp");  // load test.bmp from external SD-card
                        TFT.locate(10,120);
                        if (err != 1) TFT.printf(" - Err: %d",err);
                      


                      В самом конце...
                        0
                        Спасибо!
                          0
                          В этой библиотеке реализован DMA, только для трёх процессоров, к остальным автор предлагает дописать по аналогии. С dma намного по шустрее ))
                      0
                      То самое чувство когда знаешь что старался не зря =) Респект Автору =)
                        0
                        Спасибо! Подключил экран от Nokia 5110 к mbed F401. До этого бился с morpho-pins, почему то не получалось ни в каких вариантах.
                        Проверил на ардуино нано — экран работает.
                        Появились следующие вопросы:
                        — почему на pinout диаграмме два SPI1? Это опечатка у mbed?
                        — можно ли к D5/D4/D3 подключить еще SPI устройство? А на уже подключенный к D13/D12/D11 выводить статус и прочее?
                          0
                          Для удобства разводки печатной платы, интерфейс spi1 можно использовать на разных контактах.
                          Попробуйте программу MicroXplorer.
                            0
                            Посмотрел. Очень полезно, пригодится, спасибо!

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое