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/MSP430G2553:MSP430 CCS #pragma中断方法

Guru**** 2394095 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/581029/ccs-msp430g2553-msp430-ccs-pragma-method-of-interrupts

部件号:MSP430G2553

工具/软件:Code Composer Studio

我正在使用具有CCS的MSP430G2553启动板。 我在端口1引脚3上使用S2导致MCU中断。

我将代码写在下面。  

#include "msp430g2231.h"//包含寄存器和内置函数
的所有定义int main(void)//主程序
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器

P1DIR |= BIT0;//将WFP 1.0 设置为输出,并将WFP 1.3 设置为输入方向
P1OUT =~BIT0;//将LED设置为OFF
P1IE |= BIT3;//启用WFP 1.3 中断
P1IES = BIT3;//中断由高到低
P1IFG &=~BIT3;//已清除WFP 1.3 中断标志
__bis_sr_register(GIE);//启用所有中断(清除SR中的GIE)

而(1)//永久循环,我们将在中断例程中完成我们的工作...
{}


#pragma vector=Port1_vector
__interrupt void Port_1 (void){

P1OUT ^= BIT0;//切换WFP 1.0
P1IFG &=~BIT3;//已清除WFP 1.3 中断标志
} 		

此问题的目的是正确理解 #pragma vector=Port1_vector 线

我现在从下面的数据表中粘贴一段摘录,

因此,必须具有ISR地址的位置应为0FFE4H。 但我不会在CCS环境中找到执行此操作的位置。

但是,我注意到,如果我只写2而不是 Port1_vector,我的代码就会正常工作。  下面是Msp430g2553标题的摘录,我在其中查看Port1_vector的内容。 我觉得它的定义有点奇怪,在这个意义上,很难理解。 如果能够更详细地解释以下#defines的用法,我将不胜感激。

 我的程序在我只使用#define Port1_vector 2时就能工作。

首先 ,我想知道为什么#define Port1_vector 2 没有写在这里。 我可以观察到".int02"。 可能是整数2? 如果是这样,为什么头文件会以这种方式专门提到#define而不简单地说 #define Port1_vector 2? 我想知道这个原因。   非常感谢您在那里的善意解释。

其次, 与 所有中断源相关的矢量编号列表在哪里? 在这种情况下,端口1的中断值为2,但在该代码的某个位置,必须将ISR的实际内存地址写入内存位置0FFE4H。 否则,当触发中断时,MCU将不会知道将其定向到ISR。 我想在这里看到此代码。 我在头文件中找不到此实现。  

