STM Урок 70. HAL. LTDC. Вывод текста. Часть 1



 

Урок 70

 

Часть 1

 

HAL. LTDC. Вывод текста

 

Продолжаем изучать интерфейс LTDC.

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

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

Проект, соответственно, будет сделан из проекта предыдущего урока, так как весь накопленный нами опыт не должен потеряться, поэтому сделаем мы его из проекта LTDC_DMA2D. Назовём мы его согласно нашей теме — LTDC_TEXT.

Ничего в настройках мы не трогаем.

Так как я попробовал поработать со шрифтами в среде разработки Keil и обнаружил, что проект из-за своего размера у нас уже не соберётся ибо превышает халявный размер — 32 килобайта, о чём я на своих прежних лекциях уже предупреждал, поэтому не зря мы в своё время позанимались и в принципе освоили бесплатную среду программирования System WorkBench, которую мы сегодня и будем использовать. Причём я даже больше скажу. В последнее время она мне даже больше стала нравиться, нежели Keil. Меньше тормозов при сборке проекта и ещё кое-какие есть свои там прелести, с которыми, я думаю, мы столкнёмся. Поэтому зайдём в настройки проекта и включим там среду SW4STM32

 

image00

 

Сохраним настройки, нажав в данном диалоге кнопку «OK». Затем сгенерируем проект. Кстати, теперь можно проект открывать прямо из диалога, также, как и для Keil. Хотя я так не делаю, так как присутствует некоторое торможение. Поэтому мы закроем данный диалог и также импортируем проект в среде, как и раньше.

А вот и первый плюс WorkBench. Нам не нужно подключать файлы нашей библиотеки в дерево проекта, как в Keil. Попробуем собрать проект.

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

Затем можно будет отладку остановить, и после этого проект уже будет нормально стартовать обычным Run.

 

 

Теперь из репозитория Cube MX по пути «[Диск]:Users[Имя пользователя]STM32CubeRepositorySTM32Cube_FW_F7_V1.6.1UtilitiesFonts» возьмём файлы с массивами для шрифтов с расширением «c» и скопируем их в наш проект в папку «Src«,а затем также их подключим в дерево проектов в самом проекте, а файл fonts.h скопируем в папку Inc.

Перейдём в файл ltdc.h и подключим там файл

 

#include <stdlib.h>

#include "fonts.h"

 

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

 

#define convert24to32(x) (x|0xFF000000)

//------------------------------------------

#define LCD_COLOR_BLUE ((uint32_t)0xFF0000FF)

#define LCD_COLOR_GREEN ((uint32_t)0xFF00FF00)

#define LCD_COLOR_RED ((uint32_t)0xFFFF0000)

#define LCD_COLOR_CYAN ((uint32_t)0xFF00FFFF)

#define LCD_COLOR_MAGENTA ((uint32_t)0xFFFF00FF)

#define LCD_COLOR_YELLOW ((uint32_t)0xFFFFFF00)

#define LCD_COLOR_LIGHTBLUE ((uint32_t)0xFF8080FF)

#define LCD_COLOR_LIGHTGREEN ((uint32_t)0xFF80FF80)

#define LCD_COLOR_LIGHTRED ((uint32_t)0xFFFF8080)

#define LCD_COLOR_LIGHTCYAN ((uint32_t)0xFF80FFFF)

#define LCD_COLOR_LIGHTMAGENTA ((uint32_t)0xFFFF80FF)

#define LCD_COLOR_LIGHTYELLOW ((uint32_t)0xFFFFFF80)

#define LCD_COLOR_DARKBLUE ((uint32_t)0xFF000080)

#define LCD_COLOR_DARKGREEN ((uint32_t)0xFF008000)

#define LCD_COLOR_DARKRED ((uint32_t)0xFF800000)

#define LCD_COLOR_DARKCYAN ((uint32_t)0xFF008080)

#define LCD_COLOR_DARKMAGENTA ((uint32_t)0xFF800080)

#define LCD_COLOR_DARKYELLOW ((uint32_t)0xFF808000)

#define LCD_COLOR_WHITE ((uint32_t)0xFFFFFFFF)

