Авторизация


...

Кто на сайте?

Сейчас 182 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 21936
-Материалы : 208

Пользователь сайта продает...

  Программатор Pic K-150

Пользователь сайта покупает...

Подключаем LCD SSD1963 к STM32 по FSMC_16bit +Touch

Автор: Александр Беглецов Просмотров: 3717

 Подключаем LCD SSD1963  к STM32 по FSMC_16bit +Touch

 В этом проекте я  подключил  сенсорный экран и реализовал программную регулировку  яркости подсветки, ну и в довершение сделал  вывод на экран показаний популярных датчиков температуры типа DS18B20.

 

 

0

 

 Сам проект (исходный код) и доп.файлы прикреплены в конце статьи (для скачивания Вы должны быть авторизированны на сайте). Для того чтобы легче понять исходник  моей программы разберем все попорядку. Итак..

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

 1

 

 Создаём проект под нужный МК, выставляем  настройки. Также назначаем порт PA0 (кнопка), порт PC5  (DS18B20), PB7 (IRQ_Touch)  в качестве входов и  PC13 (LCD_Reset) в качестве выхода.

 PS. Я использовал оценочную плату STM32F4discovery, отпаяв ненужную периферию и резисторы к светодиодам (красный и синий), чтобы не замедляли работу FSMC.

 

2

 

Настраиваем тактирование

PS. делитель APB1 устанавливаем = /8, для получения в дальнейшем скорости SPI_3 = 80Kbit/s

 3

Переходим на вкладку конфигурации и настраиваем периферию. SPI3 - следует установить делитель = 256, чтобы получить скорость не выше 100Kbit/s

4

 

Выводы портов - включаем подтяжку и  для отличия желательно  подписать

  • PA0 – вход от кнопки, подтяжка к массе, активный (нажатие) = лог. 1
  • PC5 – к датчикам температуры DS
  • PB7 – вход от Touch_IRQ – срабатывает при нажатии на тач
  • PC13 – выход к LCD «железный» ресет

 

 FSMC - тайминги установим для начала 10/100/10, чтобы исключить ошибки. В дальнейшем, уменьшая эти тайминги можно найти компромисс между стабильностью и скоростью работы FSMC, хотя у меня стабильно работало и при минимальных таймингах 0/1/0, при том, что дисплей подключен к плате 20 см шлейфом IDE от компьютера.

6

 В настройках проекта выбираем компилятор (у меня использован Keilv 5.17) и на вкладке «Код Генератор» ставим галочку «генерировать инициализацию периферии как парные файлы (*.c& *.h)IP», чтоб не валить все «иниты» в файл main.c и не получить  в итоге «простынь в пол»

Генерируем, открываем проект и запускаем компиляцию (в Кейл - F7).

 

Физическое подключение

Вначале подключим датчик(и) температуры DS18B20. Подключаем резистор 1-4,7 кОм на плюс питания (подтяжка), а сами датчики подключаем к назначенному выводу PC5. Датчики подключаются параллельно (max. 64шт.), количество определяется программой автоматически по ROM.

7

Раскрываем папкуApplication/User

в файле spi.cуказаны выводы, подключаем:

PC10     ------>SPI3_SCK    ------>T_CLK

PC11     ------> SPI3_MISO------> T_DO

PC12     ------> SPI3_MOSI------> T_DIN

PB7------>T_IRQ

к массе ------>T_CS

 

подключение находим в файле fsmc.c

D0-D15 всё ясно, а остальные указываю отдельно

PD14    ------>FSMC_D0

PD15    ------>FSMC_D1

PD0     ------>FSMC_D2

PD1     ------>FSMC_D3

PE7     ------>FSMC_D4

PE8     ------>FSMC_D5

PE9     ------>FSMC_D6

PE10   ------> FSMC_D7

PE11   ------> FSMC_D8

PE12   ------> FSMC_D9

PE13   ------> FSMC_D10

PE14   ------> FSMC_D11

PE15   ------> FSMC_D12

PD8     ------> FSMC_D13

PD9     ------> FSMC_D14

PD10   ------> FSMC_D15

PD11   ------> FSMC_A16    ------> RS

PD4     ------> FSMC_NOE  ------> RD

PD5     ------> FSMC_NWE  ------>WR

PD7     ------>FSMC_NE1   ------>CS, но лучше

CS ----->GND

PS. хотя и можно подключить CS (чип селект) к выводу NE1, я считаю лучшим подключить его к массе, для ускорения работы FSMC, ибо после программного выбора CS требуется некоторое (дополнительное) время, ну а если не требуется использование выводов МК кроме FSMC, то и терять это лишнее время нет смысла, значит CS навсегда подключаем к GND.

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

Для записи команд#define CMD_ADR  (*(uint16_t *)0x60000000)

Для записи данных#defineDAT_ADR(*(uint16_t *)0x60020000)

PS. учитывая размерность FSMC 16 бит в адресе ставится двойка.

Пишем код отправки команд и данных

void LCD_SendCommand(uint16_t com) //команда

{

            CMD_ADR = com;

}

void LCD_SendData(uint16_t data) // данные..

{          

            DAT_ADR= data;      

}

Используя даташит и аппнот составляем код (функцию) инициализации дисплея

PS.управляющие  команды и данные всегда (в т.ч. 16-битной шине) отправляются в размере 8-ми бит

 

void LCD_ini (void)

            {

            //1. Power up the system platform and assert the RESET# signal (‘L’ state) for a minimum of 100us to reset the controller.

TFT_RST_SET

    HAL_Delay (100);

    TFT_RST_RESET

    HAL_Delay (120);

    TFT_RST_SET

    HAL_Delay (120);

/***************************/    

LCD_SendCommand(0xE2);  //установкачастоты

LCD_SendData(0x1D);  // делитель(M=29)

LCD_SendData(0x02);  //множитель(N=2)

LCD_SendData(0xFF);  //вкл/выкл множит и дел.

//3. Turn on the PLL

LCD_SendCommand(0xE0); 

LCD_SendData(0x01);

 HAL_Delay (120); // Wait for 100us to let the PLL stable and read the PLL lock status bit.

LCD_SendCommand(0xE0);

LCD_SendData(0x03); // 5. Switch the clock source to PLL

  HAL_Delay (120);

LCD_SendCommand(0x01); //6. Software Reset

HAL_Delay (120);

/*************

Dot clock Freq = PLL Freq x (LCDC_FPR + 1) / 2(в 20 степени)

For example,  22MHz = 100MHz * (LCDC_FPR+1) / 2 (в 20 степени)

LCDC_FPR = 230685 = 0x3851D

********************/

LCD_SendCommand(0xE6);  // 7. Configure the dot clock frequency // Настройтечастотусинхросигнала

LCD_SendData(0x03);

LCD_SendData(0x85); 

LCD_SendData(0x1D); 

//8. Configure the LCD panel 

//a. Set the panel size to 480 x 800 and polarity of LSHIFT, LLINE and LFRAME to active low

LCD_SendCommand(0xB0);

LCD_SendData(0x0C);   // 18bit panel, disable dithering, LSHIFT: Data latch in rising edge, LLINE and LFRAME: active low

LCD_SendData(0x00);     // TFT type

LCD_SendData(0x03);     // Horizontal Width:  480 - 1 = 0x031F

LCD_SendData(0x1F); 

LCD_SendData(0x01);     // Vertical Width :  800 -1 = 0x01DF

LCD_SendData(0xDF); 

LCD_SendData(0x00);     // 000 = режим RGB

//b. Set the horizontal period

LCD_SendCommand(0xB4);    // Horizontal Display Period 

LCD_SendData(0x03);    // HT: horizontal total period (display + non-display) – 1 = 520-1 =  519 =0x0207

LCD_SendData(0xA0);     

LCD_SendData(0x00);    // HPS: Horizontal Sync Pulse Start Position = Horizontal Pulse Width + Horizontal Back Porch = 16 = 0x10

LCD_SendData(0x2E);   

LCD_SendData(0x30);     // HPW: Horizontal Sync Pulse Width - 1=8-1=7

LCD_SendData(0x00);    // LPS: Horizontal Display Period Start Position = 0x0000

LCD_SendData(0x0F);

LCD_SendData(0x00);    // LPSPP: Horizontal Sync Pulse Subpixel Start Position(for serial TFT interface).  Dummy value for TFT interface.

//c. Set the vertical period

LCD_SendCommand(0xB6);    // Vertical Display Period 

LCD_SendData(0x02);     // VT: Vertical Total (display + non-display) Period – 1  =647=0x287

LCD_SendData(0x0D);   

LCD_SendData(0x00);     // VPS: Vertical Sync Pulse Start Position  =     Vertical Pulse Width + Vertical Back Porch = 2+2=4 

LCD_SendData(0x10);   

LCD_SendData(0x10);     //VPW: Vertical Sync Pulse Width – 1 =1

LCD_SendData(0x08);     //FPS: Vertical Display Period Start Position = 0

LCD_SendData(0x00); 

/****

9. Set the back light control PWM clock frequency  // установкаШИМподсветки

PWM signal frequency = PLL clock / (256 * (PWMF[7:0] + 1)) / 256

********/

LCD_SendCommand(0xBE);    // PWM configuration – ШИМподсветки

LCD_SendData(0x08);     // set PWM signal frequency to 170Hz when PLL frequency is 100MHz

LCD_SendData(0x80);     // PWM duty cycle  (50%) – половиннаяяркость

LCD_SendData(0x01);     // 0x09 = enable DBC, 0x01 = disable DBC  //включаем

LCD_SendCommand(0x36);     // set address_mode

LCD_SendData(0x02);        // установка ориентации, отражения, RGB/BGR и др.

//13. Setup the MCU interface for 16-bit data write (565 RGB)

LCD_SendCommand(0xF0);     // mcu interface config

LCD_SendData(0x03);     // 16 bit interface (565)

//10. Turn on the display

LCD_SendCommand(0x29);     // включение дисплея

}

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

8

 Теперь всё готово, можно загрузить проект в МК  (в Кейл - F8)

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

PS. Чтоб не калибровать дисплей каждый раз, можно после калибровки посмотреть содержимое «матрицы» в отладчике и жёстко вписать результаты в конце файла TouchPanel.c, либо, как дальнейшее развитие проекта, записывать результаты во внешнюю память (напр. EEPROM)

 После калибровки на экран будет выведено количество найденных датчиков температуры, измеренная ими температура и ROM каждого датчика. Также выводятся координаты касания сенсора дисплея и текущая яркость подсветки.

Яркость подсветки можно изменить,  нажимая кнопку PA0 (активный лог.1)

Ну и что-либо нарисовать «стилусом» в свободном поле экрана

 

 На сегодня у меня всё.

 В довершение могу сказать, что статья отпочковалась в процессе написания другого проекта, в котором дополнительно реализовано получение данных с датчиков температуры/влажности AM2302 (DHT22), люксметра BH1750, по которому автоматически регулируется яркость подсветки, датчика давления BMP180, внешней памяти EEPROM 24C32, GPS модуля на камне NEO-6M..

А также в ведётся работа по интеграции STM32F407 с EmWin от Segger бесплатно предоставленной компанией ST.

 

Возникшие вопросы и доп. материалы всегда можно задать и получить на форуме.

Как и сказал в начале, прилагаю файл исходников, в т.ч. проект в CubeMX, а также документацию.

 

Ссылка для скачивания доступна только авторизованным пользователям сайта !
 

 

 

 

 

Случайные статьи....

Prev Next

Блок управления печи с увлажнением

06-04-2011 Александр Милевский

Блок управления печи с увлажнением

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

Генератор телевизионных сигналов PAL

12-05-2011 Николай Викторов

Генератор телевизионных сигналов PAL

Данный генератор можно применить  для регулировки и ремонта аналоговых мониторов и телевизионных приемников (телевизор).Генератор  собран  на "базе"  видеоадаптера на PIC18F46K20 и  кодера PAL. По сути  это измененная   прошивка , позволяющая  кроме основного предназначения (видеоадаптер) , применить данное устройство в качестве...

Получение рисунка печатной платы в gerber формате из проекта Sprint-La…

16-06-2015 Super User

Получение рисунка печатной платы в gerber формате из проекта Sprint-Layout

  Хотя инструкцию получения рисунка печатной платы из Sprint-Layout можно без труда найти в сети, тем не менее периодически появляются вопросы...В данной статье кроме получения рисунка  в gerber формате и файла сверловки в формате Excellon из проекта программы Sprint-Layout, будут...

Преобразование однобайтного двоичного числа в трёхзначное десятичное ч…

23-07-2011 Николай Викторов

Преобразование однобайтного двоичного числа в трёхзначное десятичное число в «пиках» 18 серии

  Была необходимость применить подпрограмму «Преобразование однобайтного двоичного числа в трёхзначное десятичное число» в «пиках» 18 серии. Для этого пришлось подправить код. Дело в том , что команда «incf» в пиках 16 серии увеличивает значение регистра f на 1 и...


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru