0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32模块使用 2.8寸与3.2寸ILI9341彩屏

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2025-05-12 15:16 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、模块来源

采2
资料下载链接:
http://www.lcdwiki.com/zh/2.8inch_SPI_Module_ILI9341_SKU:MSP2807

wKgZPGggaJaAEyZfAAEPH5Oxzbg064.jpg

产品实物展示

二、规格参数

上方下载链接下载资料。

工作电压:3.3V-5V

工作电流:90mA

模块尺寸:50.0(H) x 86(V) MM

像素大小:320(H) x 240(V)RGB

驱动芯片:ILI9341

通信协议:SPI

工作电流:90mA

模块尺寸:50.0(H) x 86(V) MM

像素大小:320(H) x 240(V)RGB

驱动芯片:ILI9341

通信协议:SPI

三、移植过程

我们的目标是将例程移植至立创·CW32F030C8T6开发板上。按照以下步骤,即可完成移植。

将源码导入工程;

根据编译报错处进行粗改;

修改引脚配置;

修改时序配置;

移植验证。

3.1 查看资料

打开厂家资料例程(例程下载见例程下载)。具体路径见下图。

wKgZO2ggaJeATxTfAASlLn5D4Xs032.jpg

3.2 移植至工程

将厂家资料路径下的【LCD】、【SPI】、【TOUCH】文件夹和User文件夹下的GUI.c、GUI.h、test.c和test.h、pic.h,复制到自己的工程中。自己的工程至少需要有毫秒级延时函数。(工程可以参考空白工程下载)

wKgZPGggaJiAY0RzAAtL_CF1zU0057.jpg

wKgZO2ggaJmAE_BAAA5cYnaX388506.jpg

打开自己的工程,将我们刚刚复制过来的文件导入.c和.h文件。

wKgZO2ggaJqAXetNAAA4kiQc5ec335.jpg

分别在touch.h、spi.h、gui.h 和 test.h 文件中定义三个宏,s32、u16与u8。

#include "sys.h" 替换为 #include "board.h"

#include "board.h"

#ifndef u8
#define u8 uint8_t
#endif

#ifndef u16
#define u16 uint16_t
#endif

#ifndef s32
#define s32 uint32_t
#endif

#ifndef u32
#define u32 uint32_t
#endif

将touch.c、lcd.c、GUI.c与test.c文件中的头文件delay.h 注释掉!!

wKgZO2ggaJyAAvw3AAWmkkDeEPY640.jpg

3.3. 引脚选择

该屏幕需要设置14个接口,具体接口说明见厂家资料屏幕规格书。 当前厂家源码使用的是软件SPI接口,SPI时序部分厂家已经完成,我们只需要将硬件SPI引脚时序和延时配置好即可。所以对应接入的屏幕引脚请按照你的需要。这里选择的引脚见屏幕接线。

屏幕 开发板
GND GND
--- ---
VCC 3.3V
SCK PA6
SDI PA7
RST PB1
DC PB0
CS PB10
LED PA5
SDO x
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

lcd.c 源代码中的 void LCD_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)

wKgZPGggaJ2AW7UVAA3RLb_L3vI471.jpg

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;
    }
}

wKgZO2ggaJ6AFbC-AARgyKGJRRY213.jpg

在spi.h中,厂家定义了关于SPI接口的宏,这里我们将其注释,使用我们自己的方式。

wKgZPGggaKCAZ7kJAA7FOqn6fIo051.jpg

打开touch.c 文件 修改以下内容:

修改u8 TP_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);函数。

wKgZO2ggaKSAJUb2AAyXXMeRTIg073.jpg

找到 void TP_Adjust(void) ;函数将函数里面的 TP_Save_Adjdata();和TP_Get_Adjdata();注释掉。

wKgZPGggaKaAKijRAADY59AosDM122.jpg

我们打开 test.c 文件进行一些修改:找到 void Touch_Test(void); 函数,将里面的一些语句注释掉,并且将282行括号内的 key==1 改为 1。

wKgZO2ggaKeARdD1AAgyWKEjYaU590.jpg

打开 lcd.c 文件 找到 void LCD_Init(void); 函数将里面的LCD_LED=1;替换成 LCD_LED_SET;

wKgZPGggaKiAPoaPAAKvOFxiXnM953.jpg

打开 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

wKgZO2ggaKmAd59MAAmG0SA5lYE255.jpg

然后我们打开 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);

例如:

