qinkaiabc 发表于 2014-5-8 18:49
中断函数呢?
你最好先注释,省的网友麻烦再翻数据手册了。、。。。
我使用ADC12IFG0作为DMA的触发源,每次转换完成都能触发DMA把数据传输到DA的DAC12_0DAT寄存器去,DA是立即能输出的,这样的话应该可以不用中断函数吧?还是说是没写中断函数引起了No source available for "0x4"的问题?
附上带注释的程序
#include
void Clk_init(void)
{
//P1DIR|=BIT0;
//P1SEL|=BIT0;
while(BAKCTL&LOCKIO)
BAKCTL&=~LOCKIO; //使能XT1
P7SEL|=BIT2+BIT3;
UCSCTL6&=~(XT1OFF);
UCSCTL6&=~XT2OFF; //使能XT2
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);
SFRIFG1&=~OFIFG;
}while(SFRIFG1&OFIFG); //检查是否清楚失效标志位
UCSCTL6&=~XT2DRIVE0;
UCSCTL4|=SELA_0+SELM_5+SELS_5; //ACLK=XT1=32K MCLK=SMCLK=XT2=4M
}
void Timer_init(void)
{
TA0CCR0=999; //采样频率4M/1000=4K
TA0CCTL1|=OUTMOD_3; //输出模式3 置位复位
TA0CCR1=500;
TA0CTL=TASSEL_2+MC_1+TACLR; //TA时钟源SMCLK 增计数模式
}
void ADC_init(void)
{
REFCTL0&=~REFMSTR;
P6SEL|=BIT0;
ADC12CTL0=ADC12ON+ADC12SHT0_2+ADC12REF2_5V+ADC12REFON; //打开ADC12 多次采样 采样保持时间16*ADC12CLK 片内产生参考电压2.5v
ADC12CTL1=ADC12SSEL_2+ADC12CONSEQ_2+ADC12SHS_1+ADC12SHP; //采样信号源自timerA 重复当前通道 ADC12时钟源为MCLK
ADC12CTL2=ADC12RES_2; //12位分辨率转换需要 13个ADC12CLK周期
ADC12MCTL0=ADC12INCH_0+ADC12SREF_1; //通道0 参考电压2.5v
ADC12CTL0|=ADC12ENC;
}
void DAC_init(void)
{
DAC12_0CTL0=DAC12IR+DAC12SREF_0+DAC12AMP_5+DAC12ENC+DAC12CALON+DAC12OPS; //满程输出Vref(2.5v)使能DAC
}
void DMA_init(void)
{
DMACTL0=DMA0TSEL__ADC12IFG; //DMA触发源ADC12IFG0
DMA0CTL=DMADT_4+DMADSTINCR_0+DMAEN; //重复单次传输模式 源地址不变 使能
__data16_write_addr((unsigned short)&DMA0SA,(unsigned long)&ADC12MEM0); //源地址
__data16_write_addr((unsigned short)&DMA0DA,(unsigned long)&DAC12_0DAT); //目标地址
DMA0SZ=0x01; //传输数据单位1字
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; // Stop watchdog timer
Clk_init();
Timer_init();
ADC_init();
DMA_init();
DAC_init();
__bis_SR_register(CPUOFF + GIE); // Enter LPM0, enable interrupts
__no_operation(); // For debugger
}