ADI Blackfin DSP处理器-BF533的开发详解64:电子相册的设计(含源码)

news2024/11/17 20:41:37

硬件准备

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

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

代码实现功能

代码实现了将 SD 卡根目录下的所有文件进行文件列表,然后将 480*272 尺寸的 JPEG 文件进行 JPEG 解码,将解码后的数据显示到液晶屏上,延时后切换下一张图片,并且循环显示所有图片,实现电子相册功能。

代码使用说明
代码调用了一个 JPG 解码库,该解码库可以解 480*272 尺寸的 JPG 文件,将 JPG 文件解码为同尺寸的 RGB888 格式的数据文件,再将数据由 RGB888 转为 RGB565 送到屏上显示。

JPG 解码函数:
jpg_scaling_rgb24(DisplayBuffer,480,272,windowsBuffer_t);
将 windowsBuffer_t 内存中的 JPEG 数据解码后存入 DisplayBuffer 中,解码图像的尺寸为 480*272.

代码实验步骤

  1. 将 480*272 尺寸的“.jpg”以短文件名命名后存放在 SD 卡根目录下,将卡插入板卡SD卡接口
  2. 编译并运行代码
  3. 观察液晶屏上的图片显示

在液晶屏上看到循环显示的 JPEG 图片。

程序源码

cpu.c

#include <cdefBF533.h>

void Set_PLL(int pmsel,int pssel)
{
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_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

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

void Init_Timers0(int dat)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_WIDTH = dat;
*pTIMER0_PERIOD = 2000;
}

void Enable_Timers0(void)
{
*pTIMER_ENABLE|= 0x0001;
asm(“ssync;”);
}

void Disable_Timers0(void)
{
*pTIMER_DISABLE |= 0x0001;
}

delay(int tem)
{
int i;
for(i=0;i<tem;i++);
}

diskio.c

#include “diskio.h”
#include <cdefBF533.h>

void MMC_HardwareInitial(void)
{
*pSPI_FLG = FLS2;
*pSPI_BAUD = 4;
*pSPI_CTL = 0x0000;
*pSPI_CTL = 0x0001 | MSTR ;
*pSPI_CTL = (*pSPI_CTL | SPE);
}

DSTATUS disk_initialize ()
{
MMC_HardwareInitial();
MMC_Init();
return 0;
}

DSTATUS disk_shutdown ()
{
return 0;
}
DSTATUS disk_status ()
{
return 0;
}

DRESULT disk_read (BYTE *buff, DWORD sect, BYTE cnt)//cnt = sector num
{

while(cnt--){
	MMC_read_sector(sect,buff);
	sect += 1;
	buff += 512;
}

return 0;

}
#ifndef _READONLY
DRESULT disk_write (const BYTE* buff, DWORD sect, BYTE cnt)
{
while(cnt–){
MMC_Write_sector(sect,buff);
sect += 1;
buff += 512;
}
return 0;
}
#endif

main.c

#include <cdefbf53x.h>
#include “integer.h”
#include “ff.h”

section (“sdram0_bank2”)unsigned char windowsBuffer_t[234240];
section (“sdram0_bank2”)unsigned char TempBuffer[234240];
section (“sdram0_bank2”)unsigned char DisplayBuffer[272][1440] ;
extern unsigned char DisplayBuffer_565[272][1440] ;
unsigned char dir_name[50][12];
unsigned char file_name[100][12];
unsigned int file_count[1];
unsigned int dir_count[1];
unsigned int jpgfile_flag = 0;