wKgZPGggaKmAewB7AALCsLzFgCc081.jpg

到这里就移植完成了,请移步到第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"

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();       //触摸屏手写测试
    }
}

移植现象:

wKgZO2ggaKqAfYIXAAsvVVanuKI989.jpg

移植成功案例代码:

链接:https://pan.baidu.com/s/1pu5PsMlW1PlWOAGTy-iBuw?pwd=LCKF 提取码:LCKF

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触摸屏
    +关注

    关注

    42

    文章

    2503

    浏览量

    122486
  • CW32
    +关注

    关注

    1

    文章

    323

    浏览量

    1958
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问CW32中的CW是啥意思?

    CW32中的CW是啥意思?
    发表于 02-02 07:10

    CW32仿真器是什么?

    CW32仿真器是什么
    发表于 01-05 08:04

    请问CW32芯片有哪些功能模块

    CW32芯片有哪些功能模块
    发表于 12-26 08:11

    CW32 MCU温度监测应用

    监测环境温度,并通过串口将数据发送到PC端进行显示。 硬件连接 CW32 MCU LM35温度传感器 USB转串口模块 代码实现 #include \"cw32f030.h\"
    发表于 12-03 08:03

    cw32 systick怎么用?

    cw32 systick怎么用
    发表于 12-01 08:10

    使用芯源CW32CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块
    的头像 发表于 11-21 11:34 803次阅读
    使用芯源<b class='flag-5'>CW32</b>的<b class='flag-5'>CW</b>32L012开发评估板做了spi屏幕驱动

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要安装CW
    发表于 11-12 07:52

    3.5TFT屏规格书

    关于3.5TFT彩屏的参考资料
    发表于 10-24 16:01 1次下载

    CW32模块使用 1.28圆屏LCD彩色显示屏

    厂家资料屏幕规格书。 工作电压: 3.3V 工作电流: 20mA 模块尺寸: 44(H) x 36(V) x 2.8(D) MM 像素间距: 0.135(H) x 0.135(V) 驱动芯片
    的头像 发表于 07-01 15:21 755次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 1.28<b class='flag-5'>寸</b>圆屏LCD彩色显示屏

    CW32模块使用 0.91彩屏

    工作电流: 最大16mA 模块尺寸: 12(H) x 38(V) MM 像素大小: 128(H) x 32(V) 驱动芯片: SSD1306 通信协议: IIC 三、移植过程 我们的目标是将例程移植至立创·CW32F030C8T6开发板上。按照以下步骤,
    的头像 发表于 07-01 15:20 857次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 0.91<b class='flag-5'>寸</b><b class='flag-5'>彩屏</b>

    CW32模块使用 1.3单色OLED显示屏

    一、模块来源 产品实物展示:   ​ 资料下载链接:https://pan.baidu.com/s/1FNGHM0u5MQ2li3QOrTkTuA 资料提取码: 8888 二、规格参数 以下信息见
    的头像 发表于 07-01 14:57 775次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 1.3<b class='flag-5'>寸</b>单色OLED显示屏

    2.4TFT彩屏配套测试程序-51单片机

    如题,2.4TFT彩屏配套测试程序-51单片机。
    发表于 06-04 16:26 0次下载

    CW32模块使用 3.5ILI9488彩色触摸屏

    一、模块来源 资料下载链接: http://www.lcdwiki.com/zh/3.5inch_SPI_Module_ILI9488_SKU:MSP3520   产品实物展示 二、规格参数 工作
    的头像 发表于 05-12 15:19 1260次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 3.5<b class='flag-5'>寸</b><b class='flag-5'>ILI</b>9488彩色触摸屏

    CW32模块使用】0.96IIC单色屏

    我们的目标是将例程移植至立创·CW32F030C8T6开发板上。按照以下步骤,即可完成移植。 将源码导入工程; 根据编译报错处进行粗改; 修改引脚配置; 修改时序配置; 移植验证。
    的头像 发表于 05-11 16:19 1169次阅读
    【<b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用】0.96<b class='flag-5'>寸</b>IIC单色屏

    CW32模块使用】1.8彩色触摸屏

    一、模块来源 模块实物展示:   资料下载链接:https://pan.baidu.com/s/1n_vp38V7ij88PUGpbJPd7Q 资料提取码:8888 二、规格参数 工作电压
    的头像 发表于 05-11 16:14 1604次阅读
    【<b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用】1.8<b class='flag-5'>寸</b>彩色触摸屏