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/MSP430FR5987:msp430fr5987

Guru**** 657930 points
Other Parts Discussed in Thread: MSP430FR5987, MSP430FR5889
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/702262/ccs-msp430fr5987-msp430fr5987

器件型号:MSP430FR5987
主题中讨论的其他器件: MSP430FR5889

工具/软件:Code Composer Studio

我有一个为 msp430fr5889编写的工作设计、我要将其移植到 msp430fr5987、以努力为我们的所有项目实现一个 MSP430的标准化。 我对5987上的代码有问题。

我创建了自己的标志、以避开原始作者的一些复杂问题。

我已关闭优化、并且我的新标志设置为易失性。

我在计时器 A0 ISR 中设置一个标志(定时器_FLAG)。 我的代码的主循环会看到标志集一次、但再也不会看到?


extern int timer_flag;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//主循环使用定期计时器根据串行数据更新系统
//
//      调用主应用程序函数
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main (空)

unsigned int test;

init_System_bsp();                                              //初始化系统和控制器

 while (1)                                                      //连续循环
 {
    COMM_PROCESS_Msg (comm_buff0、sys_data);                    //检查任何消息

    TEST = SYS_TIMER[32];

//    if (System_Timer_Check_Flag (TMR_0、SYS_TIMER))            //检查系统定时器0
    if (timer_flag)
    {
        Timer_flag = 0;
      Update_Sys_State_Machine (adc_rslt、comm_buff0、sys_data); //更新状态机
     }                                                         //结束检查系统定期计时器
 }                                                             //结束主 while (1)循环
}                                                               //结束主函数

TimerA0 ISR 设置标志(timer_flag)。 我有一个关于这一点的断点、可以看到它可以正常工作。

原始设计人员有一个用于保存计时器信息(sys_timer[])的数组、因此他可以通过一个 ISR 有效地控制16个计时器。

代码仅在其数组中设置一个条目、索引0并且工作正常。

我已经绕过它并设置我的全局 timer_flag。 一个断点确认该标志被重复设置为1。

看起来、MAN 例程没有看到 ISR 所做的任何更改?? 不是第一个????

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// System_Timer_Lib.c
//
// 创建日期:2016年4月13日
//     作者:jpogge
//
//系统计时器使用4到16个计时器的全局整数数组
//通过 System_Timers_Lib.h 中的#define TMR_NUM_TMRS 设置最后一个索引
//用作位标志
//
//索引0是计时器计数器0
//索引1是计时器计数器1
//索引2是计时器计数器2
//索引3是计时器计数器3

//|TMR_CNT_0|TMR_CNT_1||TMR_CNT_2|TMR_CNT_3|TMR_CNT_4|TMR_FGS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include
#include "System_Timer_Lib.h"
#include "Stream_Utility_Lib.h"
#include "bit_Lib.h"
#include "Timer_Lib.h"

volatile int timer_flag =0;

unsigned int sys_timers[TMR_REG_Sze];  //计时器数据 xxxx

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//系统定时器节拍中断
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma vector = TIMER0_A0_vector
中断空 System_Tick_IRQ (空)

      //此处调用计时器循环

    _disable_interrupt ();                                    //禁用中断
      System_Timer_Update (sys_timers);
    __ENABLE_INTERRUPT ();                                    //重新启用中断



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Timer_Update   使用 uint 16定时器结构
//
// 以节拍率递增、达到触发计数时确定的周期
//在寄存器1 TMR_FLAGS 0 - 15中设置相应的位
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
空 System_Timer_Update (unsigned int * sys_tmrs)

   unsigned int i;

   for (i = 0;i < TMR_NUM_TMRS;+i)                          //循环遍历每个激活的计时器
      {
       if (sys_tmrs[i]> 0x0000)                              //如果计时器大于零
         {
            --sys_tmrs[i];                                  //如果大于零则递减
         }
       if (sys_tmrs[i]= 0x0000)                            //如果零、则更新计时器过期或未使用
         {
           if (sys_tmrs[i + TMR_RST_IDX])                    //如果有复位值计时器处于活动状态
             {
             System_Timer_Reset (i、sys_tmrs);              //如果计数器达到零则重新加载 REST 值
//               sys_tmrs[32]=1;           //设置标志
//               sys_timers[32]=1;
             Timer_flag=1;
//               System_Timer_Set_Flag (i、sys_tmrs);           //设置标志
             }
         }

      }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有两个建议、尽管它们有点弱:
    ----
    > extern int timer_flag;
    在此处也声明此"易失性"。 编译器不知道您在另一个模块中执行了此操作。 函数调用(COMM_Process_Msg ())应该已经避免了这种情况,但我建议您无论如何尝试一下(症状确实听起来像是一个“易失性”的东西)。
    ----
    > _disable_interrupt (); //禁用中断
    > System_Timer_Update (sys_timers);
    > _enable_interrupt (); //重新启用中断
    在 ISR 中启用中断很危险。 我建议您去掉第一条(不需要)和第三条(危险)线路。 如果这修复了问题、您可能还应该检查 TA0CCR0中的值、因为它可能太小。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是、在主例程中设置 timer_flag 易失性并不能解决问题。

    extern volatile int timer_flag;

    代码看到它设置一次、然后再也不会这样了????

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

    e2e.ti.com/.../SCA_5F00_DSPLY25Jun2018.zipI已包含压缩的项目。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到 timer_flag 被多次设置、但只检查一次、因为在检测到第一个之后 Display_Boot_MSG 永远不会完成。

    我怀疑它与设置 timer_flag 后移除 System_Timer_Timer_Set_Flag 调用有关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从编译器标志中删除-code_model=large 和-near_data=none 可修复此问题。 由于我找不到 MSP430编译器手册、我无法阅读有关这些标志的信息。 唯一的知识来自我的最后一位使用 IAR 的客户。