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:在 timerB 中断后无法访问 MSP-EXP430FR2355 LaunchPad 主循环

Guru**** 2553450 points
Other Parts Discussed in Thread: MSP-EXP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/772049/ccs-msp430fr2355-msp-exp430fr2355-launchpad-main-loop-unreachable-after-timerb-interrupt

器件型号:MSP430FR2355
主题中讨论的其他器件:MSP-EXP430FR2355

工具/软件:Code Composer Studio

大家好、

我将 MSP-EXP430FR2355 LaunchPadTm开发套件与 Code Composer Studio 版本:8.2.0.00007搭配使用。

我正在尝试将"Timer B0 Interrput "实现为一个高优先级代码执行循环、在 main.c 的正文中有一个低优先级循环 中断的代码示例取自 slac740b 代码集合中的"msp430fr235x_tb0_01.c"。

中断按预期工作、但由于未知原因、从未达到主(低电平)循环。 我尝试在该环路中设置一个断点、以获得任何成功、或者只在相应的输出引脚上放置一个示波器、以查看电平变化、但不会发生任何变化、

提前感谢您的任何帮助。

我的代码:

#include
#include


#define MCLK_FREQ_MHz 8                    // MCLK = 8MHz
#define true   1.
#define false  0


void Software_Trim (void);                           //软件调整可获得最佳 DCOFTRIM 值
void Init_GPIO (void);


//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 Init_GPIO (空)

   P1DIR = 0xFF;
   P2DIR = 0xFF;
   P1REN = 0xFF;
   P2REN = 0xFF;
   P1OUT = 0x00;
   P2OUT = 0x00;


   P6DIR = 0xFF;

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void Software_Trim (void)

   unsigned int oldDcotTap = 0xFFFF;
   unsigned int newDcoTap = 0xFFFF;
   unsigned int newDcoDelta = 0xFFFF;
   unsigned int bestDcoDelta = 0xFFFF;
   unsigned int csCtl0Copy = 0;
   unsigned int csCtl1Copy = 0;
   无符号 int csCtl0Read = 0;
   无符号 int csCtl1Read = 0;
   unsigned int dcoFreqTrim = 3;
   unsigned char endLoop = 0;

   执行{
       CSCTL0 = 0x100;                                                                                                   // DCO 抽头= 256
       执行{
           CSCTL7 &=~DCOFFG;                                                                                    //清除 DCO 故障标志
       } while (CSCTL7 & DCOFFG);                                               //测试 DCO 故障标志

       __DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);                           //等待 FLL 锁定状态(FLLUNLOCK)保持稳定
                                                                                                                                            //建议等待24个经过分频的 FLL 参考时钟周期
       while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));

       CSCCtl0Read = CSCTL0;                                                                                        //读取 CSCTL0
       CSCCtl1Read = CSCTL1;                                                                                        //读取 CSCTL1

       oldDcoTap = newDcoTap;                                                                                   //记录上次的 DCOTAP 值
       newDcoTap = csCtl0Read & 0x01ff;                                                                  //这次获得 DCOTAP 值
       dcoFreqTrim =(csCtl1Read & 0x0070)>>4;                                                    //获取 DCOFTRIM 值

       if (newDcoTap < 256){                                                                                          // DCOTAP < 256
           newDcoDelta = 256 - newDcoTap;                                                                // DCPTAP 和256之间的增量值
           if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)//                                          DCOTAP 交叉256
               endLoop = 1;                                                                        //停止 while 循环
           否则{
               dcoFreqTrim --;
               CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim <4);
           }
       }
       否则{                                                                                                                      // DCOTAP >= 256
           newDcoDelta = newDcoTap - 256;                                                              // DCPTAP 和256之间的增量值
           if (oldDcoTap < 256)                                                                                        // DCOTAP 交叉256
               endLoop = 1;                                                                                                //停止 while 循环
           否则{
               dcoFreqTrim++;
               CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim <4);
           }
       }

       if (newDcoDelta < bestDcoDelta){                                                                   //记录最接近256的 DCOTAP
           csCtl0Copy = csCtl0Read;
           csCtl1Copy = csCtl1Read;
           bestDcoDelta = newDcoDelta;
       }

   } while (endLoop =0);                                                                                         //轮询直至 endLoop =1

   CSCTL0 = csCtl0Copy;                                                                                       //重新加载锁定的 DCOTAP
   CSCTL1 = csCtl1Copy;                                                                                       //重新加载锁定的 DCOFTRIM
   while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));                                     //轮询直到 FLL 被锁定

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================



/
 * main.c
 (小部分 /
int main (空)

   无符号静态字符切换;
   无符号长整型 I = 0;

   WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器


   /*********
    *初始化 DU 时钟 à 8MHZ
    ( /
   _bis_SR_register (SCG0);                                                                                          //禁用 FLL
   CSCTL3 |= SELREF_REFOCLK;                                                                              //将 REFO 设置为 FLL 基准源
   CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;         // DCOFTRIM = 3、DCO 范围= 8MHz
   CSCTL2 = FLLD_0 + 243;                                                                                              // DCODIV = 8MHz
   _DELAY_CYCLES (3);
   _BIC_SR_register (SCG0);                                                                                           //启用 FLL
   Software_Trim ();                                                                                                              //软件调整可获得最佳 DCOFTRIM 值

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

   init_gpio();                                                                                                                       //初始化 LES 端口

   P1SEL1 |= BIT1;                                                                                                              //将 ACLK 引脚设置为第二功能

   PMM_unlockLPM5 ();

   TB0CCTL0 |= CCIE;                                                                                                       //启用 TBCCR0中断
   TB0CCR0 = 50000;
   TB0CTL |= TBSSEL_SMCLK | MC__Continous;                                            // SMCLK,连续模式

   _bis_SR_register (LPM0_bits | GIE);                                                                        //输入 LPM3、带中断
   __no_operation();                                                                                                           //进行调试


   //主不可达循环???
   while (-1){
      i++;
      如果(切换){
          切换= false;
          P6OUT |= BIT6;
      }
      否则{
          P6OUT &=~BIT6;
          切换= true;
      }
   }

============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================



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

   P1OUT ^= BIT0;
   TB0CCR0 += 50000;                            //将偏移添加到 TBCCR0
   TB0CTL &= 0xFFE;


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通常会发生这种情况、因为您已将中断设置为在 MCU 返回后将其置于睡眠状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您需要在 ISR 中添加代码以使 CPU 脱离 LPM0。  

    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);// CPU 在 ti 上处于活动状态 

    2.为什么在 while ()中输入-1?

    3.您可以以这为例:e2e.ti.com/.../msp430fr235x_5F00_tb0_5F00_22.c

    伊斯天

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2)因为这是全位1、或实际上是真的。 ^μ A)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    此问题是否得到解决? 如果是、请单击 此已解决我的问题按钮

    伊斯天