STM32F767 FSMC驱动8位LCD显示屏
ili9342_lcd.c:
#include "ili9342_lcd.h"
#include "stdlib.h"
#include "ili9342_font.h"
#include "usart.h"
#include "delay.h"
SRAM_HandleTypeDef SRAM_Handler;
u32 POINT_COLOR=0xFF000000;
u32 BACK_COLOR =0xFFFFFFFF;
_lcd_dev lcddev;
void LCD_WR_REG(uint8_t regval)
{
regval=regval;
LCD->LCD_REG=regval;
}
void LCD_WR_DATA_8BIT(uint8_t data)
{
data=data;
LCD->LCD_RAM=data;
}
uint8_t LCD_RD_DATA(void)
{
uint8_t ram;
ram=LCD->LCD_RAM;
return ram;
}
uint16_t LCD_GET_ID(void)
{
uint16_t id=0;
LCD_WR_REG(0xD3);
LCD_RD_DATA();
LCD_RD_DATA();
id|=LCD_RD_DATA();
id<<=8;
id|=LCD_RD_DATA();
return id;
}
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
LCD_WR_REG(0x2a);
LCD_WR_DATA_8BIT(x1);
LCD_WR_DATA_8BIT(x2);
LCD_WR_REG(0x2b);
LCD_WR_DATA_8BIT(y1);
LCD_WR_DATA_8BIT(y2);
LCD_WR_REG(0x2c);
}
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA_8BIT(Xpos);
LCD_WR_REG(0x2B);
LCD_WR_DATA_8BIT(Ypos);
LCD_WR_REG(0x2C);
}
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_Address_Set(x,y,x,y);
LCD->LCD_REG=0x2C;
LCD->LCD_RAM=POINT_COLOR>>8;
LCD->LCD_RAM=POINT_COLOR;
}
void LCD_Fast_DrawPoint(u16 x,u16 y,u32 color)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA_8BIT(x>>8);
LCD_WR_DATA_8BIT(x&0XFF);
LCD_WR_REG(0x2B);
LCD_WR_DATA_8BIT(y>>8);
LCD_WR_DATA_8BIT(y&0XFF);
LCD->LCD_REG=0x2C;
LCD->LCD_RAM=color>>8;
LCD->LCD_RAM=color;
}
void opt_delay(u8 i)
{
while(i--);
}
u32 LCD_ReadPoint(u16 x,u16 y)
{
u16 r=0,g=0,b=0,rgb=0;
LCD_Address_Set(x, y, x, y);
LCD_WR_REG(0X2E);
r=LCD_RD_DATA();
r=LCD_RD_DATA();
g=LCD_RD_DATA();
b=LCD_RD_DATA();
r=(r<<8)&0xF800;
g=(g<<3)&0x07E0;
b=(b>>3)&0x001F;
rgb=r|g|b;
return rgb;
}
void LCD_MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_Initure;
HAL_MPU_Disable();
MPU_Initure.Enable=MPU_REGION_ENABLE;
MPU_Initure.Number=LCD_REGION_NUMBER;
MPU_Initure.BaseAddress=LCD_ADDRESS_START;
MPU_Initure.Size=LCD_REGION_SIZE;
MPU_Initure.SubRegionDisable=0X00;
MPU_Initure.TypeExtField=MPU_TEX_LEVEL0;
MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS;
MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;
MPU_Initure.IsShareable=MPU_ACCESS_NOT_SHAREABLE;
MPU_Initure.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
MPU_Initure.IsBufferable=MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_Initure);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_FMC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|\
GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
GPIO_Initure.Alternate=GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|\
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
void ILI9342_LCD_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_5;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
LCD_MPU_Config();
SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;
SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;
SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1;
SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE;
SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;
SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_8;
SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE;
SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;
SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;
SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;
SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;
SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;
SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;
SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;
SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
FSMC_ReadWriteTim.AddressSetupTime=0x11;
FSMC_ReadWriteTim.AddressHoldTime=0x00;
FSMC_ReadWriteTim.DataSetupTime=0x55;
FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;
FSMC_WriteTim.AddressSetupTime=0x15;
FSMC_WriteTim.AddressHoldTime=0x00;
FSMC_WriteTim.DataSetupTime=0x15;
FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;
HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);
delay_ms(50);
lcddev.id=LCD_GET_ID();
lcddev.width=320;
lcddev.height=240;
if(lcddev.id==0x9342)
{
LCD_WR_REG(0xC8);
LCD_WR_DATA_8BIT(0xFF);
LCD_WR_DATA_8BIT(0x93);
LCD_WR_DATA_8BIT(0x42);
LCD_WR_REG(0xb6);
LCD_WR_DATA_8BIT(0x0a);
LCD_WR_DATA_8BIT(0xE0);
LCD_WR_REG(0x36);
LCD_WR_DATA_8BIT(0x08);
LCD_WR_REG(0x3A);
LCD_WR_DATA_8BIT(0x55);
LCD_WR_REG(0xC0);
LCD_WR_DATA_8BIT(0x12);
LCD_WR_DATA_8BIT(0x12);
LCD_WR_REG(0xC1);
LCD_WR_DATA_8BIT(0x04);
LCD_WR_REG(0xC5);
LCD_WR_DATA_8BIT(0XFD);
LCD_WR_REG(0xB1);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x1B);
LCD_WR_REG(0xB4);
LCD_WR_DATA_8BIT(0x02);
LCD_WR_REG(0xE0);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x05);
LCD_WR_DATA_8BIT(0x08);
LCD_WR_DATA_8BIT(0x04);
LCD_WR_DATA_8BIT(0x13);
LCD_WR_DATA_8BIT(0x0A);
LCD_WR_DATA_8BIT(0x34);
LCD_WR_DATA_8BIT(0x8A);
LCD_WR_DATA_8BIT(0x46);
LCD_WR_DATA_8BIT(0x07);
LCD_WR_DATA_8BIT(0x0E);
LCD_WR_DATA_8BIT(0x0A);
LCD_WR_DATA_8BIT(0x1B);
LCD_WR_DATA_8BIT(0x1D);
LCD_WR_DATA_8BIT(0x0F);
LCD_WR_REG(0xE1);
LCD_WR_DATA_8BIT(0x0C);
LCD_WR_DATA_8BIT(0x05);
LCD_WR_DATA_8BIT(0x08);
LCD_WR_DATA_8BIT(0x04);
LCD_WR_DATA_8BIT(0x13);
LCD_WR_DATA_8BIT(0x0A);
LCD_WR_DATA_8BIT(0x34);
LCD_WR_DATA_8BIT(0x8A);
LCD_WR_DATA_8BIT(0x46);
LCD_WR_DATA_8BIT(0x07);
LCD_WR_DATA_8BIT(0x0E);
LCD_WR_DATA_8BIT(0x0A);
LCD_WR_DATA_8BIT(0x1B);
LCD_WR_DATA_8BIT(0x1D);
LCD_WR_DATA_8BIT(0x0F);
LCD_WR_REG(0x21);
LCD_WR_REG(0x2A);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x01);
LCD_WR_DATA_8BIT(0x3F);
LCD_WR_REG(0x2B);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0x00);
LCD_WR_DATA_8BIT(0xEF);
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
LCD_WR_REG(0x2c);
LCD_Clear(WHITE);
}
}
/******************************************************************************
函数说明:LCD清屏函数
入口数据:无
返回值: 无
******************************************************************************/
void LCD_Clear(u16 Color)
{
u16 i,j;
LCD_SetCursor(0,0);
for(i=0;i<lcddev.width;i++)
{
for (j=0;j<lcddev.height;j++)
{
LCD_WR_DATA_8BIT(Color>>8);
LCD_WR_DATA_8BIT(Color);
}
}
}
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{
u16 i,j;
LCD_Address_Set(xsta,ysta,xend,yend);
for(i=xsta;i<xend;i++)
{
for(j=ysta;j<yend;j++)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA_8BIT(i>>8);
LCD_WR_DATA_8BIT(i&0XFF);
LCD_WR_REG(0x2B);
LCD_WR_DATA_8BIT(j>>8);
LCD_WR_DATA_8BIT(j&0XFF);
LCD->LCD_REG=0x2C;
LCD->LCD_RAM=color>>8;
LCD->LCD_RAM=color;
}
}
}
ILI9342.h:
#ifndef __ILI9342_LCD_H
#define __ILI9342_LCD_H
#include "sys.h"
#include "stdlib.h"
typedef struct
{
u16 width;
u16 height;
u16 id;
u8 dir;
u16 wramcmd;
u16 setxcmd;
u16 setycmd;
}_lcd_dev;
extern _lcd_dev lcddev;
extern u32 POINT_COLOR;
extern u32 BACK_COLOR;
#define LCD_REGION_NUMBER MPU_REGION_NUMBER0
#define LCD_ADDRESS_START (0X60000000)
#define LCD_REGION_SIZE MPU_REGION_SIZE_256MB
#define LCD_LED(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET))
typedef struct
{
__IO uint8_t LCD_REG;
__IO uint8_t LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((uint32_t)(0x60000000 | 0x0003ffff))
#define LCD ((LCD_TypeDef *) LCD_BASE)
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40
#define BRRED 0XFC07
#define GRAY 0X8430
#define DARKBLUE 0X01CF
#define LIGHTBLUE 0X7D7C
#define GRAYBLUE 0X5458
#define LIGHTGREEN 0X841F
#define LGRAY 0XC618
#define LGRAYBLUE 0XA651
#define LBBLUE 0X2B12
void LCD_WR_REG(uint8_t regval);
void LCD_WR_DATA_8BIT(uint8_t data);
uint8_t LCD_RD_DATA(void);
uint16_t LCD_GET_ID(void);
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);
void LCD_SetCursor(u16 Xpos, u16 Ypos);
void LCD_DrawPoint(u16 x,u16 y);
void LCD_Fast_DrawPoint(u16 x,u16 y,u32 color);
void opt_delay(u8 i);
u32 LCD_ReadPoint(u16 x,u16 y);
void LCD_MPU_Config(void);
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram);
void ILI9342_LCD_Init(void);
void LCD_Clear(u16 Color);
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);
u32 LCD_Pow(u8 m,u8 n);
void LCD_DrawLine2(u16 x1, u16 y1, u16 x2, u16 y2, u16 size, u16 color);
void gui_circle(int xc, int yc,u16 c,int r, int fill);
void _draw_circle_8(int xc, int yc, int x, int y, u16 c);
#endif