#define LCD_COLOR_LIGHTGRAY ((uint32_t)0xFFD3D3D3)

#define LCD_COLOR_GRAY ((uint32_t)0xFF808080)

#define LCD_COLOR_DARKGRAY ((uint32_t)0xFF404040)

#define LCD_COLOR_BLACK ((uint32_t)0xFF000000)

#define LCD_COLOR_BROWN ((uint32_t)0xFFA52A2A)

#define LCD_COLOR_ORANGE ((uint32_t)0xFFFFA500)

#define LCD_COLOR_TRANSPARENT ((uint32_t)0xFF000000)

//------------------------------------------

 

 

Также добавим две структуры для настройки вывода текста

 

#define LCD_COLOR_TRANSPARENT ((uint32_t)0xFF000000)

//------------------------------------------

typedef struct

{

  uint32_t TextColor;

  uint32_t BackColor;

  sFONT *pFont;

}LCD_DrawPropTypeDef;

//------------------------------------------

typedef enum

{

  CENTER_MODE = 0x01, /* Center mode */

  RIGHT_MODE = 0x02, /* Right mode */

  LEFT_MODE = 0x03 /* Left mode */

}Text_AlignModeTypdef;

//------------------------------------------

 

Теперь перейдём в файл ltdc.c и добавим там переменную типа нашей добавленной структуры

 

uint16_t Y_SIZE =272;

LCD_DrawPropTypeDef lcdprop;

 

Затем, например после функции TFT_DrawLine добавим функцию первичной инициализации вывода текста

 

//----------------------------------------

void TFT_FontsIni(void)

{

  lcdprop.BackColor=LCD_COLOR_BLACK;

  lcdprop.TextColor=LCD_COLOR_GREEN;

  lcdprop.pFont=&Font16;

}

//----------------------------------------

 

Далее добавим ещё три функции для назначения шрифта, цвета шрифта и цвета фона вокруг символа

 

//----------------------------------------

void TFT_SetFont(sFONT *fonts)

{

  lcdprop.pFont=fonts;

}

//----------------------------------------

void TFT_SetTextColor(uint32_t color)

{

  lcdprop.TextColor=color;

}

//----------------------------------------

void TFT_SetBackColor(uint32_t color)

{

  lcdprop.BackColor=color;

}

//----------------------------------------

 

Добавим глобальную переменную

 

LCD_DrawPropTypeDef lcdprop;

const uint8_t *ch;

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

 

//--------------------------------------------------------------

void TFT_DrawChar(uint16_t x, uint16_t y, const uint8_t c)

{

  uint32_t i = 0, j = 0;

  uint16_t height, width;

  uint8_t offset;

  uint8_t *pchar;

  uint32_t line;

}

//--------------------------------------------------------------

 

 

Посчитаем смещение символа в массиве шрифта

 

uint32_t line;

ch = &lcdprop.pFont->table[(c-' ') * lcdprop.pFont->Height * ((lcdprop.pFont->Width + 7) / 8)];

 

 

Сохраним высоту и ширину шрифта в пикселях в переменные

 

ch = &lcdprop.pFont->table[(c-' ') * lcdprop.pFont->Height * ((lcdprop.pFont->Width + 7) / 8)];

height = lcdprop.pFont->Height;

width = lcdprop.pFont->Width;

 

Посчитаем смещение в памяти

 

width = lcdprop.pFont->Width;

offset = 8 *((width + 7)/8) - width ;

 

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

 

 

Предыдущий урок Программирование МК STM32 Следующая часть

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM HAL. LTDC. Вывод текста

4 комментария на “STM Урок 70. HAL. LTDC. Вывод текста. Часть 1
  1. Ан:

    Подскажите, откуда берутся файлы ltdc.h и ltdc.c?

    • Здравствуйте!
      Мы не создаём проекты заново, а пользуемся старыми, чтобы не тратить время на написание того же кода. Поэтому смотрите цикл по LTDC сначала. По всей видимости, Вы сразу прыгнули в какой-то урок или смотрите сначала, но что-то пропустили.

  2. Юрий:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*