П`ятниця, 19.04.2024, 02:12
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Вересень 2016  »
ПнВтСрЧтПтСбНд
   1234
567891011
12131415161718
19202122232425
2627282930

Блог

Главная » 2016 » Вересень » 19 » STM32 HAL CubeMX & SPI. Дисплей TFT 1.8
19:29
STM32 HAL CubeMX & SPI. Дисплей TFT 1.8

Дисплей TFT 1.8, купив по випадку, в магазині Ворона. Та дисплей, чомусь був закинутий в "довгий ящик". Мабуть спочатку не до кінця розібрався з ініціалізацією...Ба, навіть думав запустити його до сміт'євого бачка, та все ж магазин серйозний..., і в кінці кінців цікавість взяла гору, крім того потрібно дисплей для одного проекта, з підтримкою кирилиці. Девайс, якщо "дригати ніжками" - доволі "повільний", тому працювати наш дисплей буде по SPI. Контролер будемо використовувати STM32F103C8T6, а точніше, отримавшу "популярність" плату Maple Mini:

Підключення. Насамперед вмикаємо SPI1.

Дисплей має піни SDA(SPI1_MOSIта SCL (SPI1_SCK), це і є наш SPI - інтерфейс. Зворотнього MISO немає.. 

Пін CS можна не використовувати, та посадити його на "землю". Це має сенс зробити, якщо ми маємо лише один "девайс" на шині SPI . Та ми все ж використаємо його, та зарезервуємо за ним пін.

Пін RЕS - "reset" дисплея.

Пін А0 - при значенні '0' - йде відправка команди, при значенні '1'  - відправка даних.

SPI вмикаємо в режимі Transmit Only Master:

Tакож не забудемо ввімкнути Serial Wire у вкладці SYS. Крім того, налаштуємо декілька пінів на вихід (GPIO_Output), та увімкнемо USART1 для майбутнього проекта....

Підключення пінів прописано у файлі TFT_1_8.h , в моєму випадку

#define RES_PORT     GPIOA
#define CS_PORT      GPIOA
#define A0_PORT      GPIOA

#define RES_PIN      GPIO_PIN_2
#define CS_PIN       GPIO_PIN_3
#define A0_PIN       GPIO_PIN_4

Та SPI1 у файлі stm32fxx_hal_mcp.c, нам генерує CubeMX:

    /**SPI1 GPIO Configuration    
    PA5     ------> SPI1_SCK
    PA7     ------> SPI1_MOSI 
    */

CubeMX & SPI. Для роботи з дисплеєм , найперше потрібна функція відправки даних на дисплей, звісно використовуючи SPI:

void TFT_write_byte(unsigned char value, unsigned char DC) //0-command 1-data
{
      CS_LOW;
      if(DC != 0){A0_HIGH;}
      else{A0_LOW;}            
      HAL_SPI_Transmit(&hspi1, &value, 1, 5000);
      CS_HIGH ;
}

Ініціалізація. Запускаємо дисплей. Для коректної роботи ця функція мабуть найголовніша. Взагалі спочатку було не зрозуміло з яким саме контролером дисплея ми маємо діло (магазин ніякої інформації не давав), та все ж методом проб та помилок вірне рішення було знайдено. Контролер дисплея виявився ST7735, а вірна ініціалізація у АВР-щиків - http://we.easyelectronics.ru/
Причому після увімкнення дисплея командою display on (0х29) потрібно налаштувати колір (0x2D):

  TFT_write_byte(0x29,0);    // display on
  HAL_Delay(150);

  TFT_write_byte(0x2D,0);  //Look up table
  for(c=0;c<32;c++)
    TFT_write_byte(2*c,1); //Red
  for(c=0;c<64;c++)
    TFT_write_byte(1*c,1); //Green
  for(c=0;c<32;c++)
    TFT_write_byte(2*c,1); //Blue
    
 
TFT_write_byte(0x2c,0);
  HAL_Delay(150);

Міняємо орієнтацію дисплея. Для цього використаємо функцію

void TFT_set_rotation(unsigned char rot);

Всі фото зробленні при значенні 0х01. Відповідно значення 0х02, 0х03 та 0х04 міняють орієнтацію дисплея та відповідні зачення ширини та висоти ( w & l ) .

Далі стандартні графічні функціі малювання лінії, прямокутника та кола - TFT_Draw_Line, TFT_Draw_Rectangle, ТFT_Draw_Circle. Тут все доволі звичайно...тому зупинятись не будемо.

Текст та кирилиця. І ось ми підійшли до самого цікавого. Використано шрифт від Arduino-проектів, його фішка в тому ,що на одному шрифтові можна використовувати різний розмір:

Та на жаль шрифт не підтримував кирилицю, І знову на допомогу прийшли "ардуінщики" ,"покрутившись" у них по форумах знайшлись необхідні коди символів кирилиці. Знову таки методом проб і помилок, вдалось добитись слідуючої "картинки", яка відповідає кодуванню UTF-8:

Для номерів з U + 0000 по U + 007F кодування UTF-8 повністю відповідає 7-бітному US-ASCII c 0 в старшому бітові і займає один байт. Вивід кириличного символа прийшлось доробляти, оскільки символ займав 2 байта і на екрані дисплея між символами "висвітлювалось" пусте місце. Прийшлось гасити його програмно

 

Просмотров: 3087 | Добавил: rastamanoff | Рейтинг: 5.0/1
Всего комментариев: 0
Ім`я *:
Email *:
Код *:
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0