⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 main.c

📁 adi-bf533-dma-求FFT和DMA综合源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************/
//
// Name: 	BF533 EZ-KIT main function	DSP作业(求FFT和DMA综合)
//
/******************************************************************************

(C) Copyright 2006 - 王启源,指导教师:吴强   导师:阮晓钢	人工智能与机器人研究所,

File Name:	main.c

Date Modified:	5/21/07		$Revision: 		1.00 $

Software:       VisualDSP++4.5

Hardware:		ADSP-BF533 EZ-KIT Board

Special Connections:  None

Purpose:		The file is the main functian.

By:				 Lions Wang   BJUT    AI&Robots  Tuttor: Ruan Xiaogang. 			

See also: 		实验报告

explaination: 当然可以用直接写的方式将XYZ写入SDRAM但是那样损失了DSPcore的速度

ALL RIGHTS RESERVED.					

*********************************************************************************/
//需要改1:DMA0为描述子或者别的形式,以将Y打倒相应位置。2:将XYZ的位置修改正确
/**********************************************************************

Include files

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

#include <cdefBF533.h>		//BF533 Register Pointer Definition
#include <stdio.h>
#include <sys\exception.h>		//Interrupt Handling Header
#include <services/services.h>		// system service includes
#include <drivers/adi_dev.h>		// device drivers includes
//#include "ezkitutilities.h"

#include<fract.h>
#include<complex.h>  
#include <math.h>
#include <filter.h>
#include <flt2fr.h>

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

Enumerations and defines

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

//定义变量的大小可以自己改之
#define PI 3.14159265   
#define XFFT_SIZE 1024   		//定义X的大小
#define YFFT_SIZE 256 		//定义Y的大小   
#define ZFFT_SIZE 2048 		//定义Z的大小

#define XADDR 0x00001000   	//定义X的地址
#define YADDR 0x00100000   	//定义Y的地址
#define ZADDR 0x00200000   	//定义Z的地址
//链式DMA用到的定义
#define BUFFERS					2			// number of descriptors in the chain (limited only by memory)
#define ELEMENTS				XFFT_SIZE	// number of words of data per descriptor ( the first 1)
#define BYTES_PER_ELEMENT		2			// number of bytes in each word (1, 2, or 4)

// Define some space in SDRAM for memory DMAs
#define SDRAM_DATA_START		XADDR		// I use SDRAM data starting at this address
#define SOURCE_DATA_START		SDRAM_DATA_START//暂时定义到这上面,用时就修改了
#define DESTINATION_DATA_START	(SDRAM_DATA_START + (BUFFERS * ELEMENTS * BYTES_PER_ELEMENT))//暂时定义到这上面,用时就修改了

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

Static data

*********************************************************************/
static  fract16 X[XFFT_SIZE+1];//定义1.15格式的变量X   
static	fract16 Y[YFFT_SIZE+1];//定义1.15格式的变量Y
static	fract16 Z[ZFFT_SIZE+1];//定义1.15格式的变量Z
  	fract16 *x=XADDR;//定义1.15格式的变量X   
	fract16 *y=YADDR;//定义1.15格式的变量Y
	fract16 *z=ZADDR;//定义1.15格式的变量Z
float temp1[ZFFT_SIZE];//定义一个浮点变量用于看结果

static ADI_DMA_DESCRIPTOR_LARGE		DestinationBuffers[BUFFERS];// descriptors where data is written to
static ADI_DMA_DESCRIPTOR_LARGE		SourceBuffers[BUFFERS];		// descriptors where data is written from

//下面的定义本利没用但是可以用于扩展应用
static u8 							DMAMgrData[ADI_DMA_BASE_MEMORY + (ADI_DMA_CHANNEL_MEMORY * 2)];
static ADI_DMA_MANAGER_HANDLE		DMAManagerHandle;					// handle for the whole DMA manager

ADI_DMA_CHANNEL_HANDLE				dma_s0_chan_handle;					// source DMA channel handle
ADI_DMA_CHANNEL_HANDLE				dma_d0_chan_handle;					// destination DMA channel handle

static u8 							DCBMgrData[ADI_DCB_QUEUE_SIZE + ADI_DCB_ENTRY_SIZE];
static ADI_DCB_HANDLE				CallbackHandle;			// handle to the callback service
static u8							CallbackQueue[ADI_DCB_ENTRY_SIZE*10];// callback queue

// Sets up here all Prototype Functions 
void Init_EBIU(void);
void Init_Flash(void);
void Init_ADV(void);
void Init_Interrupts(void);
void Init_SDRAM(void);
void Init_MYMDMA0(fract16 *SorseADDR,fract16 *GoalADDR,u32 DMA_Count);
void Init_MYMDMA1(fract16 *SorseADDR,fract16 *GoalADDR,u32 DMA_Count);
void Init_PPI(void);
void Init_PLL(void);
void myfftfunction(fract16 sourse[],u32 FFT_Count);
void buffer_setup(
	int buffs,							// number of buffers (descriptors) to use in each direction
	int elements,						// number of elements in each buffer (descriptor)
	int bytes_per_element);				// number of bytes in each element (1, 2, or 4)
