时间很急,实在没时间看他们的库文件。
DAC的输出思路很简单,就是拿TIM4做定时中断,在中断处理程序中更新DAC的数据,结果出来的是方波形,而且还不有点变形。
程序如下。请各位专家帮忙。谢谢。
顺便问一句:MAMP到底是内部输出三角波的放大还是对于任意波形都可以放大?
const int16_t gSinBuf[] = { // 500hz的正弦数据
0x0, 0x053f, 0x09b3, 0x0cab, 0x0db7, 0x0cab, 0x09b2, 0x053f,
0x0, 0xfac0, 0xf64d, 0xf354, 0xf249, 0xf354, 0xf64e, 0xfac0};
/***************************************************************
****************************************************************/
void DAC_Init( void )
{
// 打开DAC时钟
CLK_PCKENR1 |= 0x80;
// DAC control register 2(DMA close)
DAC_CR2 = 0;
// PF0为输出
PF_DDR |= 0x01;
PF_CR1 &= (~0x01); // 开漏输出
PF_CR2 &= (~0x01);
// DAC control register 1
DAC_CR1 = 0x3f; // s/w trig,OUT buf disable,DAC channel disable
////// 下面是TIM4的初始化程序 //////
// 为了简化,就不列出了,经过测试是正确的时间间隔
.........
}
/***************************************************************
****************************************************************/
@far @interrupt void TIM4_UPD_IRQHandler (void)
{
static uint8_t buf_len = 0;
static uint8_t *buf_ptr = NULL;
static uint16_t zero_len = 0;
static int16_t val = 0;
// clear update flag
TIM4_SR1 &= 0xfe;
DAC_Write(val);
zero_len ++;
if( buf_len ) // 准备下一个数据
{
val = gSinBuf[buf_len-1];
buf_len --;
}
else
{
buf_len = 16;
val = gSinBuf[buf_len-1];
buf_len --;
}
}
/***************************************************************
****************************************************************/
static void DAC_Write( uint16_t data )
{
// 只保留高12位,其中低4位丢弃
DAC_RDHRH = (data & 0xf000)>>12;
DAC_RDHRL = ((data & 0xfff)>>4);
// ????????这个不用每次设定吧,是不是在初始化的时候设置一次就可以????
// 还是写入DAC_RDHRH和DAC_RDHRL的时候就触发了???
DAC_SWTRIGR = 0x1;
}
|