|
楼主可以参考下面的代码:
- //======================================================================
- // 文件名称: main.asm
- // 功能描述: 通过音频通道输入,同时通过DAC1、DAC2输出
- // 采样率为8KHz
- // 维护记录: 2005-09-12 v1.0
- //======================================================================
- .DEFINE P_TimerA_Data 0x700A
- .DEFINE P_TimerA_Ctrl 0x700B
- .DEFINE P_ADC 0x7014
- .DEFINE P_ADC_Ctrl 0x7015
- .DEFINE P_DAC2 0x7016
- .DEFINE P_DAC1 0x7017
- .DEFINE P_DAC_Ctrl 0x702A
- .DEFINE P_INT_Ctrl 0x7010
- .DEFINE P_INT_Clear 0x7011
- .DEFINE P_Watchdog_Clear 0x7012
- .DEFINE C_Fosc_2 0x0000
- .DEFINE C_B1 0x0030
- .DEFINE C_TIMERA_8KHZ (0xffff-0x600)
- .RAM
- .CODE
- //==========================================================================
- // 汇编格式: _main
- // C格式: int main(void);
- // 实现功能: 通过音频通道输入,同时通过DAC1、DAC2输出
- // 采样率为8KHz
- // 入口参数: 无
- // 出口参数: 无
- // 破坏寄存器:r1,r2
- //==========================================================================
- .PUBLIC _main
- _main:
- int off
-
- r1 = C_Fosc_2 | C_B1
- [P_TimerA_Ctrl] = r1
- r1 = C_TIMERA_8KHZ //设置定时器计数初值
- [P_TimerA_Data] = r1
-
- r1 = 0x0005 //使能自动增益AGC、MIC、ADC
- [P_ADC_Ctrl] = r1
- r1 = 0x00a8 //通过定时器A的溢出锁存数据,ADC为自动方式
- [P_DAC_Ctrl] = r1
- r1 = 0x1000
- [P_INT_Ctrl] = r1 //允许IRQ1中断
-
- int irq //开IRQ总中断,关FIQ中断
-
- ?Loop:
- r1 = 0x0001
- [P_Watchdog_Clear] = r1 //清看门狗
- jmp ?Loop
-
- .TEXT
- .PUBLIC _IRQ1
- _IRQ1:
- push r1,r5 to [sp]
-
- r1 = [P_ADC] //取MIC输入并转换后数据
- [P_DAC1] = r1 //把输入数据送到DAC1和DAC2输出播放
- [P_DAC2] = r1
- r1 = 0x0001
- [P_Watchdog_Clear] = r1 //清看门狗
-
- r1 = 0x1000
- [P_INT_Clear] = r1 //清IRQ1中断标志
- pop r1,r5 from [sp]
- reti
复制代码
关键看下思路,有注释,好好看下,应该能懂,虽然是ASM |
|