void DMAFUN(void);

/*********************************************************************
 *	FFT和DMA主函数
 *	DSP作业(求FFT和DMA综合)----王启源,指导教师:吴强   导师:阮晓钢	人工智能与机器人研究所,
 *  See also: 实验报告
 *  Lions Wang   BJUT    AI&Robots  Tuttor: Ruan Xiaogang.
 *  $Revision: 1.00 $
*********************************************************************/
void main()
{
	int i,j;   ;//定义的循环变量
		
//setup;
	Init_PLL();
	Init_EBIU();		//Async Memory Interface Setup,本题没用
	Init_Flash();		//Flash Setup to config the flash GPIOs,本题没用
//	Init_ADV();			//Link the ADV7183 clock to the PPI and ADV7183 reset,本题没用,可以以后扩展ADC

	Init_Interrupts();	//Enter an interrupt subroutine after DMA has been finished,定义DMAA的中断用于以后扩展
	Init_SDRAM();		//SDRAM Setup to store the video image,初始化SDRAM
	
//	initfun();//初始化函数,初始化X,Y,Z     
    
    for(i=1;i<=YFFT_SIZE;i++)
    {
        temp1[i]=cos(3*PI/i);				//此句话可以去掉,
        Y[i]=float_to_fract16(temp1[i]);	//初始化向量Y
    }  
    
 for(i=1;i<=XFFT_SIZE;i++)

    {
        X[i]=float_to_fract16(sin(PI/i));  	//初始化向量X         
    }
    
    fract16 Z[ZFFT_SIZE];
    for(i=1;i<=ZFFT_SIZE/YFFT_SIZE;i++)
    {
        for(j=1;j<=YFFT_SIZE;j++)
        {
           Z[(i-1)*YFFT_SIZE+j]=Y[j];		//初始化向量Z
        }
    } 
	
	DMAFUN();			//DMA Setup "L1data RAM->DMA->SDRAM" Its configured in Stop Mode
//用了链式DMA方式和STOP MODE DMA 方式
	printf("\n DMA--X Setup completed successfully!\n"); //将X用DMA的方式打到SDRAM上
//	x=XADDR;
	myfftfunction(X,XFFT_SIZE);	//求X的FFT
	printf("\nX FFT completed successfully!\n"); 	//自己写的FFT函数
	
//	Init_MYMDMA0(Y,YADDR,YFFT_SIZE);				//DMA Setup "L1data RAM->DMA->SDRAM" Its configured in Stop Mode
	printf("\n DMA --Y Setup completed successfully!\n"); //将Y用DMA的方式打到SDRAM上				
//	*y=YADDR;
	myfftfunction(Y,YFFT_SIZE);	//求X的FFT
	printf("\n Y FFT completed successfully!\n"); 	//自己写的FFT函数
	
	Init_MYMDMA1(Z,ZADDR,YFFT_SIZE);				//DMA Setup "L1data RAM->DMA->SDRAM" Its configured in Stop Mode
	printf("\n DMA--Z Setup completed successfully!\n"); //将Y用DMA的方式打到SDRAM上
//	*z=ZADDR;
	myfftfunction(Z,ZFFT_SIZE);	//求X的FFT
	printf("\nZ  FFT completed successfully!\n"); 	//自己写的FFT函数

//	Init_PPI();			//PPI Setup,本题没用可以用于以后扩展视频输入,当然是DMA方式。	
	while (1)
	{
		i = 1;
	}//程序的死循环
}//end main
/*********************************************************************
 *	FFT函数myfftfunctio
 *	DSP作业(求FFT和DMA综合)----王启源,指导教师:吴强   导师:阮晓钢	人工智能与机器人研究所,
 *  See also: 实验报告
 *  Lions Wang   BJUT    AI&Robots  Tuttor: Ruan Xiaogang.
 *  $Revision: 1.00 $
*********************************************************************/
void myfftfunction(fract16 sourse[],u32 FFT_Count)
{
    int i,j;   
//sourse[]'s FFT
    complex_fract16  tempsourse[FFT_Count];
    complex_fract16  outputsourse[FFT_Count];			//fft的输出
    complex_fract16  twiddle_tablesourse[FFT_Count/2];	//反转向量,位反序
    twidfftrad2_fr16(twiddle_tablesourse,FFT_Count);
    rfft_fr16(sourse,tempsourse,outputsourse,twiddle_tablesourse,1,FFT_Count,1/FFT_Count,1/FFT_Count);//调用系统函数求fft,调用之前先反转

 }//end myfftfunction
/*********************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -