STM32CubeMx開發之路—11使用FSMC操作LCD

STM32CubeMx開發之路—11使用FSMC操作LCD


運行環境

  • Windows10
  • STM32CubeMX Version 5.2.0
  • Keil5(MDK5) Version 5.28.0.0

簡介

本例程主要講解如何使用FSMC操作LCD


STM32CubeMx基本配置

基礎配置過程請參考 STM32CubeMx(Keil5)開發之路—配置第一個項目


CubeMX配置

  • 調試打印配置

  • FSMC配置

  • 根據原理圖可知需要的配置的管腳

  • SPI是與觸摸芯片相關的,先不用管

  • A10是用來作爲片選的,記住,配置的時候需要用到

  • 設置FSMC
  • 選擇專門的LCD接口
  • 選擇上面原理圖的A10
  • 設置下面的參數,如果嫌太慢就把NOR/PSRAM timing設置小一點
  • 對應管腳和原理圖一致,原理圖部分就不展示出來了

代碼修改

  • 添加代碼(講解寫在代碼裏面)
/* USER CODE BEGIN 0 */

/* 使用printf功能 */
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
    return ch;
}

#define TFT_XMAX 319		//設置TFT屏的x
#define TFT_YMAX 479		//設置TFT屏的y

#define WHITE          0xFFFF
#define BLACK          0x0000
#define BLUE           0x001F
#define RED            0xF800
#define MAGENTA        0xF81F
#define GREEN          0x07E0
#define CYAN           0x7FFF
#define YELLOW         0xFFE0		 //定義顏色的宏


/*********************************************************************************
 * 不同的LCD的資料文件裏面都有各自初始化的命令和參數,請根據各自的參數進行初始化,
 * 我這邊使用的是TFTHX8357,初始化是這樣的。你們的可能會不同
 * 詳細的資料我就不仔細說明了,有興趣可以私聊
 *********************************************************************************
 */

/* 寫命令 
 * 一些人可能在這兒會懵,這裏主要是使用指針對地址進行操作,這裏是C語言的知識
 * FSMC對把顯示屏當做SRAM在操作,所以採用的是對地址的操作, 下面讀命令也是一樣 
 */
void TFT_WriteCmd(uint16_t cmd)
{
	*(__IO uint16_t *)(0x6C0007FE) = cmd;
}

/* 寫數據 */
void TFT_WriteData(uint16_t dat)
{
	*(__IO uint16_t *)(0x6C000800) = dat;
}

/* 初始化TFT */
void TFT_Init(void)
{
	uint16_t i;

	TFT_WriteCmd(0xE9); 
	TFT_WriteData(0x20); 
	
	TFT_WriteCmd(0x11); //Exit Sleep 
	for(i=500; i>0; i--);
	
	TFT_WriteCmd(0x3A);
	TFT_WriteData(0x55);  //16Bit colors
	
	TFT_WriteCmd(0xD1); 
	TFT_WriteData(0x00); 
	TFT_WriteData(0x65); //調試此值改善水紋
	TFT_WriteData(0x1F); 
	
	TFT_WriteCmd(0xD0); 
	TFT_WriteData(0x07); 
	TFT_WriteData(0x07); 
	TFT_WriteData(0x80); 
	
	TFT_WriteCmd(0x36); 	 //Set_address_mode
	TFT_WriteData(0x48);   	//48
	
	TFT_WriteCmd(0xC1); 
	TFT_WriteData(0x10); 
	TFT_WriteData(0x10); 
	TFT_WriteData(0x02); 
	TFT_WriteData(0x02); 
	
	TFT_WriteCmd(0xC0); //Set Default Gamma 
	TFT_WriteData(0x00);  
	TFT_WriteData(0x35); 
	TFT_WriteData(0x00); 
	TFT_WriteData(0x00); 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x02); 

	TFT_WriteCmd(0xC4);			
	TFT_WriteData(0x03);

	TFT_WriteCmd(0xC5); //Set frame rate 
	TFT_WriteData(0x01); 
	
	TFT_WriteCmd(0xD2); //power setting 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x22); 

	TFT_WriteCmd(0xE7);			
	TFT_WriteData(0x38);
	
	TFT_WriteCmd(0xF3);			
	TFT_WriteData(0x08); 
	TFT_WriteData(0x12);
	TFT_WriteData(0x12);
	TFT_WriteData(0x08);

	TFT_WriteCmd(0xC8); //Set Gamma 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x52); 
	TFT_WriteData(0x37); 
	TFT_WriteData(0x10); 
	TFT_WriteData(0x0d); 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x04); 
	TFT_WriteData(0x51); 
	TFT_WriteData(0x77); 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x01); 
	TFT_WriteData(0x0d); 
	TFT_WriteData(0x08); 
	TFT_WriteData(0x80); 
	TFT_WriteData(0x00);  

	TFT_WriteCmd(0x29); //display on

}

/* 設置讀寫的範圍 */
void TFT_SetWindow(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd)
{
    TFT_WriteCmd(0x2A);

    TFT_WriteData(xStart>>8);
    TFT_WriteData(xStart&0XFF);
    TFT_WriteData(xEnd>>8);
    TFT_WriteData(xEnd&0XFF);

    TFT_WriteCmd(0x2b);
    TFT_WriteData(yStart>>8);
    TFT_WriteData(yStart&0XFF);
    TFT_WriteData(yEnd>>8);
    TFT_WriteData(yEnd&0XFF);
    TFT_WriteCmd(0x2c); 
}

/* 清屏函數 */
void TFT_ClearScreen(uint16_t color)
{
 	uint16_t i, j ;

	TFT_SetWindow(0, 0, TFT_XMAX, TFT_YMAX);	 //作用區域
  	for(i=0; i<TFT_XMAX+1; i++)
	{
		for (j=0; j<TFT_YMAX+1; j++)
		{
			TFT_WriteData(color);
		}
	}
}

/* USER CODE END 0 */
  • main函數
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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_FSMC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  
	TFT_Init();
	TFT_ClearScreen(RED);
	TFT_ClearScreen(WHITE);
	
	/* 畫一個點:座標(100,100),顏色:黑色 */
	TFT_SetWindow(100,100,100,100);					// 設置操作的區域
	TFT_WriteData(BLACK);
	
	/* 畫一個正方形:座標(110,110,129,129),顏色:紅色 */
	TFT_SetWindow(110,110,129,129);
  	for(int i=110; i<130; i++)
	{
		for (int j=110; j<130; j++)
		{
			TFT_WriteData(RED);
		}
	}
	
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

運行結果

  • 燒錄進去,復位之後,查看顯示屏
  • 如果輸出我的類似,說明測試成功

源碼

STM32F103ze_FSMC_LCD.rar

小結

如果使用GUI庫,就會用到,畫點,劃線等函數接口,如果使用觸摸屏還會用到讀點的函數,結合GUI使用屏幕纔是最終的選擇。


備註:提供一下個人微信號 Hleafleafleaf,歡迎加好友,共同學習!共同進步!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章