ADI Blackfin DSP处理器-BF533的开发详解36:图像处理专题-RGB888 转 RGB565(含源代码)

news2024/11/16 21:39:34

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

功能介绍

作为一个最高600M主频,单核或双核的定点DSP,做图像处理还是挺行的,属于是老本行,那么我们后面一个系列,将会详细的说一说DSP做图像处理。

代码实现了将 RGB888 数据格式转为 RGB565 格式。板卡液晶屏和 VDSP 软件商 Image Viewer 工具上的 RGB565格式不同,其区别是 RGB 数据格式的位置,在液晶屏上,R 的数据位置位于低 5 位,B 数据位置位于高 5 位。在Image Viewer 工具上,R 数据位于高 5 位,B 数据位于低 5 位。为了方便查看,在代码中将这两种转换函数都列出,方便查看。

代码使用说明

RGB888 转 RGB565,以液晶屏格式为例:

dst[j+1] = src[i+2] &0xf8; //提取 5bit 的蓝色数据
dst[j+1] |= ((src[i+1]>>5) & 0x07); //提取 3bit 的绿色高位数据
dst[j] = ((src[i+1]<<3) & 0xe0); //提取 3bit 的绿色低位数据
dst[j] |= ((src[i]>>3) &0x1f); //提取 5bit 的红色数据

在代码中,做了一个宏开关,当打开这个开关,转换后的数据格式为液晶屏 RGB565 的格式,当关闭开关,转换的数据可以直接通过 Image View 工具查看。

//#define LCD_FORMAT 1

代码中定义了两个 Buffer,in_buffer 中存放了 RGB888 格式的数据,通过”#include”指令将”.dat”文件倒入内存。

转换后输出的 RGB565 格式的数据存放在 out_buffer 中。

unsigned char in_buffer[391680]=
{
#include"RGB888_480_272.dat"
};
unsigned char out_buffer[261120];

调试步骤

  1. 将板卡连接仿真器,运行 VDSP 软件并连接板卡。
  2. 将工程 BF53x_RGB888_TO_RGB565.dpj 载入 VDSP 软件,编译并运行。
  3. 待代码停止,用 VDSP 下的 Image Viewer 工具以 RGB565 格式查看图像。其配置如下:

在这里插入图片描述

代码调试结果

在 Image View 窗口中可看到图像:

在这里插入图片描述

程序源码

#include <cdefBF533.h>

//#define LCD_FORMAT 1

unsigned char in_buffer[391680]=
{
#include"RGB888_480_272.dat"
};

unsigned char out_buffer[261120];

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

#ifdef LCD_FORMAT
void RGB888_RGB565(unsigned char *src, int src_len, unsigned char *dst)
{
int i = 0;
int j = 0;

if (src_len % 3 != 0)
{
    return;
}
for (i = 0; i < src_len; i += 3)
{
     dst[j+1] = src[i+2] &0xf8; 			//B 
     dst[j+1] |= ((src[i+1]>>5) & 0x07);	//GH
     dst[j] = ((src[i+1]<<3) & 0xe0);  		//GL  
     dst[j] |= ((src[i]>>3) &0x1f); 		//R
    j += 2;  
    
}

}
#else //VDSP Imgae Viewer Format
void RGB888_RGB565(unsigned char *src, int src_len, unsigned char *dst)
{
int i = 0;
int j = 0;

if (src_len % 3 != 0)
{
    return;
}
for (i = 0; i < src_len; i += 3)
{
     dst[j] = (src[i+2] >>3)&0x1f; 			//B 
     dst[j] |=((src[i+1]<<3) & 0xe0);    
     dst[j+1] = ((src[i+1]>>5) & 0x07);		//GL  
     dst[j+1] |= ((src[i]) &0xf8); 			//R
     j += 2;      
}

}
#endif

void main(void)
{
Set_PLL(16,4);
Init_EBIU();
RGB888_RGB565(in_buffer,391680, out_buffer);
}

RGB888-565

// blackfin-edinburgh-core
#include <sys/platform.h>
#include <sys/anomaly_macros_rtl.h>

/
// standard
#define IVBh (EVT0 >> 16)
#define IVBl (EVT0 & 0xFFFF)
#define UNASSIGNED_VAL 0x8181
#define INTERRUPT_BITS 0x400 // just IVG15
#define SYSCFG_VALUE 0x30

.section/DOUBLEANY program;
.file_attr requiredForROMBoot;
.align 2;

start:

