|
发表于 2013-6-15 12:17:38
|
显示全部楼层
我用LMF4L120试了下,效果差的很,有很明显的尖噪音,我直接用IO驱动蜂鸣器,接音响效果好点,但噪声依然很大
50M/256 等效约200k的DA
void BeepLevelSet(int level);
#define VOICE_TIMER SYSCTL_PERIPH_TIMER2
#define VOICE_TIMER_BASE TIMER2_BASE
#define VOICE_GPIO_PIN_CFG GPIO_PB0_T2CCP0
#define VOICE_GPIO_PIN GPIO_PIN_0
#define VOICE_GPIO_PERIPH SYSCTL_PERIPH_GPIOB
#define VOICE_GPIO_BASE GPIO_PORTB_BASE
static unsigned int BufferPosMax=0;
static unsigned char *WaveBufferStart=0;
void IntTimer5HandlerA(void)
{
static unsigned int BufferPos;
HWREG(TIMER5_BASE + TIMER_O_ICR) = 0x01;
if(0==WaveBufferStart){
BufferPos=0;
return;
}
BeepLevelSet(WaveBufferStart[BufferPos]);
BufferPos++;
if(BufferPos>=BufferPosMax){
BufferPos=0;
WaveBufferStart=0;
}
return;
}
void BeepInit(void)
{
//
// Enable the GPIO Port and Timer for each LED
//
SysCtlPeripheralEnable(VOICE_GPIO_PERIPH);
SysCtlPeripheralEnable(VOICE_TIMER);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0);
//
// Configure each timer for output mode
//
HWREG(VOICE_TIMER_BASE + TIMER_O_CTL) = 0x00;
HWREG(VOICE_TIMER_BASE + TIMER_O_CFG) = 0x04;
HWREG(VOICE_TIMER_BASE + TIMER_O_TAMR) = 0x0A;
HWREG(VOICE_TIMER_BASE + TIMER_O_TAILR) = 0xFF;
//
// Invert the output signals.
//
HWREG(VOICE_TIMER_BASE + TIMER_O_CTL) |= 0x40;
//
// Enable timers to begin counting
//
TimerEnable(VOICE_TIMER_BASE, TIMER_A);
//
// Reconfigure each LED's GPIO pad for timer control
//
GPIOPinConfigure(VOICE_GPIO_PIN_CFG);
GPIOPinTypeTimer(VOICE_GPIO_BASE, VOICE_GPIO_PIN);
GPIOPadConfigSet(VOICE_GPIO_BASE, VOICE_GPIO_PIN, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD);
BeepLevelSet(0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5);
HWREG(TIMER5_BASE + TIMER_O_CTL) = 0x00;
HWREG(TIMER5_BASE + TIMER_O_CFG) = 0x04;
HWREG(TIMER5_BASE + TIMER_O_TAMR) = 0x02;
HWREG(TIMER5_BASE + TIMER_O_TAILR) = 0x186A; //8000
TimerMatchSet(TIMER5_BASE,TIMER_A,2);
TimerEnable(TIMER5_BASE, TIMER_A);
TimerIntEnable(TIMER5_BASE,TIMER_TIMA_TIMEOUT);//TIMER_TIMA_MATCH //TIMER_TIMA_TIMEOUT
IntEnable(INT_TIMER5A);
}
void BeepLevelSet(int level)
{
TimerMatchSet(VOICE_TIMER_BASE,TIMER_A,level);
}
void TestWaveOut(void)
{
BufferPosMax=sizeof(wave_data);
WaveBufferStart=(unsigned char*)wave_data;
}
|
|