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/MSP430FR5994:板载按钮(开关)中断

Guru**** 2604785 points
Other Parts Discussed in Thread: MSP-EXP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/652417/ccs-msp430fr5994-interrupt-for-on-board-buttons-switches

器件型号:MSP430FR5994
主题中讨论的其他器件:MSP-EXP430FR5994

工具/软件:Code Composer Studio

我正在尝试为 MSP-EXP430FR5994开发套件上的两个开关(S1和 S2、或 P5.6和 P5.5)使用中断。  一旦中断被启用、即使两个开关都没有被按下、ISR 也会启动。  中断标志的值在中断被启用前为零(没有中断被置位)、但是在 I RESET 标志5和6前、ISR 内的值为255 (所有中断被置位)(然后标志为159、即位5和6被关闭)。  按下开关后、似乎什么也不会发生。  

为什么一旦启用中断、中断标志就等于255?  我假设这就是立即激活 ISR 而无需等待按下开关的原因。

我想解决方案比较微不足道、但我被骗了。  请提供任何帮助。

#include 
include "driverlib.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"

int main (void)
{

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

//配置 LED 和开关

P1DIR |= BIT0; //将 P1.0设置为输出
P1DIR |= BIT1; //将 P1.1设置为输出
P1OUT &=~BIT0; //将 P1.0设置为关(红色 LED)
P1OUT &=~BIT1; //将 P1.1设置为关(绿色 LED)

P5IE |= BIT5; // P5.5中断使能(S2)
P5IE |= BIT6; // P5.6中断被启用(S1)
P5IFG &=~BIT4; // P5.5中断标志被清除(S2)
P5IFG &=~BIT6; // P5.6中断标志被清除(S1)

_bis_SR_register (GIE);//启用所有中断

//禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置

PM5CTL0 &=~LOCKLPM5;

while (1){;}
#pragma

vector=PORT5_vector
__interrupt void Port_5 (void)
{ 

//目前只需切换每个 LED,最终更具体地选择开关。 P1OUT ^= BIT0; //切换 P1.0 P1OUT ^= BIT1; //切换 P1.1 P5IFG &=~BIT4; // P5.5中断标志被清除 P5IFG &=~BIT6; // P5.6中断标志被清除 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SLAU367O 秒 12.3.1建议使用不同的初始化顺序:
    > 1. 初始化端口:PxDIR、PxREN、PxOUT 和 PxIES
    > 2. 清零 LOCKLPM5
    > 3. 如果不从 LPMx.5中唤醒:清除所有 PxIFG 以避免错误的端口中断
    > 4. 在 PxIE 中启用端口中断
    只有在那时(大概)您才应该设置 GIE。
    --------
    在 Launchpad 原理图(SLAU678A 图26ff)中、我看不到按钮的任何外部上拉电阻。 我建议使用 P5OUT/P5REN 设置内部上拉电阻。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bruce。  它现在可以工作了。  我认为您提到的一些设置已经是默认设置、因此我最初跳过了这些设置(并且它们未包含在我在各种网站上找到的示例代码中)。 SLAU367O 中的顺序与我在包含示例代码的网站上看到的顺序不同。  我的更新代码如下所示。  我认为我可能需要对开关进行去抖、因为有时 LED 会闪烁、然后又熄灭(或熄灭、然后再重新亮起)、而此时 LED 应仅根据其初始状态熄灭或亮起。

    我必须做的一件事是、最初将端口5 (不只是引脚5和6)的所有中断标志设置为零、因为如果不是、即使不按下其中一个开关、ISR 也会由端口5上的另一个引脚触发。  这是通过将端口5中断标志打印为 ISR 的第一步并看到除5和6之外的几个位被置位来验证的。

    /*
    根据按下的板载按钮(开关)切换红色或绿色 LED。
    MSP430FR5994的 P1.0/P1.1 (红色/绿色)上具有 LED、引脚 P5.6/P5.5 (S1/S2)上具有开关。
    */
    
    #include 
    include "driverlib.h"
    #include "gpio.h"
    #include "stdio.h"
    #include "string.h"
    
    
    int main (void)
    {
    
    WDT_A_HOLD (WDT_A_base); //停止看门狗计时器
    
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); //设置红色 LED 输出
    GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0); //红色 LED 熄灭
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN1); //设置绿色 LED 输出
    GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN1); //绿色 LED 熄灭
    
    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P5、GPIO_PIN6); // S1 P5.6:PxDIR、PxOUT 和 PxREN 寄存器
    GPIO_selectInterruptEdge (GPIO_PORT_P5、GPIO_PIN6、GPIO_HIGH_TO_LOW_TRANSITION); // S1 P5.6:PxIES 寄存器
    
    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P5、GPIO_PIN5); // S2 P5.5:PxDIR、PxOUT 和 PxREN 寄存器
    GPIO_selectInterruptEdge (GPIO_PORT_P5、GPIO_PIN5、GPIO_HIGH_TO_LOW_TRANSITION); // S2 P5.5:PxIES 寄存器
    
    //禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置
    
    PMM_unlockLPM5 ();
    
    //将所有 P5IFG 设置为零
    
    P5IFG = 0x00;
    
    GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN6); // S1 P5.6:PxIE 寄存器
    GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN5); // S2 P5.5:PxIE 寄存器
    
    _bis_SR_register (GIE);//启用所有中断
    
    while (1){;}
    #pragma
    
    vector=PORT5_vector
    __interrupt void Port_5 (void)
    {
    
    开关(P5IFG)
    {
    案例0b01000000:// S1 P5.6 = 64:切换红色 LED
    {
    P1OUT ^= BIT0; //切换 P1.0
    P5IFG &=~BIT6; // P5.6清除中断标志
    }
    中断;
    案例0b00100000:// S2 P5.5 = 32:切换绿色 LED
    {
    P1OUT ^= BIT1; //切换 P1.1
    P5IFG &=~BIT4; // P5.5清除中断标志
    }
    中断;
    默认值://不应在此处!
    {
    printf ("在此处输入错误消息。 \n");
    }
    中断;
    }
    
    }