📄 play-pcm.c
字号:
#include "def.h"
#include "2410lib.h"
#include "option.h"
#include "2410addr.h"
#include "interrupt.h"
#include "coff.h"
#include "hpi.h"
//arm-elf-ld -r -o wave8k.o -b binary hong.pcm
//arm-elf-ld -r -o dsp.o -b binary exp-audio.out
#define BIT_CLR(X, bits) (X &= ~bits)
#define BIT_SET(X, bits) (X |= bits)
#define TOTAL_WAV_SECS 30
#define TOTAL_WAV_BULK (TOTAL_WAV_SECS * 8)
#define DSP_HPI_DRAM_BASE HPI_MEMORY_BASE
#define DSP_HPI_DRAM_START 0x1000
#define DSP_HPI_DRAM_SIZE 4000
extern unsigned long __input_data;
extern unsigned long __input_data_end;
extern unsigned long __input_coff;
extern unsigned long __input_coff_end;
int time_cnt = 0;
unsigned short* psrc = (unsigned short*)(unsigned long)(&__input_data);
void __vWDTInterrupt(void) __attribute__ ((interrupt("IRQ")));
void __vWDTInterrupt(void)
{
int index;
unsigned short* pdst = (unsigned short*)DSP_HPI_DRAM_BASE+DSP_HPI_DRAM_START;
rSRCPND &= BIT_WDT; // Clear any pending WD int
rINTPND &= BIT_WDT;
if(time_cnt&1)
{
pdst += (DSP_HPI_DRAM_SIZE/2);
}
time_cnt++;
if( time_cnt >= TOTAL_WAV_BULK )
{
psrc = (unsigned short*)(unsigned long)(&__input_data);
time_cnt = 0;
}
// Copy wave data
for( index = 0; index < 2000; index++)
{
*pdst++ = *psrc++;
}
}
/********************************************************************
// Function name : Main
// Description : JXARM9-2410 -> DSP 放音实验主程序
// 实现功能:
// 实现JXRAM9-2410与DSP通过HPI的串口通讯
// Return type : void
// Argument : void
*********************************************************************/
void Main(void)
{
time_cnt = 0;
/* 配置系统时钟 */
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(0xcd,0x0b,0x0); // FCLK=196.615387MHz (PCLK=49.153847MHz)
Uart_Init(49153847, 115200);
Uart_Select(0);
Port_Init();
Uart_Printf("Begin....\n");
load_coff((unsigned long)(&__input_coff), (unsigned long)(&__input_coff_end));
// 初始化定时器,产生每秒8次中断,在每次中断中传递4k数据到DSP
rWTCON = 0; // Disable watchdog
rSRCPND &= BIT_WDT; // Clear any pending WD int
rINTPND &= BIT_WDT;
pISR_WDT = (U32)__vWDTInterrupt;
rWTDAT = 49153847 / (128 * 64 * 8); //set up the WDT for wTicksPerSec
rWTCON = (63<<8)|(1<<5)|(3<<3)|(1<<2)|(0<<0); // Enable: WD, WD interrupts, disable reset
BIT_CLR(rINTMSK, BIT_WDT); // Enable WatchDog interrupts
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -