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

三、程序运行
显示刷屏

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以帮您编写一个 MM32F5270 驱动 RC522 外设的代码。以下是一个简单的示例代码,用于初始化并与 RC522 进行通信。请注意,这只是一个基本框架,您可能需要根据您的具体需求进行修改和完善。 ```c #include "mm32f5270.h" #include "rc522.h" // RC522 接口定义 #define RC522_SPI_PORT SPI1 #define RC522_SPI_CLK RCC_APB2Periph_SPI1 #define RC522_SPI_GPIO_PORT GPIOA #define RC522_SPI_CS_PIN GPIO_Pin_4 #define RC522_SPI_SCK_PIN GPIO_Pin_5 #define RC522_SPI_MISO_PIN GPIO_Pin_6 #define RC522_SPI_MOSI_PIN GPIO_Pin_7 // RC522 初始化 void RC522_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能 SPI 时钟 RCC_APB2PeriphClockCmd(RC522_SPI_CLK, ENABLE); // 配置 SPI 引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = RC522_SPI_SCK_PIN; GPIO_Init(RC522_SPI_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RC522_SPI_MISO_PIN; GPIO_Init(RC522_SPI_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RC522_SPI_MOSI_PIN; GPIO_Init(RC522_SPI_GPIO_PORT, &GPIO_InitStructure); // 配置 CS 引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = RC522_SPI_CS_PIN; GPIO_Init(RC522_SPI_GPIO_PORT, &GPIO_InitStructure); // 初始化 SPI SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(RC522_SPI_PORT, &SPI_InitStructure); SPI_Cmd(RC522_SPI_PORT, ENABLE); } // RC522 发送数据 void RC522_SendByte(uint8_t data) { while (SPI_I2S_GetFlagStatus(RC522_SPI_PORT, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(RC522_SPI_PORT, data); while (SPI_I2S_GetFlagStatus(RC522_SPI_PORT, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(RC522_SPI_PORT); } // RC522 接收数据 uint8_t RC522_ReceiveByte(void) { while (SPI_I2S_GetFlagStatus(RC522_SPI_PORT, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(RC522_SPI_PORT, 0xFF); while (SPI_I2S_GetFlagStatus(RC522_SPI_PORT, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(RC522_SPI_PORT); } // RC522 读取寄存器 uint8_t RC522_ReadReg(uint8_t addr) { uint8_t value; GPIO_ResetBits(RC522_SPI_GPIO_PORT, RC522_SPI_CS_PIN); RC522_SendByte((addr << 1) | 0x80); value = RC522_ReceiveByte(); GPIO_SetBits(RC522_SPI_GPIO_PORT, RC522_SPI_CS_PIN); return value; } // RC522 写入寄存器 void RC522_WriteReg(uint8_t addr, uint8_t value) { GPIO_ResetBits(RC522_SPI_GPIO_PORT, RC522_SPI_CS_PIN); RC522_SendByte(addr << 1); RC522_SendByte(value); GPIO_SetBits(RC522_SPI_GPIO_PORT, RC522_SPI_CS_PIN); } ``` 请注意,此代码仅涵盖了基本的初始化和读写寄存器操作。具体的功能和应用逻辑需要根据您的需求进行补充和修改。同时,还需要根据您的硬件连接情况进行相应的配置。 希望对您有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值