3339|6

208

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【国民技术低功耗系列N32L43x测评】05.SPI驱动TFT屏&TF卡实现中英文混合显示 [复制链接]

 

国民N32L43X系列MCU带有2个硬件SPI接口,我们可以使用其中一路来驱动SPI接口的TFT显示屏;虽然这个系列的MCU没有SDIO接口来操作TF卡,但TF卡可以工作在SPI模式,所以我们另外一路SPI可用作来驱动TF卡,通过移植FatFs文件系统来实现对文件的读取操作。

 

N32L43X系列MCU的SPI接口可工作于主机或从机模式,支持全双工、单工高速通讯模式,具有硬件CRC计算并可配置多主机模式,具有如下特征:

  • 全双工和单工同步传输
  • 支持主模式、从模式、多主模式
  • 8位或16位数据帧格式
  • 数据位顺序可编程
  • 软件或硬件进行NSS管理
  • 时钟极性和相位可编程
  • 发送和接收支持硬件CRC计算、校验
  • 支持DMA操作

 

我们使用SPI1接口来驱动TF卡,使用SPI2接口来驱动TFT显示屏,具体的引脚使用分配如下表所示:

复用功能

管脚

重映射

SPI1_NSS

PB6

AF4

SPI1_SCK

PB3

AF1

SPI1_MISO

PB4

AF1

SPI1_MOSI

PB5

AF0

 

复用功能

管脚

重映射

SPI2_NSS

PB12

AF0

SPI2_SCK

PB13

AF0

SPI2_MISO

PB14

AF0

SPI2_MOSI

PB15

AF0

 

 

实现功能

通过N32L43X系列MCU的SPI1接口来驱动TF卡,通过移植FatFs文件系统实现对存放在TF卡中的字库文件GBK_FONT.bin的数据读取操作、通过SPI2接口来驱动TFT显示屏,结合Image2Lcd工具提取图形数据,在TFT显示屏上显示图形、使用存放在MCU FLASH的英文字库点阵数据和存放在TF卡中的GBK中文字库点阵数据,在TFT上实现中英文的混合显示。主要实现代码如下所示:

 

读取GBK中文汉字字库点阵数据

void FatFs_GetGBK(const char *str, uint8_t *Buffer)
{
    FIL     File;
    FRESULT Result;
    UINT    br = 0;

    uint8_t  GBKH   = str[0];
    uint8_t  GBKL   = str[1];
    uint32_t Offset = 0;

    if(GBKL < 0x7F) Offset = ((GBKH - 0x81) * 190 + GBKL - 0x40);
    else            Offset = ((GBKH - 0x81) * 190 + GBKL - 0x41);

    Result = f_open(&File, "/GBK_FONT.bin", FA_OPEN_ALWAYS | FA_READ);

    if(Result != RES_OK)
    {
        printf("\r\nf_open Fail! Result = %d\r\n", Result);
    }
    else
    {
        f_lseek(&File, Offset * 32);

        Result = f_read(&File, Buffer, 32, &br);

        f_close(&File);
    }
}

 

显示图片

void LCD_DrawImage(void)
{
    uint16_t Color = 0;
    uint32_t Index = 8;

    for(uint32_t i = 0; i < 30; i++)
    {
        for(uint32_t j = 0; j < 113; j++)
        {
            Color   = gImage_LOGO[Index++];
            Color <<= 8;
            Color  |= gImage_LOGO[Index++];

            TFT_DrawPoint(64 + j, 30 + i, Color);
        }
    }

    Index = 8;

    for(uint32_t i = 0; i < 40; i++)
    {
        for(uint32_t j = 0; j < 135; j++)
        {
            Color   = gImage_EEWORLD[Index++];
            Color <<= 8;
            Color  |= gImage_EEWORLD[Index++];

            TFT_DrawPoint(52 + j, 100 + i, Color);
        }
    }
}

 

显示中英文

void TFT_DrawEN(uint16_t StartX, uint16_t StartY, char ch)
{  
    uint8_t  Data  = 0;
    uint16_t Color = 0;

    for(uint8_t i = 0; i < 16; i++)
    {
        Data = ASCII_1608[ch - 32][i];

        for(uint8_t j = 0; j < 8; j++)
        {
            if((Data >> j) & 0x01) Color = TFT_Forecolor;
            else                   Color = BACKCOLOR;

            TFT_DrawPoint(StartX + j, StartY + i, Color);
        }
    }
}

void TFT_DrawCN(uint16_t StartX, uint16_t StartY, const char *str)
{
    uint8_t Buffer[32];
    uint8_t Array[16][16];
    uint8_t Point[16][16];

    FatFs_GetGBK(str, Buffer);

    for(uint8_t i = 0; i < 8; i++)
    {
        for(uint8_t j = 0; j < 4; j++)
        {
            uint8_t Data = Buffer[i*4+j];

            for(uint8_t k = 0; k < 4; k++)
            {
                if(Data & (0x08 >> (k-0)))  Array[i*2+0][j*4+k-0] = 1;
                else                        Array[i*2+0][j*4+k-0] = 0;
            }

            for(uint8_t k = 4; k < 8; k++)
            {
                if(Data & (0x80 >> (k-4)))  Array[i*2+1][j*4+k-4] = 1;
                else                        Array[i*2+1][j*4+k-4] = 0;
            }
        }
    }

    for(uint8_t i = 0; i < 16; i++)
    {
        for(uint8_t j = 0; j < 16; j++)
        {
            Point[i][j] = Array[j][15-i];
        }
    }

    for(uint8_t i = 0; i < 16; i++)
    {
        for(uint8_t j = 0; j < 16; j++)
        {
            if(Point[15-i][j])
            {
                TFT_DrawPoint(StartX+i, StartY+j, TFT_Forecolor);
            }
            else
            {
                TFT_DrawPoint(StartX+i, StartY+j, BACKCOLOR);
            }
        }
    }
}

void TFT_ShowLOG(uint16_t StartX, uint16_t StartY, const char *str)
{
    while(*str != '\0')
    {
        if(*str < 0x7F)
        {
            if(StartX > (240 - 8))
            {
                StartX = 0; StartY += 16;
            }

            if(StartY > (320 - 16))
            {
                StartX = 0; StartY = 0;

                TFT_ClearScreen(BACKCOLOR);
            }

            TFT_DrawEN(StartX, StartY, *str);

            StartX += 0x08;
            str    += 0x01;
        }
        else
        {
            if(StartX > (240 - 16))
            {
                StartX = 0; StartY += 16;
            }

            if(StartY > (320 - 16))
            {
                StartX = 0; StartY = 0;

                TFT_ClearScreen(BACKCOLOR);
            }

            TFT_DrawCN(StartX, StartY,  str);

            StartX += 0x10;
            str    += 0x02;
        }
    }
}

 

其它比如SPI的配置、TFT显示屏的驱动及配置、TF卡的读写操作、FATFS文件系统的移植等等代码,具体可以参考附件中的软件工程源代码。

 

运行效果

 

附件

软件工程源代码: Template_TFT.zip (2.54 MB, 下载次数: 37)

最新回复

不错  详情 回复 发表于 2022-12-15 10:07

赞赏

1

查看全部赞赏

点赞 关注
个人签名We are a team and we work as a team !
 
 

回复
举报

221

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
SPI接口可工作于主机或从机模式,支持全双工、单工高速通讯模式,具有硬件CRC计算并可配置多主机模式 学习
 
 
 

回复

1706

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
刷屏速率多大呢?

点评

当前整屏刷肯定会有明显的感觉,本文主要是实现驱动、显示图片、以及中英文混合显示,没有测试过刷新速率,再加上是使用杜绑线的接引方式,所以在通讯速率上肯定会的影响;想要测试还是需要做一块显示板,配合DMA的  详情 回复 发表于 2022-7-18 15:47
 
 
 

回复

208

帖子

0

TA的资源

纯净的硅(初级)

4
 
DavidZH 发表于 2022-7-18 11:55 刷屏速率多大呢?

当前整屏刷肯定会有明显的感觉,本文主要是实现驱动、显示图片、以及中英文混合显示,没有测试过刷新速率,再加上是使用杜绑线的接引方式,所以在通讯速率上肯定会的影响;想要测试还是需要做一块显示板,配合DMA的方式,刷新速率更高。

个人签名We are a team and we work as a team !
 
 
 

回复

7063

帖子

11

TA的资源

版主

5
 
这界面做得非常漂亮呀。
 
 
 

回复

208

帖子

0

TA的资源

纯净的硅(初级)

6
 
lugl4313820 发表于 2022-7-23 21:28 这界面做得非常漂亮呀。

个人签名We are a team and we work as a team !
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

7
 
不错
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表