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/MSP430FR2311:是否可以在3.5 中使用GPIO中断?

Guru**** 2589300 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/635091/ccs-msp430fr2311-is-it-possible-to-use-gpio-interrupts-in-lpm3-5

部件号:MSP430FR2311

工具/软件:Code Composer Studio

我知道GPIO中断在LPM3中工作,并且已经对其进行了测试。 但是,有没有办法使用3.5 中的GPIO中断?

#include <MSP430-h>
#include <stdio.h>
#include
<stdint.h>

#include "./inc/rtc.h"
#include "../inc/clock.h"

void initGpio();

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

// setup_vloclk();//将VLO设置为主时钟
setup_xt1clk();//将XT1设置为主时钟

initGpio();

//首先确定是从LPMx.5还是定期重置。
	如果(SYSRSTIV == SYSRSTIV_LPM5WU) //当从3.5 唤醒时,重新连接
	{//
		如果3.5 从3.5 唤醒,重新初始化,然后再次返回L。

		//从备份RAM内存中恢复P1OUT值,在LPMx.5后保持P1OUT重置
		P1OUT =*(unsigned int *) BKMEM_BASE;//如果未完成此步骤,LED将始终处于打开状态

		__enable_interrupt (); // RTC中断应立即触发...
	}
	否则
	{
		//配置备份内存
		*(unsigned int *) BKMEM_BASE = 0;

		//设备从冷启动启动启动。
		//它配置设备并将设备放入4.5 L和平

		1DIR &=~BIT4; //将WFP 1.4 配置为输入方向引脚
		P1OUT |= BIT4; //将WFP 1.4 配置为P1REN
		|= BIT4; // WFP 1.4 上拉寄存器启用
		P1IES |= BIT4; // WFP 1.4 Hi-/ Low edge
		P1IFG = 0; //清除所有P1中断标志
		P1IE |= BIT4; //已启用WFP 1.4 中断

		//配置所需的GPIO
		P1OUT &=~BIT1; //清除WFP 1.1 输出锁存
		器P1DIR || BIT1; //对于LED


		// rtcinit (RTC_VLO,10,RTC_1000);//将VLO设置为时钟源,10设置为初始值,1000设置为预校准
		器rtcinit(RTC_XT1,32*20,RTC_1024); //将XT1设置为时钟源,640 (20秒)设置为初始值,1024设置为预校准

		器//在输入3.5
		*(unsigned int *) BKEM_BASE = P1OUT;
	}//

	在3.5 启用中断的情况下进入L1MOUT模式之前,将P1OUT值存储在备份内存寄存器中。 请注意,此操作不
	返回//。 3.5 会通过重置事件退出,从而
	导致//重新启动代码。

	PMMCTL0_H = PMMPW_H; //用于写入
	PMMCTL0_L的开放式PMM寄存器|| PMMREGOFF; //并设置PMMREGOFF

	__bis_sr_register(LPM3_bits | GIE);
	//__no_operation();

	//return 0;

}


void initGpio()
{
P1DIR = 0xFF;P2DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;

//配置所需的GPIO
	P1OUT &=~BIT0; //清除WFP 1.0 输出锁存
	器P1DIR || BIT0; //表示LED

//禁用GPIO开机默认高阻抗模式
//以激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}//

端口1中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=Port1_vector
__interrupt Portvoid Port_1(void)
#Elif defined(_________)__NUC_attribute_1)



#endif
{
P1IFG &=~BIT4; //清除WFP 1.4 IFG
	P1OUT ^= BIT1;//切换
//__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);//退出LPM3
} 

在上述代码中,如果我注释第61行和第62行(LMP3),GPIO中断工作正常。 如果取消注释这些线路(LPIO),3.5 中断将不起作用。  

同时,我在做这个实验的时候测量电流。 在3.5 中,当我按住中断开关(上面代码中为WFP 1.4)时,电流消耗会达到900uA,但中断不起作用。 为什么会发生这种情况?  

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

    请阅读家庭用户指南的1.4 Tm3和7.3 Tm3部分。  您可以使用中断,但P1OUT必须保存在备份内存中,以便可以在GPIO唤醒事件引起的BOR上存储。  您还需要在常规复位语句之外进行P1IE初始化。  请参阅以下示例:

    //************************************************************************************************
    // MSP430FR231x演示- 3.5 ,设备进入3.5 中等待端口
    // 在WFP 1.1 上中断
    ////
    说明:下载并运行程序。 程序自动进入
    // 3.5。 使用LaunchPad上的按钮S1 (或WFP 1.1)唤醒
    // 设备从3.5 中启动,并闪烁LED1 (WFP 1.0)
    //
    // aclk = REFO = 32kHz,MCLK = SMCLK =默认DCODIV =~1MHz。
    ////
    MSP430FR2311
    // --------
    // /|\\| |//
    || |//
    || |//
    --|RST |//
    | |//
    | WFP 1.0 |-->LED
    // | |//
    | ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* 1.1 7.2
    
    
    
    
    
    
    #include <MSP4S.h>
    
    void initGpio(void);
    
    int main(void){
    
    WDTCTL = WDTPW | WDTHOLD; //停止WDT
    
    //配置GPIO
    initGpio();
    
    P1IE |= BIT1; //已启用WFP 1.1 中断
    
    //确定我们是从LPMx.5还是定期重置。
    IF (SYSRSTIV == SYSRSTIV_LPM5WU) // MSP430刚刚从LPMx.5唤醒
    {
    
    //从备份RAM内存中恢复P1OUT值,在LPMx.5重置后保留P1OUT
    P1OUT =*(unsigned int *) BKMEM_BASE;
    
    __enable_interrupit(); // GPIO中断应立即触发...
    }
    否则
    {
    //设备从冷启动启动启动。
    //它配置设备并将设备放入3.5
    
    //配置备份内存
    *(unsigned int *) BKMEM_BASE = 0;
    
    //启用RTC以强制执行3.5
    RTCMOD = 32-1;
    RTCCTL = RTCSS__VLOCLK | RTCSR |RTCPS__1024;
    
    P1IFG = 0; //清除所有P1中断标志
    
    }
    
    P1DIR &=~(BIT1); //将WFP 1.1 配置为输入方向针脚
    P1OUT || BIT1; //将WFP 1.1 配置为上一个
    P1REN |= BIT1; // WFP 1.1 上拉寄存器启用
    P1IES |= BIT1; // WFP 1.1 高/低边缘
    
    PMMCTL0_H = PMMPW_H; //打开用于写入的PMM寄存器
    PMMCTL0_L |= PMMREGOFF; //并设置PMMREGOFF
    
    //输入LPM3注意,此操作不会返回。 3.5
    //将通过重置事件退出,从而导致重新启动
    代码的//。
    __bis_sr_register (LPM3_bits | GIE);
    while (1);
    }
    
    void initGpio()
    {
    P1DIR = 0xFF;P2DIR = 0xFF;
    P1REN = 0xFF;P2REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;
    
    //禁用GPIO开机默认高阻抗模式
    //以激活先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    }//
    
    端口1中断服务例程
    #pragma vector=Port1_vector
    __interrupt void Port_1(void)
    {
    P1IFG &=~BIT1; //清除WFP 1.1 IFG
    P1OUT ^= BIT0; // WFP 1.0 =切换
    *(unsigned int *) BKMEM_BASE = P1OUT;
    } 

    此致,Ryan

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