第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API

发布者:创新思绪最新更新时间:2022-04-28 来源: eefocus关键字:STM32F429  图形加速器  DMA2D  HAL库  API 手机看文章 扫描二维码
随时随地手机看文章

45.1 初学者重要提示

DMA2D是专门用于LCD加速的,特别是刷单色屏,刷图片,刷Alpha(透明)混合效果全靠它,而且可以大大降低CPU利用率。


特别注意,大家只需对HAL库提供的DMA2D操作API有个了解即可,实际工程中,并不使用这些API,我们需要使用更加高效的寄存器直接操作,在下一章节会为大家说明。


45.2 DMA2D基础知识

DMA2D主要实现了两个功能,一个是DMA数据传输功能,另一个是2D图形加速功能。


DMA数据传输

主要是两种方式,一个是寄存器到存储器,另一个是存储器到存储器。通过DMA可以大大降低CPU的利用率。


2D图形加速功能

支持硬件的颜色格式转换和Alpha混合效果。


45.2.1 DMA2D硬件框图

认识一个外设,最好的方式就是看它的框图,方便我们快速地了解DMA2D的基本功能,然后再看手册了解细节。框图如下所示:

将这个硬件框图简化一下,就是下面这样:


下面按照简化的硬件框图,对每个部分做个说明。


45.2.2 DMA2D工作模式

DMA2D支持的工作模式如下:


模式1:寄存器到存储器模式

这个模式主要用于清屏,也即是将显示屏清为单色效果。


模式2:存储器到存储器模式

这个模式用于从一个存储器复制一块数据到另一个存储器,比如将摄像头OV7670的输出图像复制到LCD显存就可以采用这种方式。


模式3:存储器到存储器模式,带颜色格式转换

这个模式比模式2多了一个颜色格式转换,比如我们要显示一幅RGB888颜色格式的位图到RGB565颜色格式的显示屏,就需要用到这个模式,只需输入端配置为RGB888,输出端配置RGB565即可。位图颜色格式转换后会显示到显示屏上。


模式4:存储器到存储器模式,带颜色格式转换和混合

这个模式比模式3多了一个混合操作,通过混合,可以将两种效果进行混合显示。


模式5:存储器到存储器模式,带颜色格式转换和混合,前景色是固定的

同模式4,只是前景色的颜色值是固定的。


45.2.3 前景层和背景层的输入以及颜色格式转换

前景层和背景层是指的用户绘制图形时的前景色和背景色,比如我们显示汉字,字体会有一个颜色,也就是前景色,还有一个背景色。又比如我们绘制两幅图片,想将两幅图片混合,那就可以将一幅图片作为前景层,另一个幅图片作为背景层。


DMA2D支持的输入颜色格式如下,前景层和背景层一样:

前8种颜色格式在第40章的第2小节开头有介绍,这里把后四种做个说明:


L4 (4-bit luminance or CLUT)

4位颜色格式,实际上仅仅是4位索引值,范围0–15,而每个索引值的具体颜色值在查色表CLUT里面存储。


A4和A8

A4和A8用于特定的Alpha模式,既不存储颜色信息,也没有索引值。


这里特别注意一点,输入颜色格式的Alpha值是可以设置的,而且颜色格式里面的R通道和B通道可以交换位置。


45.2.4 前景层和背景层混合

DMA2D混合器用于混合前景色和背景色,这个功能不需要任何配置,仅需要通过DMA2D_CR寄存器使能即可。混合公式如下:


45.2.5 DMA2D输出颜色格式

DMA2D支持的输出颜色格式如下:


45.3 DMA2D的HAL库用法

DMA2D的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置时钟,并根据需要配置NVIC、中断。下面我们逐一展开为大家做个说明。


45.3.1 DMA2D寄存器结构体DMA2D_TypeDef

DMA2D相关的寄存器是通过HAL库中的结构体DMA2D_TypeDef定义的,在stm32h743xx.h中可以找到它们的具体定义:


typedef struct

