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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 467|回复: 0

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

[复制链接]
发表于 2026-1-28 09:01:42 | 显示全部楼层 |阅读模式

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

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

×
[mw_shl_code=applescript,true]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);
}


[/mw_shl_code]



[mw_shl_code=applescript,true]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);
                       

}[/mw_shl_code]

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

本版积分规则

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

GMT+8, 2026-6-21 03:20

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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