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

📄 dma.c

📁 在S3C44B0X ARM处理器上用C语言实现的IIS接口驱动程序
💻 C
字号:
/*************************************************************************
* File Name:DMA.c
* Description:DMA初始化与中断处理。
* Date:2008-6-07
*************************************************************************/
#include "ISR.h"
#include "Uart.h"
#include "I2S.h"
#include "DMA.h"

#define buflen 0x8000		//单个缓冲区长度为32k*sizeof(int)字节
extern int iisbuf1[];
extern int iisbuf2[];
extern char flag,flag1;			//用于标志当前被处理的缓冲区
/*
*************************************************************************************************************
- 函数名称 : void dma_init(void)
- 函数说明 : DMA初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void dma_init(void)
{
//Init DMA Ch 1
	flag = 0; //标志位置位
    BDISRC0 = ((unsigned int)0x2<<30)			   // 字传送
			+ ((unsigned int)0x3<<28)			   // 内存地址固定(内部I/O接口)
			+ (unsigned int)(pIISFIF);			   // IISFIF的地址

    BDIDES0	= ((unsigned int)0x2<<30)|   		   //内部I/O到Memory
			  ((unsigned int)0x1<<28)|   		   //地址增加
			  ((unsigned int)iisbuf1);	 		   //目标地址为iisbuf1

    BDICNT0 = ((unsigned int)0x1<<30)| 	 		   //请求源为IIS
			  ((unsigned int)0x0<<28)|   		   //握手模式(保留)
			  ((unsigned int)0x1<<26)|    		   //单次传输模式(保留)
			  ((unsigned int)0x0<<24)|   		   //在BDMA模式下,不支持On-The-Fly模式
			  ((unsigned int)0x3<<22)|  		   //终止计数时发生中断
			  ((unsigned int)0x1<<21)|  		   //不采用自动重装和自动启动
			  ((unsigned int)0x0<<20)|   		   //DMA使能禁止
			  ((unsigned int)buflen*sizeof(int));  //传输的数据量

    BDICNT0 |= ((unsigned int)0x1<<20);			   // DMA使能允许
    BDCON0  &= 0xFFFFFFF0;				    	   // DMA请求使能允许,无软件命令

}

/*
*************************************************************************************************************
- 函数名称 : __irq void HandlerBDMA0(void)
- 函数说明 : BDMA0中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
__irq void HandlerBDMA0(void)
{
	I_ISPC = ((unsigned int)0x1<<17);		        // 清除BDMA0 Interrupt

	BDICNT0 &= 0xFFEFFFFF;						    // DMA Disable

    BDISRC0 = ((unsigned int)0x2<<30)		        // 字传送
			+ ((unsigned int)0x3<<28)		        // 内存地址固定(内部I/O接口)
			+ (unsigned int)(pIISFIF);		        // IISFIF的地址

	if (flag == 0)
	{
		//iisbuf1录音完成,对iisbuf2录音
    	BDIDES0	= ((unsigned int)0X2<<30)|     	    //内部I/O到Memory
				  ((unsigned int)0X1<<28)|     	    //地址增加
				  ((unsigned int)iisbuf2);	    	//目标地址为iisbuf2
		flag = 1; 									//标志位置位
	}
	else
	{
		//iisbuf2录音完成,对iisbuf1录音
    	BDIDES0	= ((unsigned int)0X2<<30)|     		//内部I/O到Memory
				  ((unsigned int)0X1<<28)|     		//地址增加
				  ((unsigned int)iisbuf1);	    	//目标地址为iisbuf1
		flag = 0; 									//标志位置位
	}


    BDICNT0 	= ((unsigned int)0x1<<30)| 			//请求源为IIS
				  ((unsigned int)0x0<<28)| 			//握手模式(保留)
				  ((unsigned int)0x1<<26)| 			//单次传输模式(保留)
				  ((unsigned int)0x0<<24)| 			//在BDMA模式下,不支持On-The-Fly模式
				  ((unsigned int)0x3<<22)| 			//终止计数时发生中断
				  ((unsigned int)0x1<<21)| 			//不采用自动重装和自动启动
				  ((unsigned int)0x0<<20)| 			//DMA使能禁止
				  ((unsigned int)buflen*sizeof(int));  //传输的数据量
	
    BDICNT0 |= ((unsigned int)0x1<<20);	  			// DMA使能允许
    BDCON0  &= 0xFFFFFFF0;							// DMA请求使能允许,无软件命令

					flag1 = 1;						//中断已发生标志位置位
}

⌨️ 快捷键说明

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