int main()
{
FIL fp;
int i,j;

FRESULT retval = 0;
WORD lenth;

Set_PLL(16,4); 
Init_EBIU();

SD_Enable();	
f_mountdrv();
LCDBK_Disable();

InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
LCD_Enable();
Init_Timers0(1999);//1~1999 控制背光亮度
Enable_Timers0();
LCDBK_Enable();

scan_files("/",file_name,file_count,dir_name,dir_count);
while(1)
{
	for(i=0;i<file_count[0];i++)
	{
		for(j=0;j<12;j++)
		{
			if(file_name[i][j] == 0x2E)
			{
				if(file_name[i][j+1] == 0x4A || file_name[i][j+1] == 0x6A)
				{
					if(file_name[i][j+2] == 0x50 || file_name[i][j+2] == 0x70)
					{
						if(file_name[i][j+3] == 0x47 || file_name[i][j+3] == 0x67)
						{			
								jpgfile_flag = 1;
								break;
						}
					}
				}
			}
		}
		
		if(jpgfile_flag == 1)
		{
			jpgfile_flag = 0;
			retval = f_open(&fp, file_name[i], FA_OPEN_ALWAYS | FA_READ);
			if (retval != 0){
				printf("can't open:%s\n",file_name[i]);
				continue;
			}
			f_read(&fp, windowsBuffer_t, 0x200000, &lenth);
			f_close(&fp);

			jpg_scaling_rgb24(DisplayBuffer,480,272,windowsBuffer_t);
			RGB888_RGB565(DisplayBuffer,391680,DisplayBuffer_565);

			delay(100000);
		}
	}
}

}

lcd.c

#include <cdefBF533.h>

section (“sdram0_bank2”)unsigned char DisplayBuffer_565[272][1440] ;

void InitDMA(void)
{
int addr;
addr = &DisplayBuffer_565;
addr -= 1920;
*pDMA0_START_ADDR = addr;

*pDMA0_X_COUNT = 480;
*pDMA0_X_MODIFY = 2;
*pDMA0_Y_COUNT = 286;
*pDMA0_Y_MODIFY = 2;	
*pDMA0_CONFIG = 0x1034;

}

void InitPPI(void)
{
*pPPI_CONTROL = 0x781e;
*pPPI_DELAY = 0;
*pPPI_COUNT = 479;
*pPPI_FRAME = 286;
}

void InitTimer(void)
{
*pTIMER1_PERIOD = 525;
*pTIMER1_WIDTH = 41;
*pTIMER1_CONFIG = 0x00a9;
*pTIMER2_PERIOD = 150150;
*pTIMER2_WIDTH = 5250;
*pTIMER2_CONFIG = 0x00a9;
}

void PPI_TMR_DMA_Enable(void)
{
*pDMA0_CONFIG |= 0x1;
asm(“ssync;”);
InitTimer();
*pPPI_CONTROL |= 0x1;
asm(“ssync;”);
*pTIMER_ENABLE|= 0x0006;
asm(“ssync;”);
}

void PPI_TMR_DMAR_Disable(void)
{
*pDMA0_CONFIG &= (~0x1);
*pPPI_CONTROL &= (~0x1);
}

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;         
}

}

zoom.c

#include “bmp.h”
#include “data_type.h”
#include “zoom.h”
#include <string.h>

/***************************************************************************
//macro definition
**************************************************************************/
#define WIDTHBYTES(i) ((i+31)/32
4)

/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
struct bmp_info_
{
/0x424D,“BM”/
UINT16 bfType;
UINT16 bfSize;
UINT32 biWidth;
UINT32 biHeight;
UINT16 biBitCount;
};
typedef struct bmp_info_ bmp_info;

/***************************************************************************
GLOBAL
***************************************************************************/
static bmp_info bf;
static avctx_t bmp_avctx;

/***************************************************************************
PROTOTYPES
***************************************************************************/
int gain_bmp_info(UINT8 * buf);
int bmp_zoom(unsigned char * desc_buf,int desc_w,int desc_h,unsigned char * src_buf);

/***************************************************************************

jpg&jpeg file to rgb data

***************************************************************************/

int jpg_scaling_rgb24(UINT8 * output,int new_w,int new_h,UINT8 * input)
{

UINT32 w=480;
UINT32 h=272;
int color_components=1;
int file_len=MAXBUFFSIZE;
/*fill a jpg file data to inbuf and get len*/
JpegFileToRGB(output,&w,&h,&color_components,input,file_len);

return 0;

}
/***************************************************************************

bmp file to rgb data

***************************************************************************/
int bmp_scaling_rgb(UINT8 * output,int new_w,int new_h,UINT8 * input)
{
int data_size;
if(gain_bmp_info(input))
{
return -1;
}
bmp_decode_frame(&bmp_avctx, output, &data_size, input, MAXBUFFSIZE);
bmp_zoom(input,new_w,new_h,output);
gbrtorgb24(output,input,new_w,new_h);
return 0;
}
int gain_bmp_info(UINT8 * buf)
{
memcpy(&bf.bfSize,(buf),2);
if(bf.bfSize!=0x4d42)
{
printf(“This is not a bmp file!\n”);
return -1;
}
memcpy(&bf.bfSize,(buf+2),4);
if(bf.bfSize>MAXBUFFSIZE)
{
printf(“Can’t process bmp file more than %d bytes!\n”,MAXBUFFSIZE);
return -1;
}
memcpy(&bf.biWidth,(buf+0x12),4);
memcpy(&bf.biHeight,(buf+0x16),4);
memcpy(&bf.biBitCount,(buf+0x1c),2);
if(bf.biBitCount!=1 && bf.biBitCount!=2 && bf.biBitCount!=4 && bf.biBitCount!=8 && bf.biBitCount!=16 && bf.biBitCount!=24 && bf.biBitCount!=32)
{
printf(“Can’t process bmp of this color depth!\n”);
return -1;
}
return 0;
}

int bmp_zoom(unsigned char * desc_buf,int desc_w,int desc_h,unsigned char * src_buf)
{
UINT8 * lpPtr;
UINT8 * lpTempPtr;
int x0,y0,x1,y1;
float x_ratio,y_ratio;
int SrcBufSize,DstBufSize,LineBytes,DstLineBytes;
int i=0;

if(bf.biWidth==desc_w && bf.biHeight==desc_h)
{
	memcpy(desc_buf,src_buf,bf.biWidth*bf.biHeight*(bf.biBitCount/8));
}
else
{
	/*x1,y1表示新图像素坐标,与x0,y0在旧图中的坐标对应*/
	/*num1=old/new=1/zoomRatio*/
	x_ratio=(float) bf.biWidth/desc_w;
	y_ratio=(float) bf.biHeight/desc_h;
	//规范新图每行的宽度,4字节对齐
	DstLineBytes=(UINT32)WIDTHBYTES(desc_w*bf.biBitCount);
	LineBytes=(UINT32)WIDTHBYTES(bf.biWidth*bf.biBitCount);
	SrcBufSize=LineBytes*bf.biHeight;
	DstBufSize=DstLineBytes*desc_h;
	
	for(y1=0;y1<desc_h;y1++)
	{
		for(x1=0;x1<desc_w;x1++)
		{
			x0= (UINT32)(x1*x_ratio);
			y0= (UINT32)(y1*y_ratio);
			if( (x0>=0) && (x0<bf.biWidth) && (y0>=0) && (y0<bf.biHeight))
			{
				/*lpPtr指向原图缓存*//*lpTempPtr指向新图缓存*/
				/*SrcBufSize源图整个文件除去文件头信息的字节数*/
				/*LineBytes每行字节数*/
				lpPtr=(UINT8 *)src_buf+(SrcBufSize-LineBytes-y0*LineBytes)+(x0*bf.biBitCount/8);
				lpTempPtr=(UINT8 *)desc_buf+(DstBufSize-DstLineBytes-y1*DstLineBytes)+(x1*bf.biBitCount/8);
				for(i=0;i<bf.biBitCount;i++)
				{
					*lpTempPtr++=*lpPtr++;
				}
			}
		}
	}
}
return 0;

}

/***************************************************************************

bmp to rgb reference

*************************************************************************/
/
-------------------------------------------------
gbrtorgb24 - 改变颜色排列顺序,翻转图像。
-------------------------------------------------
/
/bmp_to_rgb将bmp的像素点阵转为rgb排列/
void gbrtorgb24(UINT8 * rgb_buf,UINT8 * bmp_buf,int width,int heigh)
{
int i,j;
int a,b;

for(i=0;i<heigh;i++)
{
	for(j=0;j<width;j++)
	{
		a=bmp_buf[i*(width*3)+(j*3)];
		b=bmp_buf[i*(width*3)+(j*3+2)];	
		bmp_buf[i*(width*3)+(j*3)]=b;
		bmp_buf[i*(width*3)+(j*3+2)]=a;
	}
}

for(i=0;i<heigh;i++)
{
	for(j=0;j<(width*3);j++)
	{
		rgb_buf[i*(width*3)+j]=bmp_buf[(heigh-1-i)*(width*3)+j];
	}
}

}
/-------------------------------------------------
reversal_pic - 翻转图像180度。
-------------------------------------------------
/

void reversal_pic(UINT8 * rgb_buf,UINT8 * bmp_buf,int width,int heigh)
{
int i,j;
for(i=0;i<heigh;i++)
{
for(j=0;j<(width3);j++)
{
rgb_buf[i
(width3)+j]=bmp_buf[(heigh-1-i)(width*3)+j];
}
}
}

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

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

相关文章

校园跳蚤市场平台/校园二手交易系统

摘 要 本文论述了校园跳蚤市场平台的设计和实现&#xff0c;该网站从实际运用的角度出发&#xff0c;运用了计算机网站设计、数据库等相关知识&#xff0c;网络和Mysql数据库设计来实现的&#xff0c;网站主要包括学生注册、学生登录、浏览商品、搜索商品、查看商品并进行购买…

Blender——“苹果”建模

效果图 1.调出点线面面板&#xff0c;衰减编辑 1.1打开blender&#xff0c;点击常规&#xff0c;按A全选物体&#xff08;摄像头、光源、正方体&#xff09;&#xff0c;按delete删除。 1.2 在3D视图中添加一个经纬球。点击添加&#xff0c;选择网格—>经纬球。 1.3 点击下…

前端JS也可以连点成线(Vue中运用 AntVG6)

前言 什么是 G6&#xff1f;G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明&#xff0c;简单。让用户获得关系数据的 Insight。其实说白了就是我们前端中的绘图工具&#xff1b;基于 G6&#xff0c;用户可以快速搭…

Linux基础知识-文件目录结构及基本属性

1、前言 上一篇我们讲到了Linux 文件类型7种类型&#xff0c;本篇我们说说Linux文件目录结构。 2、Linux 目录树 所有可操作的计算机资源都存在于目录树这个结构中&#xff0c;对计算资源的访问&#xff0c;可以看做是对这棵目录树的访问。Linux 的目录结构如下&#xff1a;…

常见日志框架使用及日志打印规范设计

文章目录一、slf4j 简介二、常用日志框架1&#xff09;log4jpom 依赖log4j.properties 文件配置测试参考2&#xff09;logbackpom 依赖logback.xml 配置测试参考3&#xff09; java.util.logging4&#xff09;commons loggingpom 依赖配置测试参考5&#xff09;slf4j-simplepom…

MFC UI控件相关

文章目录UI控件相关CDialog::OnInitDialog() 对话框初始化手动添加UpdateData() 刷新窗口数据DoDataExchange()数据与控件动态绑定afx_msg: 声明一个消息响应函数void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );DDV_MaxChars()UI控件相关 CDia…

20天学会Rust第一天之Helloword

阿sir今天开始学习Rust了&#xff0c;至于为什么学习呢&#xff1f; 以后再说 我们都知道&#xff0c;程序设计 数据结构 算法。 因此&#xff0c;我们依次学习Rust中数据结构的定义&算法的实现&#xff0c;然后用它们实现一个简单的“hello world” 数据结构 Rust提供…

什么是IoC和AOP

IoC是什么&#xff1f; 控制反转&#xff1a;面向对象的设计的理念。上层建筑依赖下层建筑 理解&#xff1a;行李箱设计 轮子 --> 底盘 --> 箱体 --> 行李箱 如果改动轮子&#xff0c;则底盘、箱体、行李箱都需要进行调整。 依赖注入&#xff1a;将底层类作为参数…

Spring之底层架构核心概念-BeanFactory 与ApplicationContext

目录1.BeanFactory2.ApplicationContext3.关系4.总结1.BeanFactory BeanFactory是一个接口 public interface BeanFactory {xxx... }2.ApplicationContext ApplicationContext 也是一个接口&#xff0c;继承自ListableBeanFactory, HierarchicalBeanFactory public interfa…

