【Nation国民】N32G45x DMA驱动刷新SPI接口LCD(移植LVGL)

电路设计

通过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);//储存器写
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值