STM32F407使用DMA加速刷新LVGL

这篇具有很好参考价值的文章主要介绍了STM32F407使用DMA加速刷新LVGL。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本人使用国产的实时操作系统RT-thread,屏幕使用的TFTLCD,屏幕IC是LIL9341

这里就不讲移植了,如果需要,请评论,后面出;

前提:移植好LCD,移植好LVGL(不适用DMA能正常显示)
  1. 使用STM32Cubemax配置DMA

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

上图中,Burst Size的具体配置根据芯片参考手册来选择,如果要用FIFO的话就需要选择

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

因为LVGL需要屏幕数据传输完后通知一下LVGL,所以这里要启用DMA中断

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

2、添加代码

2.1、注册DMA中断
/*
*注册的是传输完成中断
*具体注册的中断服务函数在lv_port_disp.c中
*/
HAL_DMA_RegisterCallback(&hdma_memtomem_dma2_stream7, HAL_DMA_XFER_CPLT_CB_ID, LVGL_LCD_FSMC_DMA_pCallback);
lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档
2.2、lv_port_disp.c中添加代码
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
		LCD_Address_Set(area->x1,area->y1,area->x2,area->y2); //<盖函数是设置LCD屏幕的扫描区域
		HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream7, (uint32_t)color_p, (uint32_t)&LCD->LCD_RAM,
																	((area->x2+1) - area->x1) * ((area->y2+1) - area->y1));
}

void LVGL_LCD_FSMC_DMA_pCallback(DMA_HandleTypeDef *_hdma)
{
	lv_disp_flush_ready(&disp_drv1);
}
/* 在LCD驱动文件中添加 */
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
  LCD_WR_REG(0x2a);//列地址设置
  LCD_WR_DATA(x1>>8);
  LCD_WR_DATA(x1&0x00ff);
  LCD_WR_DATA(x2>>8);
  LCD_WR_DATA(x2&0x00ff);
  LCD_WR_REG(0x2b);//行地址设置
  LCD_WR_DATA(y1>>8);
  LCD_WR_DATA(y1&0x00ff);
  LCD_WR_DATA(y2>>8);
  LCD_WR_DATA(y2&0x00ff);
  LCD_WR_REG(0x2c);//储存器写(2C命令之后开始写颜色数据)
}
lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档
2.3、void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)讲解
2.3.1、列地址设置指令

指令:0X2A

列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标):

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。

一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

2.3.2、页地址设置指令

指令:0X2B

页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标):

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。

一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

2.3.3、写 GRAM 指令

指令:0X2C

写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写:

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCD GRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。

成功!!! 很丝滑!!

lvgl dma,LVGL移植,arm,stm32,Powered by 金山文档

开源地址:STM32F407使用DMA加速LVGL: STM32F407使用DMA加速LVGL (gitee.com)

基于单片指纹考勤系统设计(项目中还是有很多BUG,不够完善):基于单片机的指纹考勤系统设计-RT-Thread-LVGL: 基于单片机得指纹考勤系统 (gitee.com)文章来源地址https://www.toymoban.com/news/detail-822214.html

到了这里,关于STM32F407使用DMA加速刷新LVGL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32F407学习DAY.14 在DMA模式下进行USART串口数据收发(正点原子例程为例)

    目录 一、DMA配置 1、DMA1和DMA2的请求映射 2、DMA挂载总线 3、DMA相关库函数 ​4、DMA配置过程(以串口1为例) 1)进行时钟使能 2)等待DMA可配置 3)初始化DMA(串口1的TX为DMA2 数据流7 通道4,RX为DMA2 数据流5 通道4) a.DMA外设地址par: b.DMA存储器0地址mar: c.数据传输量ndtr: 4)

    2024年02月04日
    浏览(22)
  • STM32F407 --USART使用

    目录 1. 串口配置--普通模式 2. 实现数据的传输主函数 1)单引号双引号的应用数组传输 2)将调试信息用串口打印传送到电脑上 1. 串口配置--普通模式 F407使用的M4内核与F103使用的M3内核不一样,导致在使用配置上有区别。需要在F103配置的基础上专门将GPIO的PIN配置成复用功能

    2024年02月16日
    浏览(19)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(29)
  • stm32f407 st-link v2的正确使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、安装ST-LINK/V2 二、使用步骤 1.接线 2.配置 总结 之前一直在用串口下载,比较麻烦。在淘宝上看到10多块的ST-LINK/V2下载器,小巧,接线少,还可以在线调试。但是到货后使用却一直连不上,

    2024年02月15日
    浏览(22)
  • RT-Thread使用PWM实现灯亮度调节——STM32F407

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RT-Thread使用PWM实现灯亮度调节——STM32F407ZG 作为新入门的嵌入式选手,最近在学习RT-Thread操作系统,鉴于自己健忘的记性,打算记录下来后面好回顾学习。 今天要总结的是RT-Thread使用PWM实现灯亮度调节

    2024年02月15日
    浏览(14)
  • STM32F407的介绍

    内核 32位 高性能ARM Cortex-M4处理器 时钟: 高达168MHz,实际还可以超频一点点 stm32f407的主频通过PLL倍频后能够达到168MHz,而且芯片内置一个16MHz的晶振和一个32KHz的晶振,可以满足不同功耗的需求。 支持FPU(浮点运算)和DSP指令 144引脚 114个IO口 存储器容量: 1024K FLASH, 192K

    2024年02月10日
    浏览(21)
  • STM32F407——串口通信

    本文将对串口通信的分类和基于 stm32 的串口配置进行介绍,以及如何使用串口调试助手进行串口收发功能的调试,旨在帮助还不会使用 stm32 单片机串口资源进行通信的家人们快速学会如何使用串口来进行通信。 (纯干货、快速上手、零基础也能会!!!) (1)串口,即串

    2023年04月08日
    浏览(19)
  • STM32F407的时钟

    时钟源用来为环形脉冲发生器提供频率稳定且电平匹配的方波时钟脉冲信号。它通常由石英 晶体振荡器和与非门组成的正反馈振荡电路组成,其输出送至环形脉冲发生器。 F4开发指南P107 F4开发指南P108 HSI高速内部时钟源 High Speed Internal。RC 振荡器,频率为 16MHz。可以直接作为

    2024年02月10日
    浏览(24)
  • 初识 STM32和STM32F407简介

    2007 年 6 月,ST 在北京发布了全球第一款基于 ARM Cortex M3 内核的 32 位通用微控制 器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣 惊人,一发不可收拾,截止到 2020 年 6 月,STM32 累计出货量超过 45 亿颗。 战舰开发板使用的 STM32F103ZET6

    2023年04月08日
    浏览(20)
  • STM32F407的PWM

    泉水 STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。 高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。 通用定时器也能同时产生多达 4路的 PWM 输出 STM32F407 最多可以同时产生 30 路 PWM 输出! 这里我们仅利用 TIM14的 CH1 产生一路 PWM 输出。 如上所

    2024年02月17日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包