32F429IDISCOVERY TFT-LCD에 다양한 색 출력하기 - 2

2019. 7. 18. 01:29임베디드/32F429IDISCOVERY

1. CubeMX에서 UART, SPI5, LTDC를 설정해야 한다

 

 

SPI5번과 TFT가 연결되었음을 알 수 있다. 연결 전에 Clock 설정을 다음과 같이 해주어야만 한다

 

 

 

그리고 가장 중요한 것이 DOTCLK가 6MHz의 클럭으로 동작해야한다

 

 

SPI5번을 설정하고 분주비를 16으로 맞춰주도록 한다

 

 

SPI에 사용되는 SS핀과 추가적으로 데이터와 명령어를 구분하는 D/CX핀도 따로 연결해야므로 반드시 PC2와 PD13을 출력으로 설정하도록 한다

 

 

다음은 LTDC 설정을 하는데, 먼저 TFT쪽을 보면 다음과 같이 주어진 SYNC에 맞춰서 동작시킬 수 있다

 

 

 

 

 

그리고 코드를 생성한다. 코드에 추가할 내용은 10가지 컬러를 생성하고, 1초마다 GRAM으로 설정된 frame 버퍼에 10가지 컬러를 순차적으로 띄우는 작업이다

 

#include "lcd_ili9341.h"
extern SPI_HandleTypeDef hspi5;
void LCD_WriteCommand(uint8_t command)
{
uint8_t dummy;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); //DCX LOW
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); //CSX LOW
HAL_SPI_TransmitReceive(&hspi5, &command, &dummy, 1, 0xFFFF);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); //CSX HIGH
}
void LCD_WriteData(uint8_t data)
{
uint8_t dummy;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); //DCX HIGH
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); //CSX LOW
HAL_SPI_TransmitReceive(&hspi5, &data, &dummy, 1, 50);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); //CSX HIGH
}
void LCD_PowerOn(void)
{
LCD_WriteCommand(0xCA);
LCD_WriteData(0xC3);
LCD_WriteData(0x08);
LCD_WriteData(0x50);
LCD_WriteCommand(LCD_POWERB);
LCD_WriteData(0x00);
LCD_WriteData(0xC1);
LCD_WriteData(0x30);
LCD_WriteCommand(LCD_POWER_SEQ);
LCD_WriteData(0x64);
LCD_WriteData(0x03);
LCD_WriteData(0x12);
LCD_WriteData(0x81);
LCD_WriteCommand(LCD_DTCA);
LCD_WriteData(0x85);
LCD_WriteData(0x00);
LCD_WriteData(0x78);
LCD_WriteCommand(LCD_POWERA);
LCD_WriteData(0x39);
LCD_WriteData(0x2C);
LCD_WriteData(0x00);
LCD_WriteData(0x34);
LCD_WriteData(0x02);
LCD_WriteCommand(LCD_PRC);
LCD_WriteData(0x20);
LCD_WriteCommand(LCD_DTCB);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_FRC);
LCD_WriteData(0x00);
LCD_WriteData(0x1B);
LCD_WriteCommand(LCD_DFC);
LCD_WriteData(0x0A);
LCD_WriteData(0xA2);
LCD_WriteCommand(LCD_POWER1);
LCD_WriteData(0x10);
LCD_WriteCommand(LCD_POWER2);
LCD_WriteData(0x10);
LCD_WriteCommand(LCD_VCOM1);
LCD_WriteData(0x45);
LCD_WriteData(0x15);
LCD_WriteCommand(LCD_VCOM2);
LCD_WriteData(0x90);
LCD_WriteCommand(LCD_MAC);
LCD_WriteData(0xC8);
LCD_WriteCommand(LCD_3GAMMA_EN);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_RGB_INTERFACE);
LCD_WriteData(0xC2);
LCD_WriteCommand(LCD_DFC);
LCD_WriteData(0x0A);
LCD_WriteData(0xA7);
LCD_WriteData(0x27);
LCD_WriteData(0x04);
/* colomn address set */
LCD_WriteCommand(LCD_COLUMN_ADDR);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0xEF);
/* Page Address Set */
LCD_WriteCommand(LCD_PAGE_ADDR);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x01);
LCD_WriteData(0x3F);
LCD_WriteCommand(LCD_INTERFACE);
LCD_WriteData(0x01);
LCD_WriteData(0x00);
LCD_WriteData(0x06);
LCD_WriteCommand(LCD_GRAM);
HAL_Delay(200);
LCD_WriteCommand(LCD_GAMMA);
LCD_WriteData(0x01);
LCD_WriteCommand(LCD_PGAMMA);
LCD_WriteData(0x0F);
LCD_WriteData(0x29);
LCD_WriteData(0x24);
LCD_WriteData(0x0C);
LCD_WriteData(0x0E);
LCD_WriteData(0x09);
LCD_WriteData(0x4E);
LCD_WriteData(0x78);
LCD_WriteData(0x3C);
LCD_WriteData(0x09);
LCD_WriteData(0x13);
LCD_WriteData(0x05);
LCD_WriteData(0x17);
LCD_WriteData(0x11);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_NGAMMA);
LCD_WriteData(0x00);
LCD_WriteData(0x16);
LCD_WriteData(0x1B);
LCD_WriteData(0x04);
LCD_WriteData(0x11);
LCD_WriteData(0x07);
LCD_WriteData(0x31);
LCD_WriteData(0x33);
LCD_WriteData(0x42);
LCD_WriteData(0x05);
LCD_WriteData(0x0C);
LCD_WriteData(0x0A);
LCD_WriteData(0x28);
LCD_WriteData(0x2F);
LCD_WriteData(0x0F);
LCD_WriteCommand(LCD_SLEEP_OUT);
HAL_Delay(200);
LCD_WriteCommand(LCD_DISPLAY_ON);
/* GRAM start writing */
LCD_WriteCommand(LCD_GRAM);
}
view raw lcd_ili9341.c hosted with ❤ by GitHub
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd_ili9341.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
LTDC_HandleTypeDef hltdc;
SPI_HandleTypeDef hspi5;
UART_HandleTypeDef huart1;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_LTDC_Init(void);
static void MX_SPI5_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define LCD_FRAMEBUFFER_SIZE (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT)
uint16_t frame_buffer[LCD_FRAMEBUFFER_SIZE];
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
int color[] = {
LCD_COLOR_WHITE,
LCD_COLOR_BLACK,
LCD_COLOR_GREY,
LCD_COLOR_BLUE,
LCD_COLOR_BLUE2,
LCD_COLOR_RED,
LCD_COLOR_MAGENTA,
LCD_COLOR_GREEN,
LCD_COLOR_CYAN,
LCD_COLOR_YELLOW
};
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_LTDC_Init();
MX_SPI5_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
LCD_PowerOn();
HAL_LTDC_SetAddress(&hltdc, (uint32_t)frame_buffer, 0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(int i=0; i<10; i++) {
for(int j=0; j<LCD_FRAMEBUFFER_SIZE; j++) {
frame_buffer[j] = color[i];
}
HAL_Delay(1000);
}
}
/* USER CODE END 3 */
}
view raw main.c hosted with ❤ by GitHub