/* V D S G < i n s e r t − c o d e − v e r y − b e g i n n i n g > ∗ / . s t a r t o f u s e r c o d e v e r y b e g i n n i n g : / / I n s e r t a d d i t i o n a l c o d e t o b e e x e c u t e d b e f o r e a n y o t h e r S t a r t u p C o d e h e r e . / / T h i s c o d e i s p r e s e r v e d i f t h e C R T i s r e − g e n e r a t e d . . e n d o f u s e r c o d e v e r y b e g i n n i n g : / ∗ VDSG<insert-code-very-beginning> */ .start_of_user_code_very_beginning: // Insert additional code to be executed before any other Startup Code here. // This code is preserved if the CRT is re-generated. .end_of_user_code_very_beginning: /* VDSG<insertcodeverybeginning>/.startofusercodeverybeginning://InsertadditionalcodetobeexecutedbeforeanyotherStartupCodehere.//ThiscodeispreservediftheCRTisregenerated..endofusercodeverybeginning:/VDSG */

/
// blackfin-edinburgh-core
#if WA_05000109
// Avoid Anomaly 05-00-0109
R1 = SYSCFG_VALUE;
SYSCFG = R1;
#endif

/
// standard
#if WA_05000229
// Avoid Anomaly 05-00-0229: DMA5_CONFIG and SPI_CTL not cleared on reset.
R1 = 0x400;
#if defined(ADSPBF538) || defined(ADSPBF539)
P0.L = SPI0_CTL & 0xFFFF;
P0.H = SPI0_CTL >> 16;
W[P0] = R1.L;
#else
P0.L = SPI_CTL & 0xFFFF;
P0.H = SPI_CTL >> 16;
W[P0] = R1.L;
#endif
P0.L = DMA5_CONFIG & 0xFFFF;
P0.H = DMA5_CONFIG >> 16;
R1 = 0;
W[P0] = R1.L;
#endif
// Clear loop counters to disable hardware loops
R7 = 0;
LC0 = R7;
LC1 = R7;

// Clear the DAG Length regs, to force linear addressing
L0 = R7;
L1 = R7;
L2 = R7;
L3 = R7;

// Clear ITEST_COMMAND and DTEST_COMMAND registers
I0.L = (ITEST_COMMAND & 0xFFFF);
I0.H = (ITEST_COMMAND >> 16);
I1.L = (DTEST_COMMAND & 0xFFFF);
I1.H = (DTEST_COMMAND >> 16);
[I0] = R7;
[I1] = R7;
CSYNC;

// Initialise the Event Vector table.
P0.H = IVBh;
P0.L = IVBl;

// Install __unknown_exception_occurred in EVT so that
// there is defined behaviour.
P0 += 2*4;		// Skip Emulation and Reset
P1 = 13;
R1.L = __unknown_exception_occurred;
R1.H = __unknown_exception_occurred;
LSETUP (.ivt,.ivt) LC0 = P1;

.ivt: [P0++] = R1;

// Set IVG15's handler to be the start of the mode-change
// code. Then, before we return from the Reset back to user
// mode, we'll raise IVG15. This will mean we stay in supervisor
// mode, and continue from the mode-change point, but at a
// much lower priority.
P1.H = supervisor_mode;
P1.L = supervisor_mode;
[P0] = P1;

/
// standard
// Initialise the stack.
// Note: this points just past the end of the section.
// First write should be with [–SP].
SP.L=ldf_stack_end;
SP.H=ldf_stack_end;
usp = sp;

// We're still in supervisor mode at the moment, so the FP
// needs to point to the supervisor stack.
FP = SP;

// Make space for incoming "parameters" for functions
// we call from here:
SP += -12;

R0 = INTERRUPT_BITS;
R0 <<= 5;	// Bits 0-4 not settable.

/
// install-default-handlers
CALL.X __install_default_handlers;

.extern __install_default_handlers;
.type __install_default_handlers,STT_FUNC;

/
// standard
R1 = SYSCFG;
R4 = R0; // Save modified list
BITSET(R1,1);
SYSCFG = R1; // Enable the cycle counter

/
// blackfin-edinburgh-core
#if WA_05000137 || WA_05000162
// Avoid Anomaly 02-00-0137
// Set the port preferences of DAG0 and DAG1 to be
// different; this gives better performance when
// performing daul-dag operations on SDRAM.
P0.L = DMEM_CONTROL & 0xFFFF;
P0.H = DMEM_CONTROL >> 16;
R0 = [P0];
BITSET(R0, 12);
BITCLR(R0, 13);
[P0] = R0;
CSYNC;
#endif

/* V D S G < i n s e r t − c o d e − e a r l y − s t a r t u p > ∗ / . s t a r t o f u s e r c o d e 1 : / / I n s e r t a d d i t i o n a l c o d e t o b e e x e c u t e d b e f o r e m a i n h e r e . / / T h i s c o d e i s p r e s e r v e d i f t h e C R T i s r e − g e n e r a t e d . . e n d o f u s e r c o d e 1 : / ∗ VDSG<insert-code-early-startup> */ .start_of_user_code1: // Insert additional code to be executed before main here. // This code is preserved if the CRT is re-generated. .end_of_user_code1: /* VDSG<insertcodeearlystartup>/.startofusercode1://Insertadditionalcodetobeexecutedbeforemainhere.//ThiscodeispreservediftheCRTisregenerated..endofusercode1:/VDSG */

/
// standard
// Enable interrupts
STI R4; // Using the mask from default handlers
RAISE 15;

// Move the processor into user mode.
P0.L=still_interrupt_in_ipend;
P0.H=still_interrupt_in_ipend;
RETI=P0;
NOP;		// Purely to prevent a stall warning

still_interrupt_in_ipend:
// execute RTI until we’ve finished servicing all
// interrupts of priority higher than IVG15. Normally one
// would expect to only have the reset interrupt in IPEND
// being serviced, but occasionally when debugging this may
// not be the case - if restart is hit when servicing an
// interrupt.
//
// When we clear all bits from IPEND, we’ll enter user mode,
// then we’ll automatically jump to supervisor_mode to start
// servicing IVG15 (which we will ‘service’ for the whole
// program, so that the program is in supervisor mode.
// Need to do this to ‘finish’ servicing the reset interupt.
RTI;

supervisor_mode:
[–SP] = RETI; // re-enables the interrupt system
R0.L = UNASSIGNED_VAL;
R0.H = UNASSIGNED_VAL;

// Push a RETS and Old FP onto the stack, for sanity.
[--SP]=R0;
[--SP]=R0;
// Make sure the FP is sensible.
FP = SP;
// Leave space for incoming "parameters"
SP += -12;

/* V D S G < i n s e r t − c o d e − b e f o r e − d e v i c e − i n i t i a l i z a t i o n > ∗ / . s t a r t o f u s e r c o d e 2 : / / I n s e r t a d d i t i o n a l c o d e t o b e e x e c u t e d b e f o r e d e v i c e i n i t i a l i z a t i o n h e r e . / / T h i s c o d e i s p r e s e r v e d i f t h e C R T i s r e − g e n e r a t e d . . e n d o f u s e r c o d e 2 : / ∗ VDSG<insert-code-before-device-initialization> */ .start_of_user_code2: // Insert additional code to be executed before device initialization here. // This code is preserved if the CRT is re-generated. .end_of_user_code2: /* VDSG<insertcodebeforedeviceinitialization>/.startofusercode2://Insertadditionalcodetobeexecutedbeforedeviceinitializationhere.//ThiscodeispreservediftheCRTisregenerated..endofusercode2:/VDSG */

/
// device-initialization
// initialise the devices known about for stdio.
CALL.X _init_devtab;
.extern _init_devtab;
.type _init_devtab,STT_FUNC;

/
// cplusplus
CALL.X ___ctorloop; // run global scope C++ constructors
.extern ___ctorloop;
.type ___ctorloop,STT_FUNC;

/* V D S G < i n s e r t − c o d e − b e f o r e − m a i n − e n t r y > ∗ / . s t a r t o f u s e r c o d e 3 : / / I n s e r t a d d i t i o n a l c o d e t o b e e x e c u t e d b e f o r e m a i n h e r e . / / T h i s c o d e i s p r e s e r v e d i f t h e C R T i s r e − g e n e r a t e d . . e n d o f u s e r c o d e 3 : / ∗ VDSG<insert-code-before-main-entry> */ .start_of_user_code3: // Insert additional code to be executed before main here. // This code is preserved if the CRT is re-generated. .end_of_user_code3: /* VDSG<insertcodebeforemainentry>/.startofusercode3://Insertadditionalcodetobeexecutedbeforemainhere.//ThiscodeispreservediftheCRTisregenerated..endofusercode3:/VDSG */

/
// get-args
// Read command-line arguments.
CALL.X __getargv;
r1.l=__Argv;
r1.h=__Argv;