衷心感谢您的所有回答和时间。  

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

    当编译器看到“#‍pragma vector = x”时,它会创建指向以下函数的指针,并将该指针置于名为“.intxx”的部分中。 (您可以在头文件中看到这些节名称,当您从汇编程序文件中包含这些节名称时,将使用它们。)

    当应用程序链接时, 链接器命令文件 (名为MSP430‍g2553.cmd,您应在计算机上的某个位置找到该文件)将指定必须将".int02"部分放在地址0xFFE4。

    数据表列出了32种可能的中断向量。 但前16个文件未使用,因此头文件仅使用数字0到15。 (只要头文件和链接程序命令文件同意哪个编号到达哪个地址,实际使用的编号就不重要。)

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

    您好,Harry:

    您可以在lnk_msp430g2553.cmd文件中找到答案。

    /******************************************************************************** //*
    指定系统内存映射 *
    ///................ /
    
    内存
    {
    SFR :原点= 0x0000,长度= 0x0010
    外围设备_8位 :原点= 0x0010,长度= 0x00F0
    外围设备_16BIT :原点= 0x0100,长度= 0x0100
    RAM :原点= 0x0200,长度= 0x0200
    信息A. :原点= 0x10C0,长度= 0x0040
    信息 :原点= 0x1080,长度= 0x0040
    信息 :原点= 0x1040,长度= 0x0040
    信息 :原点= 0x1000,长度= 0x0040
    闪存 :原点= 0xC000,长度= 0x3FDE
    BSLSIGNATURE :原点= 0xFFDE,长度= 0x0002,填充= 0xFFFF
    INT00 :原点= 0xFFE0,长度= 0x0002
    INT01 :原点= 0xFFE2,长度= 0x0002
    INT02 :原点= 0xFFE4,长度= 0x0002
    INT03 :原点= 0xFFE6,长度= 0x0002
    INT04 :原点= 0xFFE8,长度= 0x0002
    INT05 :原点= 0xFFEA,长度= 0x0002
    INT06 :原点= 0xFFEC,长度= 0x0002
    INT07 :原点= 0xFFEE,长度= 0x0002
    INT08 :Origin = 0xFFF0,length = 0x0002
    INT09 :原点= 0xFFF2,长度= 0x0002
    INT10 :原点= 0xFFF4,长度= 0x0002
    INT11 :原点= 0xFFF6,长度= 0x0002
    INT12. :原点= 0xFFF8,长度= 0x0002
    INT13 :原点= 0xFFFA,长度= 0x0002
    INT14 :原点= 0xFFFC,长度= 0x0002
    重置 :原点= 0xFFFE,长度= 0x0002
    }/**********************************************************************************************
    
    //*
    指定分配到内存的部分 *
    ///................ /
    
    部分
    {
    BSS :{}>内存 /*全局和静态虚拟 */
    数据 :{}>内存 /*全局和静态虚拟 */
    .TI.noinit :{}> RAM /*用于#pragma noinit */
    sysmem :{}>内存 /*动态内存分配区域*/
    堆栈 :{}> RAM (高) /*软件系统堆栈 */
    
    文本 :{}>闪烁 /*代码 */
    cinit :{}>闪烁 /*初始化表 */
    。const :{}>闪烁 /*常量数据 */
    .bslsignature :{}> BSLSIGNATURE.(.bslsignature :{}> BSLSIGNATURE. /* BSL签名 */
    首席信息官 :{}>内存 /* C I/O缓冲器 */
    
    。销钉 :{}>闪烁 /* C++构造函数表 */
    二进制 :{}>闪烁 /*启动时初始化表*/
    init_array :{}> flash /* C++构造函数表 */
    .mspabi.exidx :{}> flash /* C++构造函数表 */
    .mspabi.extab :{}> flash /* C++构造函数表 */
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 1500.9万
    #ifndef __larate_data_model__
    .TI.ramfunc :{} load=flash, run=ram, table(BINIT)
    #否则
    .TI.ramfunc:{} load=flash | FLASH2,run=RAM,table (BINIT)
    #endif
    #endif
    #endif
    
    信息A :{}> INFOA. /* MSP430信息闪存段*/
    信息B :{}> INFOB.
    信息温度 :{}> INFOC.
    信息 :{}> INFOD.
    
    /* MSP430中断矢量 */
    交易 :{*(.int00)}> INT00类型= VECT_INIT
    int01 :{} > INT01
    端口1 :{*(.int02)}> INT02类型= VECT_INIT
    端口2 :{*(.int03)}> INT03类型= VECT_INIT
    int04 :{} > INT04
    ADC10. :{*(.int05)}> INT05类型= VECT_INIT
    USCIAB0TX:{*(.int06)}> INT06类型= VECT_INIT
    USCIAB0RX :{*(.int07)}> INT07类型= VECT_INIT
    TIMER0_A1:{*(.int08)}> INT08类型= VECT_INIT
    TIMER0_A0:{*(.int09)}> INT09类型= VECT_INIT
    WDT :{*(.INT10)}> INT10类型= VECT_INIT
    COMPARATORA :{*(.INT11)}> INT11 TYPE = VECT_INIT
    Timer1_A1 :{*(.INT12)}> INT12类型= VECT_INIT
    Timer1_A0 :{*(.INT13)}> INT13类型= VECT_INIT
    NMI :{*(.INT14)}> INT14类型= VECT_INIT
    重置 :{} >重置/* MSP430重置矢量 */}/********************************************************************************
    
    
    //*
    包括外设内存映射 *
    ///................ /
    
    -l msp430g2553.cmd