欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28|回复: 0

LVGL显示驱动对接硬件SPI+DMA方式

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[AppleScript] 纯文本查看 复制代码
void LCD_LVGL_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, lv_color_t *color)
{
			// 计算参数
			u16 width = ex - sx + 1;
			u16 height = ey - sy + 1;
			u32 num = width * height;

			if(num == 0) return;

			// 设置显示范围
			LCD_Address_Set(sx, sy, ex, ey);

			LCD_CS_Clr();
			// 保存并设置SPI为16位模式
			uint16_t spi_cr1_backup = SPI1->CR1;
			SPI1->CR1 |= SPI_CR1_DFF;
			SPI_Cmd(SPI1, DISABLE);
			SPI_Cmd(SPI1, ENABLE);

			// 只更新每次传输变化的参数
			DMA1_Channel3->CMAR = (uint32_t)color;      // 内存地址
			DMA1_Channel3->CNDTR = num;                 // 传输数量

			
			DMA_ClearFlag(DMA1_FLAG_TC3);// 清除标志

			
			DMA_Cmd(DMA1_Channel3, ENABLE);// 按正确顺序启动
			SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);

			
			while(DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET);// 等待传输完成

			// 清理
			SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, DISABLE);
			DMA_Cmd(DMA1_Channel3, DISABLE);

			// 恢复SPI
			SPI1->CR1 = spi_cr1_backup;
			SPI_Cmd(SPI1, DISABLE);
			SPI_Cmd(SPI1, ENABLE);

			LCD_CS_Set();
}


static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
		LCD_LVGL_Color_Fill(area->x1,area->y1,area->x2,area->y2,color_p); 
		lv_disp_flush_ready(disp_drv);
}






[AppleScript] 纯文本查看 复制代码
void lcd_lvgl_dma_init()
{
			static DMA_InitTypeDef DMA_InitStructure;
			RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

			DMA_DeInit(DMA1_Channel3);

			DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
			DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
			DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
			DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
			DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
			DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
			DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

			// 这些参数每次传输都需要更新
			DMA_InitStructure.DMA_MemoryBaseAddr = 0;  // 临时值
			DMA_InitStructure.DMA_BufferSize = 0;      // 临时值
			DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

			DMA_Init(DMA1_Channel3, &DMA_InitStructure);
			

}


使用时候必须初始化lcd_lvgl_dma_init(),只需要在程序的开始初始化一次即可
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2026-2-4 08:44

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表