STM32CubeMx開發之路—11使用FSMC操作LCD
運行環境
Windows10
STM32CubeMX
Version 5.2.0
Keil5(MDK5)
Version 5.28.0.0
簡介
本例程主要講解如何使用FSMC操作LCD
STM32CubeMx基本配置
基礎配置過程請參考 STM32CubeMx(Keil5)開發之路—配置第一個項目
CubeMX配置
- 設置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 */
}
運行結果
- 燒錄進去,復位之後,查看顯示屏
- 如果輸出我的類似,說明測試成功
源碼
小結
如果使用GUI庫,就會用到,畫點,劃線等函數接口,如果使用觸摸屏還會用到讀點的函數,結合GUI使用屏幕纔是最終的選擇。
備註:提供一下個人微信號 Hleafleafleaf,歡迎加好友,共同學習!共同進步!