电路设计
通过N32G455的SPI2与LCD屏幕进行通信,LCD主控为ST7789
软件设计
N32G455 SPI初始化
(根据实际硬件电路设计及IO分配)
LCD 初始化
void lcd_init(void)
{
//************* Start Initial Sequence **********
drv_lcd_wr_reg(0x11); //Sleep out
//Delay 100ms
drv_lcd_wr_reg(0x36); //Memory Data Access Control
drv_lcd_wr_data8(0xA0);
drv_lcd_wr_reg(0x3A); //Interface Pixel Format
drv_lcd_wr_data8(0x05);
drv_lcd_wr_reg(0xB2); //Porch Setting
drv_lcd_wr_data8(0x0C);
drv_lcd_wr_data8(0x0C);
drv_lcd_wr_data8(0x00);
drv_lcd_wr_data8(0x33);
drv_lcd_wr_data8(0x33);
drv_lcd_wr_reg(0xB7); //Gate Control
drv_lcd_wr_data8(0x35);
drv_lcd_wr_reg(0x3A); //Interface Pixel Format
drv_lcd_wr_data8(0x05);
drv_lcd_wr_reg(0xBB); //VCOM Setting
drv_lcd_wr_data8(0x1c);
drv_lcd_wr_reg(0xC0); //LCM Control
drv_lcd_wr_data8(0x2C);
drv_lcd_wr_reg(0xC2); //VDV and VRH Command Enabl
drv_lcd_wr_data8(0x01);
drv_lcd_wr_reg(0xC3); //VRH Set
drv_lcd_wr_data8(0x0b);
drv_lcd_wr_reg(0xC4); //VDV Set
drv_lcd_wr_data8(0x20);
drv_lcd_wr_reg(0xC6); //Frame Rate Control in Nor
drv_lcd_wr_data8(0x0E);
drv_lcd_wr_reg(0xD0); //Power Control
drv_lcd_wr_data8(0xA4);
drv_lcd_wr_data8(0xA1);
//gamma setting
drv_lcd_wr_reg(0xE0);
drv_lcd_wr_data8(0xd0);
drv_lcd_wr_data8(0x00);
drv_lcd_wr_data8(0x03);
drv_lcd_wr_data8(0x09);
drv_lcd_wr_data8(0x13);
drv_lcd_wr_data8(0x1c);
drv_lcd_wr_data8(0x3a);
drv_lcd_wr_data8(0x55);
drv_lcd_wr_data8(0x48);
drv_lcd_wr_data8(0x18);
drv_lcd_wr_data8(0x12);
drv_lcd_wr_data8(0x0e);
drv_lcd_wr_data8(0x19);
drv_lcd_wr_data8(0x1e);
drv_lcd_wr_reg(0xE1);
drv_lcd_wr_data8(0xd0);
drv_lcd_wr_data8(0x00);
drv_lcd_wr_data8(0x03);
drv_lcd_wr_data8(0x09);
drv_lcd_wr_data8(0x05);
drv_lcd_wr_data8(0x25);
drv_lcd_wr_data8(0x3a);
drv_lcd_wr_data8(0x55);
drv_lcd_wr_data8(0x50);
drv_lcd_wr_data8(0x3d);
drv_lcd_wr_data8(0x1c);
drv_lcd_wr_data8(0x1d);
drv_lcd_wr_data8(0x1d);
drv_lcd_wr_data8(0x1e);
drv_lcd_wr_reg(0x29); //Display On
}
LVGL, disp_flush() 接口修改
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
api_lcd_fill(area->x1, area->y1, area->x2, area->y2, (uint16_t*)&color_p->full);
lv_disp_flush_ready(disp_drv);
}
DMA刷新接口修改
void api_lcd_fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend, uint16_t* color)
{
uint16_t color1[1],t=1;
uint32_t num,num1;
num=(xend-xsta+1)*(yend-ysta+1);
drv_lcd_addr_set(xsta,ysta,xend,yend);//设置显示范围
SPI_Enable(LCD_SPI, DISABLE);
SPI_InitType SPI_InitStructure;
SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.DataLen = SPI_DATA_SIZE_16BITS;
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_2;
SPI_InitStructure.FirstBit = SPI_FB_MSB;
SPI_InitStructure.CRCPoly = 7;
SPI_Init(LCD_SPI, &SPI_InitStructure);
SPI_Enable(LCD_SPI, ENABLE);
while(t)
{
if(num>65534)
{
num-=65534
num1=65534;
}
else
{
t=0;
num1=num;
}
DMA_InitType DMA_InitStructure;
DMA_InitStructure.PeriphAddr = (uint32_t)&LCD_SPI->DAT;
DMA_InitStructure.MemAddr = (uint32_t)color;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
DMA_InitStructure.BufSize = num1;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize =
DMA_InitStructure.MemDataSize =
DMA_InitStructure.CircularMode =
DMA_InitStructure.Priority =
DMA_InitStructure.Mem2Mem =
DMA_Init(DMA1_CH5, &DMA_InitStructure); //DMA1_CH5
SPI_I2S_EnableDma(LCD_SPI, SPI_I2S_DMA_TX, ENABLE);
MA_EnableChannel(DMA1_CH5, ENABLE); //DMA1_CH5
while (!DMA_GetFlagStatus(DMA1_FLAG_TC5, DMA1)) //
;
vTaskDelay(1); //该软件使用了FreeROTS;
DMA_ClearFlag(DMA1_FLAG_TC5, DMA1); //DMA1_FLAG_TC
color+=65534;
}
SPI_Enable(LCD_SPI, DISABLE);
SPI_InitType SPI_InitStructure;
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_2;
SPI_InitStructure.FirstBit = SPI_FB_MSB;
SPI_InitStructure.CRCPoly = 7;
SPI_Init(LCD_SPI, &SPI_InitStructure);
SPI_Enable(LCD_SPI, ENABLE);
}
相关函数附:
void drv_lcd_addr_set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
drv_lcd_wr_reg(0x2a);//列地址设置
drv_lcd_wr_data(x1);
drv_lcd_wr_data(x2);
drv_lcd_wr_reg(0x2b);//行地址设置
drv_lcd_wr_data(y1);
drv_lcd_wr_data(y2);
drv_lcd_wr_reg(0x2c);//储存器写
}