一、概述
MM32F5370微控制器搭载了由安谋科技授权的ARMv8-M架构“星辰”STAR-MC1(兼容Cortex-M33)处理器,内置L1 ICache、DCache,同时具备高性能和低功耗的特点,最高工作频率可达180MHz。Mini-F5375-OB开发板的核心主控MM32F5375G7PV外设资源丰富,同类型中的资源对比信息如下图:
二、环境搭建
通过技术社区提供的链接地址:https://aijishu.com/a/1060000000507645获取到板卡的资料包,用的Keil开发平台,则需要移步KEIL Pack获取板间支持包。这里笔者基于Keil v5.38版本的工具开发,因此首先安装好关于该板卡的pack包(如采用IAR开发,则需部署IAR Pack包)。
然后将下载好的例程包解压出来,使用Keil打开“GPIO_LED_Toggle”例程,直接编译通过,接着结合原理图来设置LED的管脚。
因此将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);
}
}`
执行上述代码,点灯呈现如下:
三、驱动LCD屏
此次采用ST7735的1.44寸TFT-LCD屏,由于时间关系,暂且用GPIO口模拟SPI通讯方式进行驱动,后续再使用硬件方式驱动。
移植相关驱动接口代码,部分展示如下:
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代码,这里就不再赘述。