{

  __IO uint32_t CR;            /*!< DMA2D Control Register,                         Address offset: 0x00 */

  __IO uint32_t ISR;           /*!< DMA2D Interrupt Status Register,                Address offset: 0x04 */

  __IO uint32_t IFCR;          /*!< DMA2D Interrupt Flag Clear Register,            Address offset: 0x08 */

  __IO uint32_t FGMAR;         /*!< DMA2D Foreground Memory Address Register,       Address offset: 0x0C */

  __IO uint32_t FGOR;          /*!< DMA2D Foreground Offset Register,               Address offset: 0x10 */

  __IO uint32_t BGMAR;         /*!< DMA2D Background Memory Address Register,       Address offset: 0x14 */

  __IO uint32_t BGOR;          /*!< DMA2D Background Offset Register,               Address offset: 0x18 */

  __IO uint32_t FGPFCCR;       /*!< DMA2D Foreground PFC Control Register,          Address offset: 0x1C */

  __IO uint32_t FGCOLR;        /*!< DMA2D Foreground Color Register,                Address offset: 0x20 */

  __IO uint32_t BGPFCCR;       /*!< DMA2D Background PFC Control Register,          Address offset: 0x24 */

  __IO uint32_t BGCOLR;        /*!< DMA2D Background Color Register,                Address offset: 0x28 */

  __IO uint32_t FGCMAR;        /*!< DMA2D Foreground CLUT Memory Address Register,  Address offset: 0x2C */

  __IO uint32_t BGCMAR;        /*!< DMA2D Background CLUT Memory Address Register,  Address offset: 0x30 */

  __IO uint32_t OPFCCR;        /*!< DMA2D Output PFC Control Register,              Address offset: 0x34 */

  __IO uint32_t OCOLR;         /*!< DMA2D Output Color Register,                    Address offset: 0x38 */

  __IO uint32_t OMAR;          /*!< DMA2D Output Memory Address Register,           Address offset: 0x3C */

  __IO uint32_t OOR;           /*!< DMA2D Output Offset Register,                   Address offset: 0x40 */

  __IO uint32_t NLR;           /*!< DMA2D Number of Line Register,                  Address offset: 0x44 */

  __IO uint32_t LWR;           /*!< DMA2D Line Watermark Register,                  Address offset: 0x48 */

  __IO uint32_t AMTCR;         /*!< DMA2D AHB Master Timer Configuration Register,  Address offset: 0x4C */

  uint32_t      RESERVED[236]; /*!< Reserved, 0x50-0x3FF */

  __IO uint32_t FGCLUT[256];   /*!< DMA2D Foreground CLUT,                          Address offset:400-7FF */

  __IO uint32_t BGCLUT[256];   /*!< DMA2D Background CLUT,                          Address offset:800-BFF */

} DMA2D_TypeDef;

__IO表示volatile, 这是标准C语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化掉。core_m4.h 文件定义了这个宏:


#define     __O     volatile             /*!< Defines 'write only' permissions */

#define     __IO    volatile             /*!< Defines 'read / write' permissions */

下面我们再看DMA2D的定义,在stm32f429xx.h文件。


#define PERIPH_BASE           0x40000000UL

#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000UL)

#define DMA2D_BASE            (AHB1PERIPH_BASE + 0xB000UL)

#define DMA2D                 ((DMA2D_TypeDef *)DMA2D_BASE) <----- 展开这个宏,(DMA2D_TypeDef *) 0x4002B000

我们访问DMA2D的ISR寄存器可以采用这种形式:DMA2D->ISR = 0。


45.3.2 DMA2D参数初始化结构体DMA2D_InitTypeDef

此结构体用于配置DMA2D的基本参数,具体定义如下:


typedef struct

{

  uint32_t             Mode;              

  uint32_t             ColorMode;        

  uint32_t             OutputOffset;       

  uint32_t             AlphaInverted;    

  uint32_t             RedBlueSwap;       

} DMA2D_InitTypeDef;

下面将这几个参数逐一为大家做个说明:


  uint32_t   Mode

此参数用于设置DMA2D的传输模式,具体支持的参数如下:


