我正在尝试使用 CCR0输出从 TA0触发 ADC10采样/转换、而无需执行 ISR。
如果我使用 OUTMOD_4使 CCR0输出切换、并且使用 ADC10CTL1 |= SHS_2、按照 SLAU144J 第535页的图表、触发应该会通过、而无需设置 ADC10SC。
尽管 ADC10CTL1寄存器描述第555页有一个很好的打印件、"如果器件上存在多个计时器模块、则计时器触发来自 Timer0_Ax。"、这使我认为 MSP430x2xx 系列器件中至少应有2个计时器。
嗯、它不起作用。 通过多个实验、每次需要完成采样/转换时、ADC10SC 看起来都必须置位、只有在 CCR0输出触发它时、ADC10SC 才会置位。
请确认或重新确认我的发现。
下面是部分代码。
#include
#define LED BIT0
#define CCR0_OUT BIT1
void TA0_init (void);
void adc_init (void);
void main (void){
WDTCTL = WDTPW + WDTHOLD;
if (CALBC1_16MHz=0xFF){WDTCTL=0xDEAD;}
BCSCTL1 = CALBC1_16MHz;
DCOCTL = CALDCO_16MHz;
BCSCTL3 |= LFXT1S_2; //为 ACLK 选择 VLOCLK、~15KHz
BCSCTL1 |= DIV_0; // ACLK/1、用于 LPM0中的 TA0
BCSCTL2 |= DIVS_1; // SMCLK/2 =8MHz、用于 ADC 实验
P1SEL = CCR0_OUT; // TA0.CCR0输出的范围测试点
P1DIR = LED +CCR0_OUT; // ADC ISR 和 TA0.CCR0输出的示波器测试点
TA0_INIT();
adc_init();
_EINT(); //启用 ISR
TA0CTL |= MC_1; //启动 TIMER0直到 CCR0
for (;;){
_BIS_SR (CPUOFF); //输入 LPM0
}
}
void ADC_init (void){ //读取温度计、Trigg。 来自 TA0CCR0、为 ADC10OSC (或 SMCLK)计时
ADC10CTL0 = SREF_0 + ADC10SHT_2 + REF2_5V + REFON + ADC10ON + ADC10IE;
ADC10CTL1 = INCH_10 + SHS_2 + ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0; //尝试 ADC10SSEL_3
ADC10DTC1 = 0;
ADC10CTL0 |= ENC + ADC10SC;//为第一个采样/转换设置 ADC10SC
}
void TA0_init (void){ //计时器 A 用于去抖和其他操作
TA0CTL = TACLR; //清除 TAR
TA0CTL = tassel_1 + ID_0; // ACLK (11.5KHz)、/1、(+ MC_1到 CCR0模式)
TA0CCR0 = 2944; // TA0CCR0=ACLK*T (sec)=256msec
TA0CCTL0 = OUTMOD_4; //切换 CCR0输出
}
#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void){
_nop();
P1OUT μ^= LED; //每个 ADC10 ISR 上的可视/示波器输出
易失性 int ADC_MEM =(ADC10MEM & 0x03FF); //需要访问 ADC10MEM 以清除 ISR
ADC_MEM ^= 0xFFFF; //使用 ADC_MEM 执行一些愚蠢的操作来使编译器满意
ADC10CTL0 |= ADC10SC; //将 ADC10SC 设置为下一个采样/转换被触发为 TA0 CCR0 OUT
}