.extern __getargv;
.type __getargv,STT_FUNC;
.extern __Argv;
.type __Argv,STT_OBJECT;

/
// standard
// Call the application program.
CALL.X _main;

/
// call-exit
CALL.X _exit; // passing in main’s return value
.extern _exit;
.type _exit,STT_FUNC;

/
// standard
.start.end: // Required by the linker to know the size of the routine
// that is needed for absolute placement.

.global start;
.type start,STT_FUNC;
.extern _main;
.type _main,STT_FUNC;
.extern ldf_stack_end;
.extern __unknown_exception_occurred;
.type __unknown_exception_occurred,STT_FUNC;

/
// cplusplus
.section/DOUBLEANY ctor;
.align 4;
___ctor_table:
.byte4=0;
.global ___ctor_table;
.type ___ctor_table,STT_OBJECT;
.section/DOUBLEANY .gdt;
.align 4;
___eh_gdt:
.global ___eh_gdt;
.byte4=0;
.type ___eh_gdt,STT_OBJECT;
.section/DOUBLEANY .frt;
.align 4;
___eh_frt:
.global ___eh_frt;
.byte4=0;
.type ___eh_frt,STT_OBJECT;

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

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

相关文章

广州蓝景分享—HTML+CSS功能,让页面加载速度提高数倍

Hello&#xff0c;各位小伙伴&#xff0c;今天跟大家分享前端技术干货&#xff0c;页面加载速度问题。 首先我们都讨厌加载缓慢的页面&#xff01; 要知道加载时间每增加1秒&#xff08;0-5秒之间&#xff09;&#xff0c;网站转化率就会平均下降4.42%。页面加载时间的前五秒…

linux 虚拟机nat模式网络配置

文章目录1. linux 版本&#xff1a;2. 下载地址 Index of /centos-store/7.6.1810/isos/x86_64/ (liu.se)3. 账号密码&#xff1a;root root4.选择nat 模式&#xff0c;勾选 将主机虚拟适配器连接到此网络&#xff0c;勾选 使用本地DHCP服务将iP地址分配给虚拟机5.点击Nat 设置…

数据仓库分享

前言 数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它出于分析性报告和决策支持的目的而创建的。 数据仓库是一个数据集合 数据仓库是一个为业务决策提供数据支持的数据集合 数据仓库是通过监控业务流程的形式为业务决策提…

Css不常用的方法

flex布局换行之后&#xff0c;下面一行的布局会异常 .homeItemBox{ display: flex; flex-wrap: wrap; justify-content: flex-start;} .homeItem{ display: flex; width: calc((100% - 20rpx) / 4); flex-direction: column; align-items: center; flex-shrink: 0; …

盘点系列:一度大热的TWS耳机今年表现如何?

根据Canalys最新市场研究数据显示&#xff0c;全球智能个人耳机市场在2022年Q3已连续第二个季度出现下滑&#xff0c;出货量同比下降4%至1.136亿台。 而TWS是唯一出现增长的子类别&#xff01; Q3真无线耳机TWS销量达7690万部&#xff0c;同比增长6%。苹果&#xff08;含beats&…

软件测试基础理论体系学习6-黑盒测试方法白盒测试方法简述

13 白盒测试方法1 黑盒测试1.1 黑盒测试概述1.2 黑盒测试的使用场景1.3 “黑盒”的两种基本方法1.4 黑盒测试的优缺点1.4.1 优点1.4.2 缺点1.5 黑盒测试的测试用例设计方法2 白盒测试2.1 白盒测试概述2.2 逻辑覆盖2.3 语句覆盖2.3.1 基本思想是2.3.2 优点2.3.3 缺点2.4 判定覆盖…

Python及其在数据科学中的应用

前言 Python及其在数据科学中的应用 Python易学&#xff0c;语法也比较简单。它是一种流行的数据科学语言&#xff0c;因为它功能强大且易于使用。Python是一种出色的数据分析语言&#xff0c;因为它包含各种数据结构、模块和工具。 使用Python进行数据科学的原因有很多&…

详细介绍NLP对话系统

任务型对话系统 任务型对话系统主要应用于固定领域。任务型对话的广泛应用的方法有两种&#xff0c;一种是模块法&#xff0c;另一种是端到端的方法。 模块法是将对话响应视为模块&#xff0c;每个模块负责特定的任务&#xff0c;并将处理结果传送给下一个模块。 端到端的任务…

分布式事务 - Seata - TCC模式

目录一、什么是TCC二、AT & TCC区别 及 适用场景三、代码集成示例3.1 升级Seata 1.5.23.2 示例场景说明3.3 TCC核心接口定义3.4 TCC相关阶段规划3.5 TCC核心代码四、TCC三大问题&#xff08;幂等、空回滚、悬挂&#xff09;之前介绍过分布式事务之Seata AT模式&#xff0c;…

智慧新零售异业联盟帮你搞定多店跨界整合,让你开启共富时代

大家好&#xff0c;我是林工&#xff0c;在如今的时代&#xff0c;不管你所看到的商业模式是什么样的&#xff0c;以不变应万变&#xff0c;目的只有一个&#xff0c;把买卖发展壮大&#xff0c;想要将买卖发展壮大&#xff0c;那就需要精准的吸粉引流获客方式和能力。 林工常常…

Fluent Mybatis 牛逼!

这玩意比ThreadLocal叼多了&#xff0c;吓得我赶紧分享出来。 推荐一些chrome浏览器必装的插件&#xff01; 40 个 SpringBoot 常用注解 VSCode 花式玩法&#xff08;摸鱼&#xff09;收藏一下 &#xff01; 使用fluent mybatis可以不用写具体的xml文件&#xff0c;通过jav…

【面试大全】互联网面试软实力【必看】

软实力 推荐大家使用Markdown语法写简历&#xff0c;然后再将Markdown格式转换为PDF格式后进行简历投递。如果你对Markdown语法不太了解的话&#xff0c;可以花半个小时简单看一下Markdown语法说明: http://www.markdown.cn/ 面试 假如你是网络申请者【拉勾、boss等】&…

Latex 分式格式处理

分式 分式命令&#xff1a;\frac{分子}{分母}。 对于行内短分式&#xff0c;可用斜线/输入&#xff0c;例如&#xff1a;(xy)/2 举例&#xff1a; 行内分式 \(\frac{xy}{yz} \) (显示为&#xff1a;) 行间分式 \[\frac{xy}{yz}\] (显示为&a…

【PCB设计特别篇之阻抗计算】还在用SI9000进行阻抗计算?

有了叠层信息后&#xff0c;才可以进行阻抗计算&#xff0c;走线阻抗与线宽、线距、介质厚度、绿油厚度、介质介电常数、铜箔厚度等一些信息相关&#xff0c;所以要现有叠层&#xff0c;才能进行阻抗计算。 阻抗计算的工具有很多&#xff0c;下面介绍几种&#xff1a; 1、SI900…

RSS Can:使用 Golang 实现更好的 RSS Hub 服务(一)

聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 这个事情涉及的东西比较多&#xff0c;所以我考虑拆成一个系列来聊&#xff0c;每篇的内容不要太长&#xff0c;整理负担和阅读负担都轻一些。 本篇是第一…

Go代码审计学习(二)

文章目录环境搭建漏洞一&#xff1a;代码逻辑错误、没有做有效的鉴权漏洞二&#xff1a;目录穿越、任意文件读取漏洞三&#xff1a;条件竞争漏洞四&#xff1a;钩子函数执行命令参考链接环境搭建 Gitea是从gogs衍生出的一个开源项目&#xff0c;是一个类似于Github、Gitlab的多…

自学python第三年才懂,这事儿影响着最终的学习结果

前言 如果这件事你还没搞明白&#xff0c;那你学python会跟我一样&#xff0c;学了几年跟没学差不多&#xff01; 当然&#xff0c;这件事仅限于学python是想赚钱或者提升职场竞争力的人明白即可&#xff0c;其他人别浪费时间了。 这事儿很重要 我从2018年底开始自学python&a…

SpringBoot2核心技术(基础入门)- 03 自动配置原理【3.1依赖管理+2容器功能】

1、SpringBoot特点 1.1、依赖管理 ● 父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent…

(已更新)2023春节倒计时新款HTML单页源码

2023春节倒计时新款HTML单页自适应页面&#xff0c;有兴趣的可以看看&#xff01;背景图片自己修改喜欢的&#xff01; 源码介绍 自适应页面&#xff0c;支持安卓和ioswx背景音乐播放附带多个背景音乐&#xff0c;由于技术原因&#xff0c;一些js进行了加密&#xff08;支持i…

Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

一、导入包 <!-- dynamic-datasource --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.2.1</version> </dependency> 二、配置yam配置文…