> 文档中心 > 【MM32F5270开发板试用】+ TFTLCD FSMC方式驱动

【MM32F5270开发板试用】+ TFTLCD FSMC方式驱动


本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:小会

上篇使用IO口方式驱动TFTLCD显示屏,这篇测试使用FSMC例程驱动TFTLCD显示屏。

一、FSMC手册资料

FSMC方式可以驱动多种类型的总线设备,这里显示屏使用的是8080控制方式。

二、代码

主要代码部分如下
2.1、lcd.c

/* * Copyright 2021 MindMotion Microelectronics Co., Ltd. * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */#include "lcd.h"#include "board_init.h"#include "delay.h"extern void LCD_InitHardware(void);extern void LCD_WriteCmd(uint16_t cmd);extern void LCD_WriteData(uint16_t dat);extern uint16_t LCD_ReadData(void);static void lcd_rst(void){    GPIO_SetBits(BOARD_LCD_RST_GPIO_PORT, BOARD_LCD_RST_GPIO_PIN);delay_ms(1);     GPIO_ClearBits(BOARD_LCD_RST_GPIO_PORT, BOARD_LCD_RST_GPIO_PIN);      delay_ms(10);      // This delay time is necessary     GPIO_SetBits(BOARD_LCD_RST_GPIO_PORT, BOARD_LCD_RST_GPIO_PIN);    delay_ms(120);}void LCD_Init(LCD_Init_Type * init){ uint32_t id=0; LCD_InitHardware(); lcd_rst();      LCD_WriteCmd(0x0011); //exit SLEEP mode delay_ms(120); LCD_WriteCmd(0x0036); LCD_WriteData(0x0060);     //MADCTL: memory data access control LCD_WriteCmd(0x003A); LCD_WriteData(0x0005);     //COLMOD: Interface Pixel format *** I use 262K-colors in 18bit/pixel format when using 8-bit interface to allow 3-bytes per pixel    //    TFT_24_7789_Write_Command(0x003A);TFT_24_7789_Write_Data(0x0055);//COLMOD: Interface Pixel format  *** I use 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel LCD_WriteCmd(0x00B2); LCD_WriteData(0x000C); LCD_WriteData(0x000C); LCD_WriteData(0x0000); LCD_WriteData(0x0033); LCD_WriteData(0x0033);     //PORCTRK: Porch setting LCD_WriteCmd(0x00B7); LCD_WriteData(0x0035);     //GCTRL: Gate Control LCD_WriteCmd(0x00BB); LCD_WriteData(0x001c);     //VCOMS: VCOM setting LCD_WriteCmd(0x00C0); LCD_WriteData(0x002C);     //LCMCTRL: LCM Control LCD_WriteCmd(0x00C2); LCD_WriteData(0x0001); LCD_WriteData(0x00FF);     //VDVVRHEN: VDV and VRH Command Enable LCD_WriteCmd(0x00C3); LCD_WriteData(0x000B);     //VRHS: VRH Set LCD_WriteCmd(0x00C4); LCD_WriteData(0x0020);     //VDVS: VDV Set LCD_WriteCmd(0x00C6); LCD_WriteData(0x000F);     //FRCTRL2: Frame Rate control in normal mode LCD_WriteCmd(0x00D0); LCD_WriteData(0x00A4); LCD_WriteData(0x00A1);     //PWCTRL1: Power Control 1 LCD_WriteCmd(0x00E0); LCD_WriteData(0x00D0); LCD_WriteData(0x0000); LCD_WriteData(0x0003); LCD_WriteData(0x0009); LCD_WriteData(0x0013); LCD_WriteData(0x001c); LCD_WriteData(0x003a); LCD_WriteData(0x0055); LCD_WriteData(0x0048); LCD_WriteData(0x0018); LCD_WriteData(0x0012); LCD_WriteData(0x000e); LCD_WriteData(0x0019); LCD_WriteData(0x001e);     //PVGAMCTRL: Positive Voltage Gamma control LCD_WriteCmd(0x00E1); LCD_WriteData(0x00D0); LCD_WriteData(0x0000); LCD_WriteData(0x0003); LCD_WriteData(0x0009); LCD_WriteData(0x0005); LCD_WriteData(0x0025); LCD_WriteData(0x003a); LCD_WriteData(0x0055); LCD_WriteData(0x0050); LCD_WriteData(0x003d); LCD_WriteData(0x001c); LCD_WriteData(0x001d); LCD_WriteData(0x001d); LCD_WriteData(0x001e);      LCD_WriteCmd(0x0029);  //display ON}void LCD_SetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1){    LCD_WriteCmd(0x2a);    LCD_WriteData(x0 >> 8);    LCD_WriteData(x0 & 0xff);    LCD_WriteData(x1 >> 8);    LCD_WriteData(x1 & 0xff);    LCD_WriteCmd(0x2b);    LCD_WriteData(y0 >> 8);    LCD_WriteData(y0 & 0xff);    LCD_WriteData(y1 >> 8);    LCD_WriteData(y1 & 0xff);}void LCD_ClearWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color){    LCD_SetWindow(x0, y0, x1, y1);    LCD_WriteCmd(0x2c);    for(uint32_t i = 0; i <= x1 - x0; i++)    { for(uint32_t j = 0; j <= y1 - y0; j++) {     LCD_WriteData(color); }    }}void LCD_FillWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t * color){    LCD_SetWindow(x0, y0, x1, y1);    LCD_WriteCmd(0x2c);    for(uint32_t i = 0; i <= x1 - x0; i++)    { for(uint32_t j = 0; j <= y1 - y0; j++) {     LCD_WriteData((* color++)); }    }}void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color){    LCD_ClearWindow(x, y, x, y, color);}

2.2、lcd_port.c

/* * Copyright 2021 MindMotion Microelectronics Co., Ltd. * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */#include "lcd.h"#include "board_init.h"void LCD_InitHardware(void){    FSMC_Init_Type fsmc_init =    { .MemType = FSMC_MemType_SRAM, .MemSize = FSMC_MemSize_64MB    };    FSMC_Conf_Type fsmc_conf =    { .ReadPeriod    = 0x1u, .AddrSetTime   = 0x3u, .WriteHoldTime = 0x1u,  .WritePeriod   = 0x2u,  .ReadySignal   = FSMC_ReadySignal_Internal, .SMReadPipe    = 0u, .BusWidth      = FSMC_BusWidth_16b    };    FSMC_Init(BOARD_LCD_FSMC_PORT, 3, &fsmc_init);    FSMC_SetConf(BOARD_LCD_FSMC_PORT, BOARD_LCD_FSMC_SET_INDEX, &fsmc_conf);    FSMC_EnableConf(BOARD_LCD_FSMC_PORT, 3, BOARD_LCD_FSMC_SET_INDEX);    GPIO_WriteBit(BOARD_LCD_BL_GPIO_PORT, BOARD_LCD_BL_GPIO_PIN, 1u); /* enable back light. */}void LCD_WriteCmd(uint16_t cmd){    FSMC_PutData16(BOARD_LCD_FSMC_PORT, 3, 0, cmd);}void LCD_WriteData(uint16_t dat){    FSMC_PutData16(BOARD_LCD_FSMC_PORT, 3, (1u << BOARD_LCD_FSMC_RS_BIT_INDEX), dat);}uint16_t LCD_ReadData(void){    return FSMC_GetData16(BOARD_LCD_FSMC_PORT, 3, (1 << BOARD_LCD_FSMC_RS_BIT_INDEX));}/* EOF. */

2.3、main.c

int main(void){ BOARD_Init(); delay_init(); /* init the lcd. */    LCD_Init_Type lcd_init =    { .DisplayMode = LCD_DisplayMode_Landspace,    };    LCD_Init(&lcd_init); printf("\r\nmm32f5270 test.\r\n"); while(1) {    GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);  delay_ms(100);  GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 0u);  delay_ms(100);LCD_ClearWindow(0u, 0u, BOARD_LCD_HEIGHT-1u, BOARD_LCD_WIDTH-1u, LCD_COLOR_RED); delay_ms(1000);  LCD_ClearWindow(0u, 0u, BOARD_LCD_HEIGHT-1u, BOARD_LCD_WIDTH-1u, LCD_COLOR_GREEN); delay_ms(1000);  LCD_ClearWindow(0u, 0u, BOARD_LCD_HEIGHT-1u, BOARD_LCD_WIDTH-1u, LCD_COLOR_BLUE);  delay_ms(1000);   }}

三、程序运行
显示刷屏

【MM32F5270开发板试用】+ TFTLCD FSMC方式驱动