一、模塊來源
資料下載鏈接:
http://www.lcdwiki.com/zh/3.5inch_SPI_Module_ILI9488_SKU:MSP3520
產品實物展示
二、規格參數
工作電壓:3.3V
工作電流:20MA
模塊尺寸:56.34(H) x 98.00(W)
像素大小:320(H) x 480(V)RGB
驅動芯片:ILI9488
通信協議:SPI
使用管腳數量:14 Pin(2.54mm間距排針)
尺寸參數
三、移植過程
我們的目標是將例程移植至立創·CW32F030C8T6開發板上。按照以下步驟,即可完成移植。
將源碼導入工程;
根據編譯報錯處進行粗改;
修改引腳配置;
修改時序配置;
移植驗證。
3.1 查看資料
打開廠家資料例程(例程下載見例程下載)。具體路徑見下圖。
3.2 移植至工程
將廠家資料路徑下的關于LCD底層的代碼,復制到自己的工程中。一共有兩次復制。并且自己的工程至少需要有微秒級延時函數。(工程可以參考入門手冊工程模板)
復制文件夾1
復制文件夾2
打開自己的工程,將我們剛剛復制過來的文件導入.c和.h文件。
分別在lcd.h、touch.h 和 spi.h文件中定義三個宏,u32、u16與u
#include "board.h" #ifndef u8 #define u8 uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif
將test.c、lcd.c、touch.c和GUI.c文件中的頭文件delay.h 注釋掉
3.3 引腳選擇
該屏幕需要設置14個接口,具體接口說明見廠家資料屏幕規格書。 當前廠家源碼使用的是軟件SPI接口,SPI時序部分廠家已經完成,我們只需要將硬件SPI引腳時序和延時配置好即可。所以對應接入的屏幕引腳請按照你的需要。這里選擇的引腳見屏幕接線。
屏幕 | 開發板 |
---|---|
GND | GND |
VCC | 3.3V |
SCK | PA6 |
SDI | PA7 |
RST | PB1 |
RS | PB0 |
CS | PB10 |
LED | PA5 |
SDO | 不接 |
T_CLK | PA4 |
T_CS | PA3 |
T_DIN | PA2 |
T_DO | PA1 |
T_IRQ | PA0 |
選擇好引腳后,進入工程開始編寫屏幕引腳初始化代碼。
3.4. 端口修改
為了方便后續移植,我在lcd.h處宏定義了每一個引腳,后續根據需要進行修改即可。
//-----------------LCD端口移植---------------- #define RCC_LCD1_ENABLE() __RCC_GPIOA_CLK_ENABLE() #define RCC_LCD2_ENABLE() __RCC_GPIOB_CLK_ENABLE() //SCK #define PORT_LCD_SCL CW_GPIOA #define GPIO_LCD_SCL GPIO_PIN_6 //MOSI #define PORT_LCD_SDA CW_GPIOA #define GPIO_LCD_SDA GPIO_PIN_7 ////MIS0 //#define PORT_LCD_MIS GPIOB //#define GPIO_LCD_MIS GPIO_PIN_14 //NSS #define PORT_LCD_CS CW_GPIOB #define GPIO_LCD_CS GPIO_PIN_10 //DC #define PORT_LCD_DC CW_GPIOB #define GPIO_LCD_DC GPIO_PIN_0 //RES #define PORT_LCD_RES CW_GPIOB #define GPIO_LCD_RES GPIO_PIN_1 //BLK/LED #define PORT_LCD_BLK CW_GPIOA #define GPIO_LCD_BLK GPIO_PIN_5 //CS2/T_CS #define PORT_LCD_CS2 CW_GPIOA #define GPIO_LCD_CS2 GPIO_PIN_3 //PEN/T_IRQ #define PORT_LCD_PEN CW_GPIOA #define GPIO_LCD_PEN GPIO_PIN_0 //T_CLK #define PORT_LCD_TCLK CW_GPIOA #define GPIO_LCD_TCLK GPIO_PIN_4 //T_DIN #define PORT_LCD_TDIN CW_GPIOA #define GPIO_LCD_TDIN GPIO_PIN_2 //T_DO #define PORT_LCD_TD0 CW_GPIOA #define GPIO_LCD_TD0 GPIO_PIN_1
軟件SPI引腳宏
將lcd.c源代碼中的voidLCD_GPIOInit(void)修改為如下代碼。
代碼中已經做了引腳SPI的適配,如果沒有修改相關引腳,則將宏定義USE_HARDWARE_SPI宏 為1即可。
void LCD_GPIOInit(void) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體 RCC_LCD1_ENABLE(); // 使能GPIO時鐘 RCC_LCD2_ENABLE(); // 使能GPIO時鐘 GPIO_InitStruct.Pins = GPIO_LCD_SCL| // GPIO引腳 GPIO_LCD_SDA| GPIO_LCD_BLK; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高 GPIO_Init(PORT_LCD_SCL, &GPIO_InitStruct); // 初始化 GPIO_InitStruct.Pins = GPIO_LCD_DC| GPIO_LCD_RES| GPIO_LCD_CS; GPIO_Init(PORT_LCD_CS, &GPIO_InitStruct); // 初始化 }
將lcd.h中的LCD端口定義宏,修改為:
//////////////////////////////////////////////////////////////////// //-----------------LCD端口定義---------------- //液晶控制口置1操作語句宏定義 #define LCD_CS_SET GPIO_WritePin(PORT_LCD_CS, GPIO_LCD_CS, GPIO_Pin_SET) #define LCD_RS_SET GPIO_WritePin(PORT_LCD_DC, GPIO_LCD_DC, GPIO_Pin_SET) #define LCD_SDA_SET GPIO_WritePin(PORT_LCD_SDA, GPIO_LCD_SDA, GPIO_Pin_SET) #define LCD_SCL_SET GPIO_WritePin(PORT_LCD_SCL, GPIO_LCD_SCL, GPIO_Pin_SET) #define LCD_RST_SET GPIO_WritePin(PORT_LCD_RES, GPIO_LCD_RES, GPIO_Pin_SET) #define LCD_LED_SET GPIO_WritePin(PORT_LCD_BLK, GPIO_LCD_BLK, GPIO_Pin_SET) //液晶控制口置0操作語句宏定義 #define LCD_CS_CLR GPIO_WritePin(PORT_LCD_CS, GPIO_LCD_CS, GPIO_Pin_RESET)//CS #define LCD_RS_CLR GPIO_WritePin(PORT_LCD_DC, GPIO_LCD_DC, GPIO_Pin_RESET)//DC #define LCD_SDA_CLR GPIO_WritePin(PORT_LCD_SDA, GPIO_LCD_SDA, GPIO_Pin_RESET)//SDA=MOSI #define LCD_SCL_CLR GPIO_WritePin(PORT_LCD_SCL, GPIO_LCD_SCL, GPIO_Pin_RESET)//SCL=SCLK #define LCD_RST_CLR GPIO_WritePin(PORT_LCD_RES, GPIO_LCD_RES, GPIO_Pin_RESET)//RES #define LCD_LED_CLR GPIO_WritePin(PORT_LCD_BLK, GPIO_LCD_BLK, GPIO_Pin_RESET)
3.5. 驅動修改
在SPI.c文件中,找到void SPIv_WriteData(unsigned char Data)函數,將其修改如下。
void SPIv_WriteData(u8 Data) { unsigned char i=0; for(i=8;i>0;i--) { if(Data&0x80) LCD_SDA_SET; //輸出數據 else LCD_SDA_CLR; LCD_SCL_CLR; LCD_SCL_SET; Data<=1; } }
在spi.h中,廠家定義了關于SPI接口的宏,這里我們將其注釋,使用我們自己的方式。
打開touch.c 文件 修改以下內容:
修改u8TP_Init(void);函數
u8 TP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /* PEN */ GPIO_InitStructure.Pins = GPIO_LCD_PEN; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_LCD_PEN, &GPIO_InitStructure); /* DOUT*/ GPIO_InitStructure.Pins = GPIO_LCD_TD0; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_LCD_TD0, &GPIO_InitStructure); /* TDIN*/ GPIO_InitStructure.Pins = GPIO_LCD_TDIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_LCD_TDIN, &GPIO_InitStructure); /* TCLK*/ GPIO_InitStructure.Pins = GPIO_LCD_TCLK; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_LCD_TCLK, &GPIO_InitStructure); /* TCS*/ GPIO_InitStructure.Pins = GPIO_LCD_CS2; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_LCD_CS2, &GPIO_InitStructure); TP_Read_XY(&tp_dev.x,&tp_dev.y);//第一次讀取初始化 return 1; }
注釋掉void TP_Save_Adjdata(void);和u8 TP_Get_Adjdata(void);函數.
3.找到void TP_Adjust(void);函數將函數里面的TP_Save_Adjdata();和TP_Get_Adjdata();注釋掉。
我們打開 test.c 文件進行一些修改:找到void Touch_Test(void);函數,將里面的一些語句注釋掉,并且將282行括號內的 key==1 改為 1。
4.開lcd.c文件 找到voidLCD_Init(void);函數將里面的LCD_LED=1;替換成 LCD_LED_SET;
打開 touch.h 文件 將里面一部分代碼改為下面的部分:
#define PEN GPIO_ReadPin(PORT_LCD_PEN,GPIO_LCD_PEN) //INT #define DOUT GPIO_ReadPin(PORT_LCD_TD0,GPIO_LCD_TD0) //MISO #define TDIN(x) GPIO_WritePin(PORT_LCD_TDIN,GPIO_LCD_TDIN,x?GPIO_Pin_SET:GPIO_Pin_RESET) //MOSI #define TCLK(x) GPIO_WritePin(PORT_LCD_TCLK,GPIO_LCD_TCLK,x?GPIO_Pin_SET:GPIO_Pin_RESET) //SCLK #define TCS(x) GPIO_WritePin(PORT_LCD_CS2, GPIO_LCD_CS2, x?GPIO_Pin_SET:GPIO_Pin_RESET) //CS
然后我們打開touch.c 文件將文件中的下列形式的語句換成后面的語句:
TCLK = 1; -----換成-------> TCLK(1); TCLK = 0; -----換成-------> TCLK(0); TDIN = 1; -----換成-------> TDIN(1); TDIN = 0; -----換成-------> TDIN(0); TCS = 1; -----換成-------> TCS(1); TCS = 0; -----換成-------> TCS(0);
例如:
到這里就移植完成了,請移步到4節進行移植驗證。
四、移植驗證
在main.c中輸入代碼如下
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "Lcd.h" #include "gui.h" #include "test.h" #include "spi.h" #include "touch.h" int32_t main(void) { board_init(); // 開發板初始化 uart1_init(115200); // 串口1波特率115200 LCD_Init(); //液晶屏初始化 while(1) { main_test(); //測試主界面 Test_Color(); //簡單刷屏填充測試 Test_FillRec(); //GUI矩形繪圖測試 Test_Circle(); //GUI畫圓測試 Test_Triangle(); //GUI三角形繪圖測試 English_Font_test(); //英文字體示例測試 Chinese_Font_test(); //中文字體示例測試 Pic_test(); //圖片顯示示例測試 Rotate_Test(); //旋轉顯示測試 //如果不帶觸摸,或者不需要觸摸功能,請注釋掉下面觸摸屏測試項 Touch_Test(); //觸摸屏手寫測試 } }
上電效果:
模塊移植成功案例(軟件SPI):
鏈接:https://pan.baidu.com/s/1fVFssmnIdNbN4F0ZdxpwlQ?pwd=LCKF 提取碼:LCKF
審核編輯 黃宇
-
觸摸屏
+關注
關注
42文章
2350瀏覽量
117866 -
CW32
+關注
關注
1文章
242瀏覽量
1059
發布評論請先 登錄
【CW32模塊使用】1.8寸彩色觸摸屏


Model3A 7寸觸摸屏PLC應用解決方案:LVGL拖拽式UI便捷設計

案例解說PLC、觸摸屏及變頻器綜合應用
4線電阻式觸摸屏是如何工作的


LCD屏和觸摸屏的PCB設計

啟明智顯Model3A芯片方案7寸高清觸摸屏:開箱、設置與實操全攻略指南

觸摸屏和plc的程序怎么編寫
人機界面觸摸屏如何觸摸校正屏幕
觸摸屏與plc通訊不上的原因
【項目展示】基于CW32的遙控循跡小車

評論