#define DMA2D_M2M        ((uint32_t)0x00000000U)  /*存储器到存储传输模式 */

#define DMA2D_M2M_PFC     DMA2D_CR_MODE_0         /*存储器到存储器传输模式,并执行FPC像素格式转 */

#define DMA2D_M2M_BLEND   DMA2D_CR_MODE_1         /* 存储器到存储器模式,并执行像素格式转换和混合 */

#define DMA2D_R2M         DMA2D_CR_MODE           /* 寄存器到存储器传输模式 */

  uint32_t   ColorMode

此参数用于设置DMA2D的输出颜色格式,具体支持的参数如下:


#define DMA2D_OUTPUT_ARGB8888       ((uint32_t)0x00000000U)               /* ARGB8888 */

#define DMA2D_OUTPUT_RGB888         DMA2D_OPFCCR_CM_0                     /* RGB888 */

#define DMA2D_OUTPUT_RGB565         DMA2D_OPFCCR_CM_1                     /* RGB565 */

#define DMA2D_OUTPUT_ARGB1555       (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /* ARGB1555 */

#define DMA2D_OUTPUT_ARGB4444       DMA2D_OPFCCR_CM_2                     /* ARGB4444 */

  uint32_t   OutputOffset

此参数用于设置输出位置的偏移值,参数范围0x0000到0x3FFF。


45.3.3 DMA2D的图层结构体DMA2D_LayerCfgTypeDef

此结构体用于配置前景色和背景色。


typedef struct

{

  uint32_t             InputOffset;       

  uint32_t             InputColorMode;    

  uint32_t             AlphaMode;        

  uint32_t             InputAlpha;        

} DMA2D_LayerCfgTypeDef;

下面将这几个参数逐一为大家做个说明。


  uint32_t  InputOffset

设置前景色或者背景色的输入偏移,范围0x000到0x3FFF。


  uint32_t  InputColorMode

设置前景色或者背景色的输入颜色格式,具体支持的参数如下:


#define DMA2D_INPUT_ARGB8888        ((uint32_t)0x00000000U)  /* ARGB8888 */

#define DMA2D_INPUT_RGB888          ((uint32_t)0x00000001U)  /* RGB888   */

#define DMA2D_INPUT_RGB565          ((uint32_t)0x00000002U)  /* RGB565   */

#define DMA2D_INPUT_ARGB1555        ((uint32_t)0x00000003U)  /* ARGB1555 */

#define DMA2D_INPUT_ARGB4444        ((uint32_t)0x00000004U)  /* ARGB4444 */

#define DMA2D_INPUT_L8              ((uint32_t)0x00000005U)  /* L8       */

#define DMA2D_INPUT_AL44            ((uint32_t)0x00000006U)  /* AL44     */

#define DMA2D_INPUT_AL88            ((uint32_t)0x00000007U)  /* AL88     */

#define DMA2D_INPUT_L4              ((uint32_t)0x00000008U)  /* L4       */

#define DMA2D_INPUT_A8              ((uint32_t)0x00000009U)  /* A8       */

[1] [2] [3]
关键字:STM32F429  图形加速器  DMA2D  HAL库  API 引用地址:第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API

上一篇:第46章 STM32F429的DMA2D应用之刷色块,位图和Alpha混合
下一篇:第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸

推荐阅读最新更新时间:2024-11-12 13:02

Akamai发现API漏洞对全球公司和个人均具有很高的风险
Akamai发现API漏洞对全球公司和个人均具有很高的风险 Akamai的最新安全研究探讨了全球API安全状况;揭示了2020至2021年间的攻击流量趋势 2021年10月28日——负责保护和交付数字化体验且深受全球企业信赖的解决方案提供商阿卡迈技术公司(Akamai Technologies, Inc.,以下简称:Akamai)今天发布了最新研究报告,其中分析了与应用程序编程接口(API)有关的、不断变化的威胁态势。Gartner曾指出,API到2022年将成为使用最频繁的在线攻击向量。作为Akamai《互联网安全状况》系列报告中的最新一期报告,《API:与每个人息息相关的攻击》(API: The Attack Surf
[物联网]
Akamai发现<font color='red'>API</font>漏洞对全球公司和个人均具有很高的风险
STM32_HAL库入门笔记(一) USART配置
串口发送功能: uint8_t TxData = 01234abcde ; HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff 串口接收功能1: uint8_t value='F'; HAL_UART_Receive(&huart2,(uint8_t *)&value,1,1000);//在这个语句停留1000ms内等待接收1个字节数据,把数据存放在value中 串口接收功能2: HAL_UART_Receive_IT(&huart2,(uint8_t *)&valu
[单片机]
STM32_<font color='red'>HAL库</font>入门笔记(一) USART配置
HAL库教程10:定时器的PWM模式应用
  本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐。本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路   蜂鸣器按照有无震荡源(不是电源),可以分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器上电就能工作,控制简单,但是只有一个音调。无源蜂鸣器需要单片机提供震荡源,虽然控制稍微复杂一点,但是可以发出不同频率的声音。 PWM原理   根据我们的电路,引脚输出高电平时,驱动电路为蜂鸣器提供了闭合回路,则引脚给高电平,蜂鸣器就能响。然而,只给高电平,无源蜂鸣器不能持续发出声音,只有一瞬间有声音;需要马上给低电平,然后再给一个高电平。即在一个很短的周期内,无源蜂鸣器在高电平持续期间工作,
[单片机]
<font color='red'>HAL库</font>教程10:定时器的PWM模式应用
STM32F429 Discovery FMC驱动原子4.3寸LCD
上一篇写了GPIO简单的流水灯测试,看着有点单调,习惯了串口调试,板子上没有串口 那就另想办法吧,看着LCD突然有了个想法,为什么不把调试信息输出到LCD上,以前在做2416 WINCE开发的时候就经常这样干非常直观,那说干就干。 STM32F429I-DISO SDK里已经把开发包做好,那就直接拿过来用吧。 #define MESSAGE1 STM32F429I-Discoverry //提示信息 #define MESSAGE1_1 GPIO TEST #define MESSAGE2 LED3 LED4 #define MESSAGE2_1 ^-^ #define
[单片机]
stm32f429固件库之SPI读写FLASH
SPI——串行外设总线(Seriel Peripheral Interface),全双工通信,4条线:1、SCK(Seriel Clock,时钟信号线——用于同步通信),由主机产生,两个设备通信时,速率受限于低速设备;2、SS(也称NSS、CS,设备选择信号线,也是片选信号线),每个设备通过一条独有的CS线连接到主机,当CS拉低时,表示被选中;3、MISO(Master Input Slave Output,主机输入从机输出);4、MOSI(Master Input Slave Output,主机输出从机输入)。SCK、MISO、MOSI这三条线各个从机共用,CS线为每个从机独有连接主机。 SPI协议层:通信的起始信号:CS由高变
[单片机]
关于stm32串口不定长数据接收(hal库)的若干问题
使用串口空闲中断和DMA配合时出现的问题: 问题1.串口接收一旦溢出就会丢数据。 例如串口接收满了,稍等几秒再启动新的DMA接收函数HAL_UART_Receive_DMA时,就丢失数据了,而且是再也收不到串口数据。如果接满后马上启动就没这个问题。 看官方示例代码,停止DMA接收后似乎要DeInit后重新初始化Init和启动DMA接收 解答: 当接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。要恢复正常的话就只有Deinit后再重
[单片机]
关于stm32串口不定长数据接收(<font color='red'>hal库</font>)的若干问题
【STM32】HAL库 STM32CubeMX教程六----定时器中断
前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5 知识概括: 通过本篇博客您将学到: SMT32定时器原理 STM32CubeMX创建定时器例程 HAL库TIM定时器函数库 定时器
[单片机]
【STM32】<font color='red'>HAL库</font> STM32CubeMX教程六----定时器中断
基于STM32F429芯片的单片机芯片内存映射图
一、如何控制单片机? 单片机的内存映射图解析 这里以STM32F429芯片为例,讲解下单片机芯片内存映射图。从此图中可以看到芯片的外设被分配了512M的空间,然而真正的外设其实没有使用到512M的内存空间。 然后我们操作外设时,只需要操作它对应的内存地址即可。更加详细的外设内存地址,可以参考芯片的用户手册(不是数据手册)的Memory map章节。 因为单片机是将外设映射到内存地址上,所以我们可以像操作内存一样来操作外设(写/读)。 我们在操作内存时是通过地址来进行操作的,由于单片机已经将外设与内存进行了映射,所以我们在操作单片机外设时只需要操作外设映射的内存地址就行。 内存如何操作? 在C语言中操作内存,我们可以用指针来
[单片机]

推荐帖子

电子工业技术词典 磁性材料与器件
电子工业技术词典磁性材料与器件可直接下载!电子工业技术词典磁性材料与器件
fighting 工控电子
【为C2000做贡献】基于Matlab的TMS320LF2407程序快速设计
基于Matlab的TMS320LF2407程序快速设计Timson,如果您要查看本帖隐藏内容请回复【为C2000做贡献】基于Matlab的TMS320LF2407程序快速设计kanakan看看,正在学2407正在学这个东西我也来看看谢谢谢谢正在学习dsp,看看。听说过这种方法,今天开眼了。谢谢gjfkldgjdklfjakldjfkadsjkladsj在寻找ccs与simulink开发的相关资料。。。。太好了呀matlab下来看看s
0212009623 微控制器 MCU
我的个神! 海内外电动自行车DIY
海外版中国版我的个神!海内外电动自行车DIY不怕链条上的机油溅到屁股上?{:1_103:}先不说链条溅油问题。这可怎么调速呢?总用一个速度行驶?遇到前方有情况也没法减速。在1980s,有人在普通自行车和三轮车的基础上加发动机,有小型轻骑用50cc,装在三角梁上还算正常。更神的是用一种不知道哪儿用的微型发动机装在自行车前叉上,整成了前驱……京东上有众筹普通自行车改电动的一种外挂电机电池一体化的装置,直接装在前轮上,换个加长前轴就能适配任意一种自行车。我一直想买一种可折
PowerAnts DIY/开源硬件专区
【FPGA(cyclone4)第二期】应用设计文档大放送
自己下载,我没币了,收点别介意,绝对值得你下载自己看吧,手机了三年的资料啥也不说,自觉顶贴一次就可以下载一次,哈哈后续会免费的,希望下载的好好学习,共享经验【FPGA(cyclone4)第二期】应用设计文档大放送哇....好丰富好多呀,可惜我也是穷鬼,只能支持下了好多资料,收藏着好好学习不厚道,还要收费好多是学校的数据库下载的回复5楼fanlly的帖子很超值的,每个收费1个芯币只要你回帖一次就有了哦哈哈,我写了教程了,写到快两点了,加了精华呗,哈哈哈回复7楼
834629744 FPGA/CPLD
这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而...
这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而得到被校准板子的静态功耗,这种方法是否可行?这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而...得到电压的AD值,除以电阻值,从而得到被校准板子的静态功耗,这种方法是否可行?不可行。 这样独立的电源不可能会有电流流过R0?没有回路是吗 你有什么好的方法没有?目的是用治具实现半自动测量到产品的静态功耗 这样独立的电源不可能会有电流流过
QWE4562009 电源技术
慧友电子IP保安DV视频服务器采用矽玛特PR818S系统级芯片
矽玛特公司宣布,慧友电子最新推出的IP保安数字摄像机视频服务器,已选用矽玛特PR818S系统级芯片。全新四通道MPEG-4数字录像机(DVR)支持四组镜头输入及灵活的录像模式,如连续间歇性拍摄(ContinuousTime-lapse)、预定时间/警报式拍摄,或移动侦测拍摄。    矽玛特PR818S为个人录像机和数字录像机等消费类便携式设备,能够提供低能耗及出色的视频质量。PR818S的单芯片设计支持硬件式MPEG-4ASP/SP、MPEG-2及J
lorant 移动便携
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved