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.

[参考译文] CCS/MSP430FR2355:LED 闪烁代码、带计时器中断

Guru**** 2399305 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/946733/ccs-msp430fr2355-led-blinking-code-with-timer-interruppt

器件型号:MSP430FR2355

工具/软件:Code Composer Studio

我发现 LED 闪烁代码在计时器间隔内进行 LED 切换时遇到困难。  

请告诉我问题和所需的更改


//头文件//
#include "msp430fr2355.h"
#include "stdint.h"

#define CALTDH0CTL1_256 *((unsigned int *) 0x1A36)

void Init_clocks (void);
void init_io (void);
void init_wdt (void);
void init_TimerB (void);

void main (void)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
_delay_cycles (1000000);
init_clocks ();//初始化25MHz 的时钟


init_TimerB ();

init_wdt ();
init_io ();

PM5CTL0 &=~LOCKLPM5;//启用 GPIO
_ENABLE_INTERRUPT ();//设置 GIE


_delay_cycles (1000000);

while (1)

;//


//结束 main

//WDT 以重新启动 ADC
void init_WDT (void)

WDTCTL = WDT_MDLY_32;//从1MHz 到 SMCLK 的 WDT 32ms 间隔定时器
SFRIE1 |= WDTIE;//启用 WDT 中断


空 init_TimerB (空)

TB3CTL = TBSSEL_SMCLK | MC_3 | TBCLR;// SMCLK、UP_DOWN 模式、清除 TBR
TB3CCR0 = 3276;
TB3CCR1 = 1676;
TB3CCTL0 |= CCIE;

_bis_SR_register (GIE);//启用中断
__no_operation();//用于调试器

_EINT();//启用中断


//时钟和 Vcore
void Init_clocks (void)

FRCTL0 = FRCTLPW | NWAITS_2;

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 |= DCORSEL_7;//设置 DCO = 24MHz
CSCTL2 = FLLD_0 + 731;// DCOCLKDIV = 24MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

//IO 初始化//
void init_io (void)

//指示
P2SEL0 &=~(BIT6);/GPIO-LED3
P2DIR |=(BIT6);//输出 LED3

_bis_SR_register (GIE);

/******** TIMERD0.1中断************* /

//计时器 B1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER3_B0_vector
_interrupt void Timer3_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER3_B0_vector)) Timer3_B0_ISR (void)
其他
错误编译器不受支持!
#endif

P2OUT |=~(BIT6);
TB3CCTL1 &=~CCIFG;

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

    您好、Jeet、

    请启用 Timer B 中断使能位来触发中断:

    TB3CTL = TBSSEL_SMCLK | MC_3 | TBCLR | TBIE;// SMCLK、UP_DOWN 模式、清除 TBR

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

    >SFRIE1 |= WDTIE;//启用 WDT 中断

    我看不到该中断(WDT_Vector)的 ISR。 您的程序在关闭时将冻结。

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

    我按照建议添加了更改、但我的代码仍然进入计时器中断一次、然后在那里停止、但不会出现。

    查看代码。


    //头文件//
    #include "msp430fr2355.h"
    #include "stdint.h"

    #define CALTDH0CTL1_256 *((unsigned int *) 0x1A36)

    void Init_clocks (void);
    void init_io (void);
    void init_wdt (void);
    void init_TimerB (void);

    unsigned int i = 0;
    unsigned int j = 0;

    void main (void)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    _delay_cycles (1000000);
    init_clocks ();//初始化25MHz 的时钟


    // init_TimerB ();

    // init_wdt ();
    init_io ();

    PM5CTL0 &=~LOCKLPM5;//启用 GPIO
    //_enable_interrupt ();//设置 GIE


    _delay_cycles (1000000);

    while (1)

    J++;
    如果(j > 10000)

    J = 0;



    //结束 main

    //WDT 以重新启动 ADC
    void init_WDT (void)

    WDTCTL = WDT_MDLY_32;//从1MHz 到 SMCLK 的 WDT 32ms 间隔定时器
    //SFRIE1 |= WDTIE;//启用 WDT 中断


    空 init_TimerB (空)

    TB3CTL = TBSSEL_ACLK | MC_3 | TBCLR | TBIE;// SMCLK、UP_DOWN 模式、清除 TBR
    TB3CCR0 = 3276;
    TB3CCR1 = 1676;
    TB3CCTL0 |= CCIE;

    _bis_SR_register (GIE);//启用中断
    __no_operation();//用于调试器

    _EINT();//启用中断


    //时钟和 Vcore
    void Init_clocks (void)

    FRCTL0 = FRCTLPW | NWAITS_2;

    _bis_SR_register (SCG0);//禁用 FLL
    CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
    CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
    CSCTL1 |= DCORSEL_7;//设置 DCO = 24MHz
    CSCTL2 = FLLD_0 + 731;// DCOCLKDIV = 24MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0);//启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
    //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

    //IO 初始化//
    void init_io (void)

    //指示
    P2SEL0 &=~(BIT6);/GPIO-LED3
    P2DIR |=(BIT6);//输出 LED3

    _bis_SR_register (GIE);

    /******** TIMERD0.1中断************* /

    //计时器 B1中断服务例程
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = TIMER3_B0_vector
    _interrupt void Timer3_B0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(TIMER3_B0_vector)) Timer3_B0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    如果(I > 100)

    I = 0;
    P2OUT |=(BIT6);

    其他

    i++;

    TB3CCTL1 &=~CCIFG;
    TB3CTL &=~TBIFG;

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

    我按照建议添加了更改、但我的代码仍然进入计时器中断一次、然后在那里停止、但不会出现。

    查看代码。


    //头文件//
    #include "msp430fr2355.h"
    #include "stdint.h"

    #define CALTDH0CTL1_256 *((unsigned int *) 0x1A36)

    void Init_clocks (void);
    void init_io (void);
    void init_wdt (void);
    void init_TimerB (void);

    unsigned int i = 0;
    unsigned int j = 0;

    void main (void)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    _delay_cycles (1000000);
    init_clocks ();//初始化25MHz 的时钟


    // init_TimerB ();

    // init_wdt ();
    init_io ();

    PM5CTL0 &=~LOCKLPM5;//启用 GPIO
    //_enable_interrupt ();//设置 GIE


    _delay_cycles (1000000);

    while (1)

    J++;
    如果(j > 10000)

    J = 0;



    //结束 main

    //WDT 以重新启动 ADC
    void init_WDT (void)

    WDTCTL = WDT_MDLY_32;//从1MHz 到 SMCLK 的 WDT 32ms 间隔定时器
    //SFRIE1 |= WDTIE;//启用 WDT 中断


    空 init_TimerB (空)

    TB3CTL = TBSSEL_ACLK | MC_3 | TBCLR | TBIE;// SMCLK、UP_DOWN 模式、清除 TBR
    TB3CCR0 = 3276;
    TB3CCR1 = 1676;
    TB3CCTL0 |= CCIE;

    _bis_SR_register (GIE);//启用中断
    __no_operation();//用于调试器

    _EINT();//启用中断


    //时钟和 Vcore
    void Init_clocks (void)

    FRCTL0 = FRCTLPW | NWAITS_2;

    _bis_SR_register (SCG0);//禁用 FLL
    CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
    CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
    CSCTL1 |= DCORSEL_7;//设置 DCO = 24MHz
    CSCTL2 = FLLD_0 + 731;// DCOCLKDIV = 24MHz
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0);//启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
    //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

    //IO 初始化//
    void init_io (void)

    //指示
    P2SEL0 &=~(BIT6);/GPIO-LED3
    P2DIR |=(BIT6);//输出 LED3

    _bis_SR_register (GIE);

    /******** TIMERD0.1中断************* /

    //计时器 B1中断服务例程
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = TIMER3_B0_vector
    _interrupt void Timer3_B0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(TIMER3_B0_vector)) Timer3_B0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    如果(I > 100)

    I = 0;
    P2OUT |=(BIT6);

    其他

    i++;

    TB3CCTL1 &=~CCIFG;
    TB3CTL &=~TBIFG;

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

    > TB3CTL = TBSSEL_ACLK | MC_3 | TBCLR | TBIE;// SMCLK、UP_DOWN 模式、清除 TBR

    从此行中删除 TBIE、因为您没有 TIMER3_B1_VECTOR (我怀疑您不需要 TBIER3_B1_VECTOR)。