STM32 DCMI 的带宽与性能介绍

1. 引言

随着市场对更高图像质量的需求不断增加,成像技术持续发展,各种新兴技术(例如3D、计算、运动和红外线)的不断涌现。如今的成像应用对高质量、易用性、能耗效率、高集成度、快速上市和成本效益提出了全面要求。为了满足这些要求,STM32 MCU 内置的数字照相机接口(DCMI),能够高效连接并行照相机模块。

对于使用 STM32 DCMI 开发相机应用的客户,经常有以下问题:STM32 DCMI 最大支持的像素时钟是多少?STM32F4/F7/H7/U5 能支持 1280×720 的相机分辨率吗?最大的帧率是多少?如何判断所设计的应用产生的带宽是否能充足?相机输出是选择 8 位、10位、12 位、还是 14 位?

针对这些问题,本文档从 DCMI 使用的几个方面,介绍了 STM32 DCMI 在连续抓取模式下带宽的估算,以及提升性能需要注意的事项。客户在设计相机应用时可以参考。

2. STM32 DCMI

STM32 数字照相机接口(DCMI)采用同步并行数据总线。它可以轻松集成并适应相机的特殊应用要求。DCMI 可连接 8、10、12 和 14 位 CMOS 照相机模块,并支持多种数据格式:8/10/12/14 位逐行视频、YCbCr4:2:2 逐行视频、RGB565 逐行视频、JPEG 等。
像素最大支持 16 位色深。

2.1. STM32 智能架构中的 DCMI

DCMI 应用需要用帧缓冲区来存储采集的图像。必须根据图像大小和传输速度使用合适的目标存储区。在某些应用中,必须连接外部存储器(SDRAM),以便提供较大的数据存储空间。对于支持 DMA2D(Chrom-ART Accelerator™控制器)的 STM32 系列,也可以用它做色彩空间转换(例如 RGB565 至 ARGB8888),或使用 DMA 从一个存储区到另一个存储区的数据转移。

下面图 1 是 STM32F2x7 系列智能架构中 DCMI 的例子。这里 DCMI 通过 AHB2 外设总线连接到 AHB 总线矩阵。DMA2 主控访问 DCMI,将 DCMI 接收到的图像数据传输到内部 RAM 或外部 SDRAM 中,具体目标位置取决于应用。

图1.STM32F2x7 系列智能架构中的 DCMI 从设备 AHB2 外设
图1.STM32F2x7 系列智能架构中的 DCMI 从设备 AHB2 外设

2.2. DCMI 最大像素时钟频率

STM32 DCMI 支持的像素时钟频率,与 AHB 时钟频率比值必须小于 0.4。具体的像素时钟频率最大值要查询所用 STM32 的数据手册。下面表 1 中列出了部分 STM32 系列DCMI 最大像素时钟频率及相关可用资源的信息。如需更详细信息,请参考相应的参考手册/数据手册。

表1. DCMI 及相关可用资源
表1. DCMI 及相关可用资源

2.3. DCMI 支持的图像分辨率

STM32 DCMI 仅对输入像素时钟频率有硬件限制(DCMI_PCLK / fHCLK 最大 0.4),对图像的分辨率没有限制。DCMI 连续抓取模式下,图像分辨率会影响帧率(帧率的大小会影响视频的流畅度)。在固定的像素时钟频率下,高分辨率图像的带宽需求较高,对应的帧率则会下降。或者说,在相同的图像分辨率下,提高帧率需要相应地提高像素时钟频率。

例如下表 2(摘自三星 S5K5CAGA CMOS Image Sensor 的数据手册)所示,大家可以从中了解 S5K5CAGA 的像素频率、图像分辨率、帧率的关系(非 RGB888,16 位色深)。另外,图像分辨率主要通过设置相机的输出格式进行修改。

表2. S5K5CAGA YUV/RGB565 像素时钟频率与帧率
表2. S5K5CAGA YUV/RGB565 像素时钟频率与帧率
对于中高分辨率的图像,一般采用双缓冲区或多缓冲区模式。这个主要原因是因为DCMI 使用的 DMA 计数寄存器 SxNDTR 使用了 16 位用于计数。最大 0xFFFF,即65535 ,单位为 32 位 Word,当图像分辨率超过 65535 Words(262140 字节)时,则要使用双缓冲区或多缓冲区模式。双缓冲区地址由 DMA_SxM0AR/DMA_SxM1AR 设定。多缓冲区时,则需要动态交替 DMA_SxM0AR/DMA_SxM1AR,使之指向图像缓冲区的不同存储位置,相当于分块存储。

2.4. DCMI 带宽与性能

使用 DCMI 的相机应用,使用连续抓取模式,功能往往是由相机连续输出所摄图像数据流到 STM32,STM32 DCMI 捕获视频流后,再输出到屏幕显示(如监控)或做图像数据处理、传输等。如果相机输出的是高像素高色深高帧率的视频流,DCMI 在接收过程中,如不能及时处理,DCMI FIFO 即会产生溢出错误(Overrun),进而导致图像数据丢失,帧率下降等问题。

2.4.1. DCMI 带宽与性能

DCMI 带宽计算公式为:带宽 = 分辨率 * 色深 * 帧率。

以三星 S5K5CAGA 为例,如表 2 中第 1 行数据(这里相机采用 RGB565,16 位/像素,8 位输出格式),则 QXGA 输出的带宽需求 =(2048 * 1536)* 2 * 6 ≈ 38MBps。像素时钟为 40MHz,8 位输出,每 2 个 CLK 传输 1 个像素数据,对应的最大输出能力为 40MBps。则 QXGA 在 40MHz 的像素时钟频率下是可以以 6 帧/秒的帧率输入到 DCMI 的。

DCMI 捕获图像数据流,再由 DMA 传输到图像缓冲区,该例中,图像缓冲区(帧缓冲区)的大小为:2048 * 1546 * 2 ≈ 6.3 MByte。

高像素高色深的图像,对应的图像缓冲区较大。当 MCU 内置的 SRAM 不能满足DCMI 图像缓冲区需求时,则需要用外部 SDRAM 来存储。例如 STM32F469 MCU(见表1,第 6 行数据),其 FSMC 支持的最大频率为 90MHz,宽度 32 位,则 SDRAM 的带宽= 90 * 4 = 360 MBps,能够满足 DCMI 带宽的需求。

一般,DCMI 图像缓冲区中的数据是需要再次传输或由 CPU 进行计算处理的,理论上 DCMI 输入的带宽需求最大不应超过SDRAM 的带宽的 50%。这里需要注意 SDRAM 可能存在多个主控(如 CPU、DMA、LTDC 等)的访问,如遇到 SDRAM 性能瓶颈问题,可考虑下列方面进行优化:

  1. (1)将各主控设备访问的存储器尽量分开,以减少竞争访问;
  2. (2)将 CPU 访问的 SDRAM Bank 与 DCMI 图像缓冲区的 Bank 分开;
  3. (3)将 DCMI 图像缓冲区区域设为不可缓冲,CPU 访问的区域则可以设为可缓冲。

对于性能,另外一个重要因素是总线竞争问题。DCMI DMA 申请的 AHB 总线访问(即使在使用 FIFO 的情况下)并非长 Burst 的访问。如果 AHB 总线上存在其它长 Burst 访问(最大 1KByte),会造成 DMA 延迟访问 DCMI,令其不能及时将 DCMI FIFO 中的数据传输出去。可以认定:DCMI 需要传输数据时的总线繁忙是造成 其 FIFO 溢出错误的根源。

解决办法除了直接为设备分配不同 SDRAM 之外(将长 Burst 访问放在其他SDRAM),还可以考虑在内部 SRAM 增设 DCMI LineBuffer,化零为整,巧妙避开 AHB 长 Burst 访问造成的 DCMI 延迟问题。数据流如下:

  1. (1)DCMI(经 DMA)=> 内部 SRAM(LineBuffer) ;
  2. (2)内部 SRAM(LineBuffer)=> 外部 SDRAM(图像 Buffer)。

由 LineBuffer 到 SDRAM 的数据中转传输请求,可使用 DCMI IT_LINE 中断(行结束)触发。这里 MCU 如果是 STM32F7/H7 系列,还可使用 MDMA 充分发挥 AXI 总线的优势,但要注意 LineBuffer 最好是 8 字节的倍数(64 位总线)。

2.4.2. DCMI 图像大小调整功能

当考虑了上面的措施,仍无法满足应用对高分辨率需求时,用户可以通过设置相机,修改相机输出分辨率,配合 DCMI 调整图像大小功能,找到合适的折中方案。DCMI 提供的相关功能如下:

(1)窗口裁剪:

  • 使用寄存器 DCMI_CWSTRT 指定起始坐标;
  • 使用寄存器 DCMI_CWSIZE 指定窗口大小。

(2)图像数据调整(详见寄存器 DCMI_CS 中 LSM/BSM 等位域):

  • 行选择:可选择 2 选 1,行数减半;
  • 数据选择:字节流上可进行 2 选 1、4 选 1 已经 4 选 2 (注意:对于 RGB565格式, 只能 4 选 2 可选,2 选 1 及 4 选 1 会造成色彩数据错乱)。

2.5. DCMI 10/12/14 数据线输入

DCMI 支持最多 14 条数据线(D13 - D0),如果将 DCMI 配置为接收 10、12 或 14 位数据,DCMI 将用 2 个像素时钟周期捕获一个 32 位数据。以 12 位数据宽度为例,DCMI在第 1 个像素时钟捕获 12 位 LSB(忽略 D[13 :12]),存于 DCMI_DR 寄存器低 16 位字中低 12 位,高 4 位(D[15 :12)清零;第 2 像素时钟捕获的 12 位 LSB 则存于 DCMI_DR高 16 位字的低 12 位,高 4 位(DCMI_DR 的[31 : 28])清零。另外相机也必须配置为10/12/14 位输出。具体情况则由应用决定。

3. 小结

本文通过介绍 STM32 DCMI 支持的最大像素时钟频率,支持的图像分辨率及与帧率的关系,进而引出 DCMI 带宽与性能提升的注意事项。另外附带了 DCMI 图像大小的调整及10~14 数据线的简介,为用户遇到相关问题时提供思路参考。

参考文献

在这里插入图片描述


本文档参考ST官方的《【应用笔记】LAT1184+STM32+DCMI的带宽与性能介绍》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88971338

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定,导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台,包括无人机app以及仿司空2的管理平台,集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

突破编程_前端_SVG(circle 圆形)

1 circle 元素的基本属性和用法 SVG 的 <circle> 元素用于在SVG文档中绘制圆形。它具有几个基本属性&#xff0c;允许定义圆形的大小、位置、填充颜色和边框样式。以下是 <circle> 元素的基本属性及其详细解释&#xff1a; 1.1 cx 和 cy 描述&#xff1a;这两个…

记录一次Java中使用P12证书访问https,nginx返回403的问题

目录 1、先使用浏览器导入证书访问&#xff0c;测试证书和密钥是否正确2、编写初始java代码3、结果响应 403 Forbidden4、解决方案 1、先使用浏览器导入证书访问&#xff0c;测试证书和密钥是否正确 成功返回&#xff0c;说明p12证书和密钥是没问题的。 2、编写初始java代码 …

Harmony鸿蒙南向外设驱动开发-Codec

功能简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于OpenMax实现了视频硬件编解码驱动&#xff0c;提供Codec基础能力接口给上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

oracle创建整个数据库的只读账户

在源用户readonly 下创建只读用户 reader readonly 的表空间为AA 一、创建只读用户 create user reader identified by 密码 default tablespace AA; 二、授权 grant connect to reader ; 三、获取原账号readonly 的查询权限 select grant select on ||owner||.||object…

【面试题】redis在工作中的使用场景有哪些?

前言&#xff1a;在实际工作中&#xff0c;Redis作为一种高性能的内存数据库和缓存系统&#xff0c;可以应用于多种场景&#xff0c;同时在面试过程中也经常被问到类似的问题&#xff0c;我们经常会被问的一脸懵逼&#xff0c;那今天我们就来总结一下redis的一些使用场景。 数据…

实战解析:SpringBoot AOP与Redis结合实现延时双删功能

目录 一、业务场景 1、此时存在的问题 2、解决方案 3、为何要延时500毫秒&#xff1f; 4、为何要两次删除缓存&#xff1f; 二、代码实践 1、引入Redis和SpringBoot AOP依赖 2、编写自定义aop注解和切面 3、application.yml 4、user.sql脚本 5、UserController 6、U…

基于ssm微信小程序的医院挂号预约系统

采用技术 基于ssm微信小程序的医院挂号预约系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户管理 医院管理 医生管理 公告资讯管理 科室信息管…

IMU状态预积分的雅克比矩阵

IMU状态预积分的雅克比矩阵 预积分的雅克比矩阵 预积分的雅克比矩阵 最后讨论预积分相对状态变量的雅克比矩阵。由于预积分测量已经归纳了IMU在短时间内的读数&#xff0c;因此残差相对于状态变量的雅克比矩阵推导则简单。 首先考虑旋转。 旋转与Ri,Rj和 b g , i b_{g,i} bg,i…

【拓展技术】——AutoDL服务器训练Pycharm使用注意点Pycharm配置AutoDL

一、AutoDL服务器模型训练 AutoDL是一个为研究人员、开发者和企业提供的平台&#xff0c;它致力于提供一个高效、可靠和易用的环境&#xff0c;以支持复杂的计算任务和AI模型的部署&#xff1a; 高效的并行计算资源&#xff1a;AutoDL拥有强大的计算集群和高性能的计算节点&a…

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件 往期回顾 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 一、最终…

C++ 类和对象 上

目录 前言 什么是面向对象&#xff1f;什么是面向过程&#xff1f; 面向过程 面向对象 比较 类 引入 定义 实例化 类的大小 this指针 前言 今天我们来进入C类和对象的学习。相信大家一定听说过C语言是面向过程的语言&#xff0c;而C是面向对象的语言&#xff1f;那么他…

启明智显M系列--工业级HMI芯片选型表

本章主要介绍启明智显M系列HMI主控芯片&#xff1a; 纯国产自主&#xff0c; RISC-V 内核&#xff0c;配备强大的 2D 图形加速处理器、PNG/JPEG 解码引擎、H.264解码&#xff1b;工业宽温&#xff0c;提供全开源SDK&#xff1b;1秒快速开机启动的特性&#xff0c;极大地提高了…

llama-factory SFT系列教程 (三),chatglm3-6B 命名实体识别实战

背景 llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数据集 lora 训练与部署本文为llama-factory SFT系列教程 第三篇 简介 利用 llama-factory 框架&#xff0c;基于 chatglm3-6B 模型 做命名…

【MySQL】事务篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 目录 本系列专栏 1. 什么是事务 2. 事务的特征 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 隔离性&…

# Contrastive Learning(对比学习)--CLIP笔记(一)

Contrastive Learning&#xff08;对比学习&#xff09;–CLIP笔记&#xff08;一&#xff09; 参考&#xff1a;CLIP 论文逐段精读【论文精读】_哔哩哔哩_bilibili CLIP简介 CLIP是一种多模态预训练模型&#xff0c;由OpenAI在2021年提出&#xff0c;论文标题&#xff1a;L…

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI&#xff08;Hardware Device Interface&#xff09;接口&#xff0c;对下实现相机Pipeline模型&#xff0c;管理相机各个硬件设备。 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层。各层基…

Mouse IFN-α ELISA kit (Quick Test)

干扰素α&#xff08;IFN-α&#xff09;是一类由免疫细胞分泌的内源性调节因子&#xff0c;也被称为白细胞干扰素&#xff0c;主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同&#xff0c;干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型&#xff0c;其中…

一起学习python——基础篇(17)

今天我说一下python中有关文件的操作。 1、检测一个目录里面有无这个文件夹、有无txt文件&#xff0c;代码如下&#xff1a; import os #文件的路径 testPath"D:/pythonFile" testPath2"D:/pythonFile/test.txt" #使用exists()方法检查是否存在文件…