Авторизация


...

Кто на сайте?

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

  • inmiernikwesto

Статистика

-Посетители : 24440
-Материалы : 210

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

  Стенд для освоения программирования МК AVR

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

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

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

 Подключаем 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

Устройство управления заслонкой карбюраторного двигателя

10-03-2011 Sergey Roslik

Устройство управления заслонкой карбюраторного двигателя

Назначение устройства. Устройство управления заслонкой карбюраторного двигателя (УЗКД) предназначено для автоматического управления заслонкой карбюратора во время холодного пуска двигателя. УЗКД может работать как отдельно, так и совместно с автосигнализацией, с функцией автозапуска двигателя или иным устройством автозапуска.Схема управления моторедуктором (МР)...

Простой усилитель термопары

10-05-2011 Александр Милевский

Простой усилитель термопары

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

Часы,таймер,регулятор температуры.

16-01-2012 Super User

Часы,таймер,регулятор температуры.

   КОНКУРС Данное устройство разработано на базе PIC16F628A .Регулятор температуры поддерживает температуру зоны, где находится датчик, с точностью в 1°С. Диапазон работы регулятора 1 - 100°С, мини -мальный гистерезис срабатывания 1°С. При аварийном уходе температуры за пределы диапазона или неисправности датчика DS18B20,...

Cтек в PIC микроконтроллерах 18 серии.

14-05-2011 Super User

Микроконтроллеры  семейства PIC18XXXX  имеют стек глубиной в 31 адрес. Стек представляет собой  адреса возврата из подпрограммы или обработки прерываний. При выполнении команд CALL, RCALL, а так же при переходе на выполнение ПП обработки прерываний значение счетчика команд PC помещается в...


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

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