非零基础自学Golang 第15章 Go命令行工具 15.2 代码获取(get) 15.3 格式化代码(fmt)

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.2 代码获取(get)15.3 格式化代码(fmt)第15章 Go命令行工具 15.2 代码获取(get) go get命令用于从远程仓库中下载安装远程代码包&#xff0c;这是我们常用且非常重要的指令。 我们在开发程序时往往需要引…

Gateway网关-网关作用介绍

为什么需要网关&#xff1f; 如果允许任何人访问微服务&#xff0c;查看我们的敏感业务&#xff0c;这样数据是不是不安全。如果是我们的工作人员并且有相应的查看权限&#xff0c;我们才提供访问权限。那谁来做这件事呢&#xff1f;就是我们的网关。 网关的功能作用 1&#xf…

鼎镁科技冲刺上交所:年营收18亿 拟募资13亿

雷递网 雷建平 12月21日鼎镁新材料科技股份有限公司&#xff08;简称&#xff1a;“鼎镁科技”&#xff09;日前递交招股书&#xff0c;准备在上交所主板上市。鼎镁科技计划募资12.86亿元。其中&#xff0c;8.84亿元用于轻量化新材料生产、研发建设项目&#xff0c;2.53亿元用于…

消息号F5155处理办法

消息号F5155&#xff08;没有公司代码XDJT中买卖双方的资金权限&#xff09;处理办法 OBA4先检查用户的FI容差组 OB57查看分配用户给容差组&#xff0c;确认是否书写正确的容差组。

《疫情下的编程岁月》序言导读目录

导读 《疫情下的编程岁月》是一部为初学者编写的编程指南&#xff0c;作者是一名 13 岁的编程学习者和优质技术博主。在这部指南中&#xff0c;作者分享了自己在过去 5 年里学习编程技术的经历&#xff0c;并提供了宝贵的建议和技巧&#xff0c;帮助初学者更好地了解编程学习的…

math@间断点@微积分基本定理@变限积分求导公式

文章目录间断点第一类间断点跳跃间断点可去间断点例第二类间断点微积分定理第一基本定理变上限积分函数的导数定积分的角度原函数存在定理&#x1f60a;应用例例微积分第二基本定理变限积分求导公式例math间断点微积分基本定理变限积分的求导公式 间断点 第一类间断点 跳跃间…

SwiftUI开源库之 什么是 Lottie?Airbnb 的跨平台开源库,用于渲染矢量运动图形

什么是 Lottie Lottie是 Airbnb 的跨平台开源库,用于渲染矢量运动图形。我们在 Airbnb 广泛使用 Lottie,它还为整个行业的数千个其他应用程序中的动画提供支持。 发布了适用于 iOS 的Lottie 4.0 。这个主要的新版本通过由 Core Animation 提供支持的全新渲染引擎,为所有 L…

Flutter开发:仿iOS侧滑删除效果的实现

前言 在Flutter开发中&#xff0c;基于原生移动端开发的思想也会运用到混合开发中&#xff0c;尤其是原生移动的的好的特性和交互效果更是如此。在现在的发展情况下&#xff0c;Flutter下的混合开发已经越来越替代原生移动的开发&#xff0c;同时也会继承原生开发的优点&#x…

5年Java经验,定级阿里P7,所有经验全在这份Java核心知识笔记里了

前言 今年的大环境非常差&#xff0c;互联网企业裁员的现象比往年更严重了&#xff0c;可今年刚好是我的第一个“五年计划”截止的时间点&#xff0c;说什么也不能够耽搁了&#xff0c;所以早早准备的跳槽也在疫情好转之后开始进行了。但是&#xff0c;不得不说&#xff0c;这次…

编译和使用hadoop遇到的问题——问题随手记【持续更新】

文章目录编译hadoop遇到的问题java.lang.NoClassDefFoundError: org/apache/hadoop/util/PlatformNamejava.lang.ClassNotFoundException: org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos\$MasterService\$BlockingInterfacejava.lang.ClassNotFoundExceptio…