📄 fdmac2isr.c
字号:
#include <codec.h>
#include <firlab.h>
#include <dsplib.h>
#include <math.h>
extern void delay(s16 period);
extern unsigned int channel; /*IN: DMA channel number */
extern unsigned int dmsefc; /*IN: Value to set sync & fr reg */
extern unsigned int dmmcr; /*IN: Value to set mode control reg */
extern unsigned int dmctr; /*IN: Value to set element count reg */
extern unsigned int src_page; /*IN: Value to set source page reg */
extern unsigned int src_addr; /*IN: Value to set source addr reg */
extern unsigned int dst_page; /*IN: Value to set dest page reg */
extern unsigned int dst_addr; /*IN: Value to set dest addr reg */
extern DATA inp_buffer[0x200];
extern DATA out_buffer[0x200];
extern int frame;
extern int flag;
extern int currbuff;
DATA y[256];
u16 f[128];
void init_dma3(void)
{
while(DMPREC&0x0008) {}; //DMA3的传送是否结束
/* Initialize DMA channel 3 */
dmsefc = ((DSYNC_REVT1 <<12));
dmmcr = 0x4141; //AUTOINIT=0,DINM=1,IMOD=0,CTMOD=0,SIND=0x001;DMS=0x01,DIND=0x000,DMD=0x01
dmctr = 0xFF; //256 element/frame
src_addr = (unsigned int) &out_buffer+((unsigned int)frame*0x100);
dst_addr = DXR1_ADDR(HANDSET_CODEC);
dma_init(DMA_CH3, dmsefc, dmmcr, dmctr, SPACE_DATA, src_addr, SPACE_DATA, dst_addr);
/* Set number of frames for channel 3 */
DMA_FRAMECOUNT(DMA_CH3, 0); //2 frame/block
/* Enable channel 3 */
DMA_ENABLE(DMA_CH3);
}
interrupt void DMAC2ISR(void)
{
DATA *p_inp,*p_out;
int i,m,k;
double p,q,tp;
p_inp=inp_buffer+frame*0x100;
p_out=out_buffer+frame*0x100;
for (i=0;i<256;i++)
*(p_out+i)=*(p_inp+i);
init_dma3();
frame^=1;
cbrev(p_inp,y,128);
rfft(y,256,1);
f[0]=abs(y[0]);
m=1;
for(k=2;k<256;k=k+2)
{
p=y[k];
q=y[k+1];
tp=p*p+q*q;
tp=sqrt(tp);
f[m]=tp;
m++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -