青蜂侠 · 3 天前

【Mini-F5375-OB开发板评测】驱动TFT屏

一、概述

MM32F5370微控制器搭载了由安谋科技授权的ARMv8-M架构“星辰”STAR-MC1(兼容Cortex-M33)处理器,内置L1 ICache、DCache,同时具备高性能和低功耗的特点,最高工作频率可达180MHz。Mini-F5375-OB开发板的核心主控MM32F5375G7PV外设资源丰富,同类型中的资源对比信息如下图:
同系列对比.png

二、环境搭建

通过技术社区提供的链接地址:https://aijishu.com/a/1060000000507645获取到板卡的资料包,用的Keil开发平台,则需要移步KEIL Pack获取板间支持包。这里笔者基于Keil v5.38版本的工具开发,因此首先安装好关于该板卡的pack包(如采用IAR开发,则需部署IAR Pack包)。
安装pack包.png
然后将下载好的例程包解压出来,使用Keil打开“GPIO_LED_Toggle”例程,直接编译通过,接着结合原理图来设置LED的管脚。
LED管脚分布.png
因此将GPIO的配置初始化与GPIO_LED_Toggle_Sample()中的while(1)中代码稍作修改即可,这里就不展开描述。
使用一根接口接触良好的TypeA转TypeC数据线,一端接入开发板的USB-DBG接口中,一端连入电脑,电脑正确识别到后自动弹出名为“MINI-F5375”,类似16MB的U盘,说明硬件驱动安装成功,Keil可以选“CMSIS-DAP” Debug进行下载调试。如果数据线接触不良,则可能会识别不到该调试接口。
`void GPIO_LED_Toggle_Sample(void)
{

printf("\r\nTest %s", __FUNCTION__);
GPIO_Configure();
while (1)
{
    GPIO_IO_Toggle(GPIOB, GPIO_Pin_14);
    GPIO_IO_Toggle(GPIOB, GPIO_Pin_15);
    PLATFORM_DelayMS(300);
}

}`

执行上述代码,点灯呈现如下:
点灯.gif

三、驱动LCD屏

此次采用ST7735的1.44寸TFT-LCD屏,由于时间关系,暂且用GPIO口模拟SPI通讯方式进行驱动,后续再使用硬件方式驱动。
管脚连接关系.png
移植相关驱动接口代码,部分展示如下:
lcd_init.h中修改管脚的宏定义

#define BOARD_LCD_BLK_GPIO                         GPIOA
#define BOARD_LCD_GPIO_BLK_PIN              GPIO_Pin_1

#define BOARD_LCD_RES_GPIO                         GPIOA
#define BOARD_LCD_GPIO_RES_PIN              GPIO_Pin_2

#define BOARD_LCD_DC_GPIO                         GPIOA
#define BOARD_LCD_GPIO_DC_PIN               GPIO_Pin_3

#define BOARD_LCD_CS_GPIO                         GPIOA
#define BOARD_LCD_GPIO_CS_PIN               GPIO_Pin_4

#define BOARD_LCD_SCLK_GPIO                     GPIOA
#define BOARD_LCD_GPIO_SCLK_PIN             GPIO_Pin_5

#define BOARD_LCD_MOSI_GPIO                     GPIOA
#define BOARD_LCD_GPIO_MOSI_PIN             GPIO_Pin_7

//-----------------LCD端口定义----------------

#define LCD_BLK_Clr()  GPIO_ResetBits(BOARD_LCD_BLK_GPIO,BOARD_LCD_GPIO_BLK_PIN)//BLK
#define LCD_BLK_Set()  GPIO_SetBits(BOARD_LCD_BLK_GPIO,BOARD_LCD_GPIO_BLK_PIN)

#define LCD_RES_Clr()  GPIO_ResetBits(BOARD_LCD_RES_GPIO,BOARD_LCD_GPIO_RES_PIN)//RES
#define LCD_RES_Set()  GPIO_SetBits(BOARD_LCD_RES_GPIO,BOARD_LCD_GPIO_RES_PIN)

#define LCD_DC_Clr()   GPIO_ResetBits(BOARD_LCD_DC_GPIO,BOARD_LCD_GPIO_DC_PIN)//DC
#define LCD_DC_Set()   GPIO_SetBits(BOARD_LCD_DC_GPIO,BOARD_LCD_GPIO_DC_PIN)

#define LCD_CS_Clr()   GPIO_ResetBits(BOARD_LCD_CS_GPIO,BOARD_LCD_GPIO_CS_PIN)//CS
#define LCD_CS_Set()   GPIO_SetBits(BOARD_LCD_CS_GPIO,BOARD_LCD_GPIO_CS_PIN)

#define LCD_SCLK_Clr() GPIO_ResetBits(BOARD_LCD_SCLK_GPIO,BOARD_LCD_GPIO_SCLK_PIN)//SCLK
#define LCD_SCLK_Set() GPIO_SetBits(BOARD_LCD_SCLK_GPIO,BOARD_LCD_GPIO_SCLK_PIN)

#define LCD_MOSI_Clr() GPIO_ResetBits(BOARD_LCD_MOSI_GPIO,BOARD_LCD_GPIO_MOSI_PIN)//MOSI
#define LCD_MOSI_Set() GPIO_SetBits(BOARD_LCD_MOSI_GPIO,BOARD_LCD_GPIO_MOSI_PIN)

lcd_init.c中修改LCD_Init()相关GPIO的初始化

void LCD_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;

   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_BLK_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
    
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_RES_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
    
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_DC_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
    
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_CS_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
     
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_SCLK_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
     
   GPIO_InitStruct.GPIO_Pin   = BOARD_LCD_GPIO_MOSI_PIN;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    LCD_RES_Clr();
    PLATFORM_DelayMS(10);
    LCD_RES_Set();
    PLATFORM_DelayMS(10);
    LCD_BLK_Set();
    PLATFORM_DelayMS(120);
    LCD_WR_REG(0x11);
    PLATFORM_DelayMS(120);              
    LCD_WR_REG(0xB1); 
    LCD_WR_DATA8(0x05); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_REG(0xB2); 
    LCD_WR_DATA8(0x05);
    LCD_WR_DATA8(0x3C); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_REG(0xB3); 
    LCD_WR_DATA8(0x05); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_DATA8(0x05); 
    LCD_WR_DATA8(0x3C); 
    LCD_WR_DATA8(0x3C); 
     
    LCD_WR_REG(0xB4); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_REG(0xC0); 
    LCD_WR_DATA8(0x28); 
    LCD_WR_DATA8(0x08); 
    LCD_WR_DATA8(0x04); 
    LCD_WR_REG(0xC1); 
    LCD_WR_DATA8(0XC0); 
    LCD_WR_REG(0xC2); 
    LCD_WR_DATA8(0x0D); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_REG(0xC3); 
    LCD_WR_DATA8(0x8D); 
    LCD_WR_DATA8(0x2A); 
    LCD_WR_REG(0xC4); 
    LCD_WR_DATA8(0x8D); 
    LCD_WR_DATA8(0xEE); 
    LCD_WR_REG(0xC5); 
    LCD_WR_DATA8(0x1A); 
    LCD_WR_REG(0x36); 
    if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
    else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
    else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
    else LCD_WR_DATA8(0xA0); 
    LCD_WR_REG(0xE0); 
    LCD_WR_DATA8(0x04); 
    LCD_WR_DATA8(0x22); 
    LCD_WR_DATA8(0x07); 
    LCD_WR_DATA8(0x0A); 
    LCD_WR_DATA8(0x2E); 
    LCD_WR_DATA8(0x30); 
    LCD_WR_DATA8(0x25); 
    LCD_WR_DATA8(0x2A); 
    LCD_WR_DATA8(0x28); 
    LCD_WR_DATA8(0x26); 
    LCD_WR_DATA8(0x2E); 
    LCD_WR_DATA8(0x3A); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x03); 
    LCD_WR_DATA8(0x13); 
    LCD_WR_REG(0xE1); 
    LCD_WR_DATA8(0x04); 
    LCD_WR_DATA8(0x16); 
    LCD_WR_DATA8(0x06); 
    LCD_WR_DATA8(0x0D); 
    LCD_WR_DATA8(0x2D); 
    LCD_WR_DATA8(0x26); 
    LCD_WR_DATA8(0x23); 
    LCD_WR_DATA8(0x27); 
    LCD_WR_DATA8(0x27); 
    LCD_WR_DATA8(0x25); 
    LCD_WR_DATA8(0x2D); 
    LCD_WR_DATA8(0x3B); 
    LCD_WR_DATA8(0x00); 
    LCD_WR_DATA8(0x01); 
    LCD_WR_DATA8(0x04); 
    LCD_WR_DATA8(0x13); 
    LCD_WR_REG(0x3A); 
    LCD_WR_DATA8(0x05); 
    LCD_WR_REG(0x29); 
} 

其它部分直接使用ST7735屏官方提供的开源代码即可,至此驱动部分移植完成,接下来增加应用代码来验证驱动效果。
main.c中直接加入以下应用代码。

/* Define to prevent recursive inclusion */
#define _MAIN_C_

/* Files include */
#include "platform.h"
#include "gpio_led_toggle.h"
#include "main.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"

typedef struct 
{
    unsigned char Index[2];
    unsigned char Msk[32];
}typFNT_GB16; 

extern const typFNT_GB16 tfont16[];

void Display_title(void)
{
    LCD_ShowIntNum(8,10,2025,4,BLUE,GREEN,16);
    LCD_ShowChinese(40,10,(uint8_t *)&tfont16[0],BLUE,GREEN,16,0); //一
    LCD_ShowChinese(56,10,(uint8_t *)&tfont16[1],BLUE,GREEN,16,0); //起
    LCD_ShowChinese(72,10,(uint8_t *)&tfont16[2],BLUE,GREEN,16,0); //开
    LCD_ShowChinese(88,10,(uint8_t *)&tfont16[3],BLUE,GREEN,16,0); //发
    LCD_ShowChinese(104,10,(uint8_t *)&tfont16[4],BLUE,GREEN,16,0);//灵
    LCD_ShowChinese(8,30,(uint8_t *)&tfont16[5],BLUE,GREEN,16,0);  //动
    LCD_ShowChinese(24,30,(uint8_t *)&tfont16[6],BLUE,GREEN,16,0); //微
    LCD_ShowChinese(40,30,(uint8_t *)&tfont16[13],BLUE,GREEN,16,0);//开
    LCD_ShowChinese(56,30,(uint8_t *)&tfont16[14],BLUE,GREEN,16,0);//发
    LCD_ShowChinese(72,30,(uint8_t *)&tfont16[15],BLUE,GREEN,16,0);//板
    LCD_ShowString(8,50,(uint8_t *)"Mini-F5375-OB",RED,GREEN,16,0);
    
    LCD_ShowString(43,140,(uint8_t *)"2025-06-09",BLUE,GREEN,16,0);
    PLATFORM_DelayMS(100);
}

int main(void)
{
    PLATFORM_Init();

    LCD_Init();
    PLATFORM_DelayMS(200);
    LCD_Fill(0,0,LCD_W,LCD_H,YELLOW);
    PLATFORM_DelayMS(200);
    LCD_Fill(0,0,LCD_W,LCD_H,LGRAY);
    while (1)
    {
        LCD_ShowPicture(12,88,100,32,gImage_1);
        Display_title();
    }
}

当然上述代码中运用到的中文字符内容,需要借助“PCtoLCD2002”与“Img2Lcd”字模图片工具进行转化成C代码,这里就不再赘述。

四、驱屏效果展示

驱屏.jpg

推荐阅读
关注数
1
内容数
2
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息