📄 dma.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 + -