This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2333:不同频率下的 Timer1_A0和 Timer1_A1

Guru**** 2562120 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602344/msp430g2333-timer1_a0-and-timer1_a1-on-different-frequency

器件型号:MSP430G2333

你(们)好  

我很难让 Timer1_A0和 A1在不同的频率下工作、Timer1_A1似乎遵循我在 Timer1_A0上设置的任何内容。  

根据我的理解、Timer1_A0、A1和 A2应该能够正常工作?  

在以下代码中、我希望 LED1切换1Hz、而 LED2切换4Hz、但我看到它们都切换1Hz。 我犯了什么错误?

感谢大家!

int main (void){
//InitialSystem ();

WDT_STOP ();

/* 12.5pF 至 ACLK */
BCSCTL3 |= XCAP_3;

//将 ACLK 除以8 */
BCSCTL1 |= DIV_3;


//将所有 IO 初始化至已知状态*/
P1DIR = 0xFF;
P2DIR =


0x00;OUT

= 0xP2PIR = 0x00;= 0xP2DIR = 0x00;
P3OUT = 0x00;

/* ACLK、向上计数模式、清除计时器*/
TA1CTL = tassel_1 + MC_1 + TACLR;

/*启用中断*/
TA1CCTL0 |= CCIE;
TA1CCR0 = One_second;

/*启用中断*/
TA1CCTL1 |= CCIE;
TA1CCR1 =(One_MS * 250);

LED1_OUTPUT ();
LED2_OUTPUT ();

FLASH_LED1 (3);

_BIS_SR (GIE+LPM3_BITS);
while (1);
} 
#pragma vector=Timer1_A1_vector
__interrupt void Timer1_A1_ISR (void){
//当 TACCR1和 TACCR2中断请求得到服务时,CCIFG 自动复位*/

switch (TA1IV){
case 0x02:// Timer1_A1 */
LED2_OUT ^= LED2_BIT;
break;*
Timer1


://* case 0x04:*/* Timer1:// break



}

//* Timer1 A0中断处理程序*/
#pragma vector=Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void){
//当 TACCRO 中断请求得到服务时,CCIFG 自动复位*/
timer_counter++;
LED1_OUT ^= LED1_BIT;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Zhuhua!

    [引用用户="Zhuhua Wua">根据我的理解、Timer1_A0、A1和 A2应该能够正常工作?  [/报价]

    这取决于运行模式。 CCR0是计时器模块的基础、用于执行多项操作。 如果您希望在特定的时间间隔内独立使用 CCR0、CCR1和 CCR2、我建议以如下方式使用连续模式:

    void main( void ){...
    
    
    
    TA1CCTL0 |= CCIE;
    TA1CCR0 = One_second;
    
    TA1CCTL1 |= CCIE;
    TA1CCR1 =(One_MS * 250);
    
    // ACLK、连续模式、清除计时器*/
    TA1CTL =(tassel_1 | MC_2 | TACLR);
    
    ...
    
    BIS_SR (GIE | LPM3_BITS);
    
    while (1);
    }
    
    #pragma vector = Timer1_A1_vector
    __interrupt void Timer1_A1_ISR (void)
    {
    //读取 TA1IV 会自动清除最高挂起中断标志*/
    switch (TA1IV)
    {
    案例0x02:/* Timer1_A1 */
    TA1CCR1 +=(One_MS * 250);//<-最好使用常数而不是 ISR 内部的乘法
    LED2_OUT ^= LED2_BIT;
    中断;
    
    案例0x04:/* Timer1_A2 */
    中断;
    
    情况0x0A:/* Timer1溢出*/
    break;
    }
    }
    
    //* Timer1 A0中断处理程序*/
    #pragma vector = Timer1_A0_vector
    __interrupt void Timer1_A0_ISR (void)
    {
    //当 TACCRO 中断请求得到服务时,CCIFG 自动复位*/
    TA1CCR0 += One_second;//添加时间
    LED1_OUT ^= LED1_BIT;
    } 

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Dennis、它工作正常。