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/TMS470MF03107:TMS430F249

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/868605/ccs-tms470mf03107-tms430f249

器件型号:TMS470MF03107
主题中讨论的其他器件:MSP430F249

工具/软件:Code Composer Studio

先生们:

在上面的器件型号字段中、不接受 TMS430F249???

我正在尝试将计时器 A0设置为计数器、最高480、但 CPU 永远不会进入 ISR。 它会陷阱到:

;********

;* ISR_TRAP_asm -                               *

;*                                       *

;*版权所有(c) 2003 Texas Instruments Incorporated              *

;* http://www.ti.com/                             *

;*                                       *

;* 以 源 代码和二进制形式重新分发和使用,有 无  *

;* 如果   满足以下条件  ,则允许进行修改*

;*满足 :                                  *

;*                                       *

;*  源  代码的重新分发必须 保留 上述版权  *

;*  注意,此条件列表和以下免责声明。      *

;*                                       *

;*  二进制形式的再发行 必须复制上述版权  *

;*  注意,*   中的条件列表和以下免责声明   

;*   随        *提供的文档和/或其他材料

;*  分发。                              *

;*                                       *

;*  德州 仪器公司的名称 和名称  均不是*

;*   其贡献者 可用于 认可或 推广产品  *

;*  源自  此 软件 ,未   经过特定的事先编写  *

;*  权限。                               *

;*                                       *

;* 本软件 由版权 所有者和贡献者  *提供

;* “原样” 以及任何 明示或暗示 的保证,包括 但不  包括*

;* 仅限于对  *的适销性和适用性的暗示保证

;* 不承认某一特定目的。  在任何情况下、版权  均不得*

;* 所有者或贡献者应对任何直接、间接、偶然的、  *负责

;* 特殊   、典型或后果性损害 (包括但 不  包括*

;* 仅限于采购替代货物或服务;丧失使用,  *

;* 数据或利润;或业务中断)、但会引起任何  *

;*  责任理论,无论是合同、严格 责任还是侵权  行为*

;* (包括疏忽或其他原因)以任何方式因使用  而产生*

;* 本软件,即使被告知可能会发生此类损坏。    *

;*                                       *

;********

;------------------------------------------------------------------

;--如果用户不提供,则缺省 ISR 处理程序

;--只需将设备放入 lpm0

;------------------------------------------------------------------

  .sect ".text:_ISR:_TI_ISR_TRAP_"

.align 2.

.global __TI_ISR_TRAP

_TI_ISR_TRAP:

    BIS.W  #(0x0010)、SR

    JMP _TI_ISR_TRAP

    NOP           ;CPU40兼容性 NOP

我的设置:

 //计时器 A0初始化。

 TACTL = MC_0;     //关闭计时器 A0。

 TACTL = tassel_1;  //选择 ACLK 作为时钟源并除以1。

 TACCR0 = 480;      //将比较寄存器设置为~ 30 μ s。

 TACTL |= TAIE;     // Timer A 中断使能。

 TACTL |= MC_1;      //将计时器 A 设置为递增计数模式。

我的 ISR:

/

* 名称:evTMR_A0_ISR

*

* 说明:计时器 A0中断处理器。

*  从 C3_PM 读取下一个字节。

*  SMBus_Buffer -来自 C3的每个字节在此存储器位置逐位编译。

*  计时器 A0中断标志也会在退出之前清除。

*

(小部分 /

#pragma vector = TIMERA0_vector

_interrupt void evTMR_A0_ISR (void)

 //示波器触发器

 P1OUT &=~M_LED4; //打开 M_LED4。

 if (C3_byte_read =(C3_byte_read & SMBus_Flags))){

  PORT_F5_Snapshot = P5IN; //使用 C3_PM 卡的 SMBus 通信端口快照。

  开关(C3_Byte_RD_State)//*****  C3字节读取状态机的开始 *****

  {

  案例 C3_Byte_Init:

   if (nm_SCL &~Port_5_Snapshot) { //如果时钟线变低,那么...

    bit_Position = 8; //初始化位计数器。

    C3_Byte_RD_State = C3_Byte_Wait1;

   }

   中断;

  案例 C3_Byte_Wait1:

   if (nm_SCL & Port_5_Snapshot) { //如果已发送有效数据位...

    if (nm_SDA & Port_5_Snapshot) {SMBus_Buffer |= 0x01;}//如果 SMBdata 是1,或1,则写入数据字节 LSB……

    其他               { SMBus_Buffer &= 0xFE;}//否则清除 LSB。

    bit_position--;//减少位计数。

    C3_Byte_RD_State = C3_Byte_Wait2;

   }

   中断;

  案例 C3_Byte_Wait2: //在这里等待时钟线变为低电平。

   if (nm_SCL &~Port_5_Snapshot) {  

    if (bit_Position >0){ //如果字节中有更多位要收集,则...

     SMBus_Buffer <= 1; //将刚接收到的位移向 MSbit。

     C3_Byte_RD_State = C3_Byte_Wait1; //开始读取下一个位。

    }

    //确认接收到最后一个数据位。 将数据线拉低。

    否则{

   SMBdata_Clr_C3;

   C3_Byte_RD_State = C3_Byte_ACK1;}

   }

   中断;

  案例 C3_Byte_ACK1://等待 SMBus 时钟变为高电平。

   if (nm_SCL 和 Port_5_Snapshot) {

    C3_Byte_RD_State = C3_Byte_Ack2;

   }

   中断;

  案例 C3_Byte_Ack2://等待 SMBus 时钟变为低电平以完成确认。

   if (nm_SCL &~Port_5_Snapshot) {//如果时钟已变为低电平,则终止确认。

    SMBDATA_SET_C3;           //释放 SMBus 数据线以被拉高。

    SMBus_Flags   &=~C3_BYTE_READ; //关闭 C3卡字节读取状态机。

    C3_Byte_RD_State = C3_Byte_Init; //重新 ARM 状态机。

   }

   中断;

  }//读取 Endcase C3卡字节。

 }// endif C3_byte_read

//?????  TAIFG &=~BIT0;   //清除中断标志。

 TA0R = 0;      //重新启动计数器。

 //示波器触发器

 P1OUT |= M_LED4; //关闭 M_LED4。

请提供建议。

此致、Harvey Novak

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

     定时器 A0初始化设置定时器 A 中断使能位 TAIE:

    TACTL |= TAIE; // Timer A 中断使能。 

    从  MSP430x2xx 系列用户指南中的 TACTL、Timer_A 控制寄存器的说明中可以  启用 TAIFG 中断请求:

     MSP430F23x、MSP430F24x (1)、MSP430F2410混合信号微控制器数据表 显示 TAIFG 生成 0xFFF0的中断矢量地址:

    ISR 处理程序被放置在 TIMERA0_VECTOR 上、从 msp430f249.h 头文件中该 TIMERA0_VECTOR 的地址 为0xFFF2:

    #define TIMERA0_VECTOR (25 * 1U) /* 0xFFF2 Timer A cC0 */ 

    由于代码没有地址0xFFF2的中断矢量、这说明了为什么要进入 ISR 陷阱。

    建议更改代码以将 ISR 处理程序作为 TIMERA1_VECTOR 放置、该矢量来自 msp430f249.h、地址 为0xFFF0:

    #define TIMERA1_Vector (24 * 1U) /* 0xFFF0 Timer A CC1-2、TA */ 

    I.E.建议 将您的代码更改为:

    #pragma vector = TIMERA1_Vector
    
    __interrupt void evTMR_A0_ISR (void) 

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

    谢谢切斯特!

    但是、CPU 现在会在下面列出的例程中进行陷阱处理。

    我要做的就是每30微秒生成一个中断、该中断执行上一次提交中列出的几行代码。  

    我是否需要将中断例程中的计数器归零?

    我是否需要复位中断标志?

    我的初始化是否完成且正确?

    使用 Timer B 是否更好?

    谢谢、Harvey

    /********* /

    /* copy_zero_init.c                              *

    /*                                      *

    //版权所有(c) 2006 Texas Instruments Incorporated             *

    /* http://www.ti.com/                              *

    /*                                      *

    /* 以 源 代码和二进制形式重新分发和使用,带 或不带  */

    /* 如果   符合以下条件  ,则允许进行修改*/

    /* 满足:                                 *

    /*                                      *

    /*  重新分发 源 代码必须 保留 上述版权  */

    /*  注意、此条件列表和以下免责声明。     *

    /*                                      *

    /*  二进制形式的再发行 必须复制上述版权  */

    /*  注意、*     /中的条件列表和以下免责声明

    /*   随        */提供的文档和/或其他材料

    /*  分布。                             *

    /*                                      *

    /*  德州 仪器公司的名称 和名称  均不是*/

    /*   其贡献者可 用于 认可或 推广产品  */

    /*  源自  此 软件 而未   事先编写的特定  内容*/

    /*  权限。                              *

    /*                                      *

    /* 本软件 由版权 所有者和贡献者提供  */

    /* "按原样" 及任何 明示或暗示 的保证、包括 但不  包括*/

    /* 仅限于  对*/的适销性和适用性的暗示保证

    /* 不承认某一特定目的。  在任何情况下、版权  均不得*/

    /* 所有者或贡献者应对任何直接、间接、偶然的、  */负责

    /* 特殊   、惩戒性或后果性损害 (包括但 不包括  */

    /* 仅限于采购替代货物或服务;丧失使用,  */

    /* 数据或利润;或业务中断)   

    /*  责任理论,无论是合同、严格 责任还是侵权行为  */

    /* (包括疏忽或其他原因)以任何方式因使用  而产生*/

    /* ,即使被告知可能会发生此类损坏。   *

    /*                                      *

    /*                                      *

    /*例程以用零初始化输出缓冲器。 输入缓冲器具有*/

    /*初始化到零的字节数。                  *

    /*                                      *

    /*注:                                   *

    /* 1. 此例程可用于复制未初始化或已初始化的全局*

    /*  程序的数据空间。 因此、此例程无法定义任何全局 */

    /*  变量。                                *

    /* 2. 此例程永远不会用于初始化堆栈空间、因此  会导致*/

    /*  所有变量都分配给栈。                *

    /* 3. 调用应用程序应确保输出缓冲器较大     *

    /*  足以保存未压缩的数据。                  *

    /*                                      *

    /********* /

    #include

    #include

    /********* /

    /*                                      *

    /*__TI_zero_init()-零初始化输出缓冲区。 字节数*/

    /*           输入缓冲器中给出了初始化的函数。       *

    /*                                      *

    /********* /

    /********* /

    /*即使在小型数据模型中,MSP 复制表也可以处理移动函数+*/   

    /*大型代码模型,其中数据指针不够大,无法表示  */

    /*函数指针。  这需要 EABI 解压缩函数     *

    /*(shared/copy_*.c)被更改为接受“far”指针。  针对此   */

    /*内存模型组合,解压缩函数更改为使用 */

    /*"unsigned long"表示函数指针、因此是函数指针   */

    /*我们通过这些函数调用的函数也需要有一个原型   */

    /*接受"无符号长整型"而不是指针类型。  所有其他存储器  */

    /*模型组合使用的原型与所有其他目标使用的原型相同:*/

    /*两个数据指针参数。  最终、我们使用 MSP peek/poke 内在函数 */

    /*读取/写入"far"存储器。                      *

    /********* /

    #if defined (__MSP430__)&& defined (__large_code_model__)&&!defined (__large_data_model__)

    typedef unsigned long recordsize_t;

    typedef unsigned long pointer_t;

    typedef unsigned long pointer_to _const_t;

    #define READSZ (x)__data20_read_long (x)

    #define WRITE8_ADV (x、c)_data20_write_char (x++、c)

    其他

    #if defined (__MSP430__)&& defined (__large_code_model__)

    typedef   unsigned long recordsize_t;

    其他

    typedef        size_t recordsize_t;

    #endif

    typedef   unsigned char * pointer_t;

    typedef const unsigned char * pointer_to_const_t;

    #define READSZ (x)(*(recordsize_t *) x)

    #define WRITE8_ADV (x、c)(* x++=(c))

    #endif

    static __inline __attribute__( always_inline)

    void __TI_zero_init_template (pointer_TO_const_t inbuf、pointer_t outbuf、

                   INT USE_MEMHET)

      /*------------------ *

      /* inbuf 将始终指向压缩数据中的一个字节( */

      /*自动初始化读取第一个字节以确定哪个解压缩   */

      /*要使用的例程)。  将 inbuf 与 size_t 边界对齐并读取数字*/

      //字节数设置为零。                       *

      /*------------------ *

      pointer_t count_p =(pointer_t) inbuf +(_alignof _(recordsize_t)- 1);

      recordsize_t count = READSZ (count_p);

      /*------------------ *

      /*零初始化输出缓冲器。                   *

      /*------------------ *

      #if __MSP430__

       while (count--)WRITE8_ADV (outbuf、0);

      其他

       IF (USE_MEMHET)

         memset(((void*)outbuf, 0, count);

       其他

         while (count--)WRITE8_ADV (outbuf、0);

      #endif

    /********* /

    //启用虚拟编码时,我们不能包括专业化认证。     *

    /*所有段的例程编码存储在单个.encode 段中*/

    /*、它可能引用.text 段。 这意味着、如果是一个.text   */

    文件中的/*段被引用、*  /中将包含所有.text 段

    /*链接。 这打破了需要全部资源的专业化模式      *

    /*特殊功能处于其各自的子段中,可由   */移除

    /*链接器。                                   *

    /********* /

    #if !defined (__virtual_encoding__)

    __attribute__((section(".text:decompress:Zi:__TI_zero_init_nomemset"),已使用))

    void __TI_zero_init_nomemset (POINTER_TO_CONST_t inbuf、POINTER_t outbuf)

      _TI_zero_init_template (inbuf、outbuf、0);

    #endif

    __attribute__((section(".text:decompress:Zi"))

    void __TI_zero_init (POINTER_TO_CONST_t inbuf、POINTER_t outbuf)

      _TI_zero_init_template (inbuf、outbuf、1);

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

    [引用 user="Harvey Novaka)]但是,CPU 现在会在下面列出的例程中进行陷阱处理。

    我要做的就是每30微秒生成一个中断、该中断执行上一次提交中列出的几行代码。 [/报价] http://dev.ti.com/tirex/explore/node?node=APbNbwzUDwYij82MW9a0-g__IOGqZri__LATEST 下提供了一些计时器示例

    [引用 user="Harvey Novaka]]如果初始代码启用了 TAIE 、我是否需要重置中断标志?我的初始建议是更改为使用 TIMERA1_Vector。 当使用 TIMERA1_VECTOR 时、 在 中断处理程序中读取 TAIV 中断向量发生器来获取中断源、然后自动复位中断源。

    而是为 CCR0中断启用 CCIE,然后在 TIMERA0_VECTOR 中启用 CCIE;因为 当 TACCR0中断请求被服务时 TACCR0 CCIFG 标志会自动复位。   有关示例、请参阅 dev.ti.com/.../node