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.

[参考译文] MSP-EXP432P401R:端口2上未检测到中断

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/866155/msp-exp432p401r-interrupts-not-detected-on-port-2

器件型号:MSP-EXP432P401R

我正在努力使中断在 MSP-EXP432P401R 开发板的端口2上工作。  我已断开连接到 LED 的跳线并连接到外部开关。 我可以看到、当使用具有内部上拉电阻的外部开关时、线路被拉至低电平。  

我在端口1、3或5上没有中断问题(在类似的难题中、我看到端口4上的中断)。  我已经将代码定义为在引脚1.1、引脚2.0和引脚2.2上设置中断。 在调试中、我始终可以看到引脚1.1中断、但两个端口2引脚都没有。  我是否在某个位置缺少寄存器?

这是使用 MSP432 DriverLib - v3_10_00_09的代码。

#include "driverlib.h" /*包括 MSPWare 驱动程序库。 *

/********* /*
定义、枚举和类型定义 */
********* /*

以下常量指定外部高频 //
//*振荡器的时钟频率。 */
#define HFXTCLK_FREQUENCY 48000000

/*以下常量指定了有关 MCLK 的信息。 */
#define MCLK_SOURCE CS_HFXTCLK_SELECT
#define MCLK_DEVIDER 1
#define MCLK_FREQUENCY (HFXTCLK_FREQUENCY / MCLK_divider)

/*以下常量指定有关 HSMCLK 的信息。 */
#define HSMCLK_SOURCE CS_HFXTCLK_SELECT
#define HSMCLK_DEVIDER 2
#define HSMCLK_FREQUENCY (HFXTCLK_FREQUENCY / HSMCLK_divider)

/*以下常量指定有关 SMCLK 的信息。 注释 1
) SMCLK 只能由 HSMCLK 供源、2) MSPWare API */
//*要求您在配置 SMCLK 时指定 HSMCLK 的时钟源、*/
/*和3)分频器与 HSMCLK 的源相关。 另请注意、为了
支持2Mbps UART 波特率、*//* SMCLK 必须以24*/
/* MHz 或更快的频率运行。 */
#define SMCLK_SOURCE HSMCLK_SOURCE
#define SMCLK_DEVIDER 2
#define SMCLK_FREQUENCY (((HSMCLK_FREQUENCY * HSMCLK_divider)/SMCLK_divider)

/*以下宏用于连接宏值。 */
#define CONCAT_(A、B) A##B
#define CONCAT (A、B) CONCAT_(A、B)

/*以下常量定义了这个*/
/*模块使用的中断优先级。 请注意
、有8位用于设置优先级*//*级别、但 MSP432当前仅使用高3位 /*/* MCU
的更多
信息、请参阅《MSP432技术参考手册》和《*/* MSP432驱动程序库用户指南》。 */
#define priority_high (0)
#define Priority_normal (1 << 5)

/*以下函数配置系统时钟。 */
static void ConfigureClocks(void)
{/*
配置 HFXT 外部振荡器引脚。 //
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);

//设置 LFXTCLK 和 HFXTCLK 的外部时钟源频率。*//
////注意,我们尚未配置 LFXTCLK,因此我们在此将其设置为 FX0。 //
CS_setExternalClockSourceFrequency (0、48000000);

//在非旁路模式下启动 HFXT 而不超时。 在开始之前、我们
必须将 VCORE 更改为1以支持48MHz */
/*频率。 //
PCM_setCoreVoltageLevel (PCM_VCORE1);
FlashCtl_setWaitState (FLASH_BANK0、2);
FlashCtl_setWaitState (FLASH_BANK1、2);
CS_startHFXT (false);

/*初始化时钟源。 CS_initClockSignal
(CS_MCLK、MCLK_SOURCE、CONCAT (CS_Clock_divider、MCLK_divider);
CS_initClockSignal (CS_HSMCLK、HSMCLK_SOURCE、 CONCAT (CS_CLOCK 分频器_、HSMCLK_DEVIDER);
CS_initClockSignal (CS_SMCLK、SMCLK_SOURCE、CONCAT (CS_CLOCK 分频器_、SMCLK_DEVIDER));
}
void Port_Handler_Test_ISR (void)
{
UINT_fast16_t 中断;

中断= GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
IF (中断和 GPIO_PIN1)
{
GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
}

中断= GPIO_getEnabledInterruptStatus (GPIO_PORT_P2);
IF (中断和 GPIO_PIN2)
{
GPIO_clearInterruptFlag (GPIO_PORT_P2、GPIO_PIN2);
}
IF (中断和 GPIO_PIN0)
{
GPIO_clearInterruptFlag (GPIO_PORT_P2、GPIO_PIN0);
}

}

int main (void)
{
/*保持看门狗计时器。 *
WDT_A_HOLDTimer();

/*禁用中断。 *
interrupt_disableMaster();

/*配置时钟。 *
ConfigureClocks();

GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);
GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P2、GPIO_PIN2);
GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P2、GPIO_PIN0);

GPIO_interruptEdgeSelect (GPIO_PORT_P1、 GPIO_PIN1、 GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_interruptEdgeSelect (GPIO_PORT_P2、 GPIO_PIN2、 GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_interruptEdgeSelect (GPIO_PORT_P2、 GPIO_PIN0、 GPIO_HIGH_TO_LOW_TRANSITION);

Interrupt_setPriority (INT_Port1、0xC0);
INTERRUPT_setPriority (INT_PORT2、0xC0);

GPIO_registerInterrupt (GPIO_PORT_P1、Port_Handler_Test_ISR);
GPIO_registerInterrupt (GPIO_PORT_P2、Port_Handler_Test_ISR);

GPIO_enableInterrupt (GPIO_PORT_P1、 GPIO_PIN1);
GPIO_enableInterrupt (GPIO_PORT_P2、 GPIO_PIN2);
GPIO_enableInterrupt (GPIO_PORT_P2、 GPIO_PIN0);

GPIO_clearInterruptFlag (GPIO_PORT_P1、 GPIO_PIN1);
GPIO_clearInterruptFlag (GPIO_PORT_P2、 GPIO_PIN2);
GPIO_clearInterruptFlag (GPIO_PORT_P2、 GPIO_PIN0);

interrupt_enableMaster();

while (1);
} 

我的 STARTUP_MSP432P4.s 文件指向 Port1和端口2 ISR 矢量的 Port_Handler_Test_ISR (尽管由于 GPIO_registerInterrupt 调用、我认为这不是必需的。 我觉得我必须缺少一些明显的东西。  

提前感谢您的帮助

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

    下面是"您的计算机是否已插入?" 建议类型:您将交换机连接到 JP9/JP11的哪一侧? 我很确定它应该是离 MCU 最近的一侧、但这是一个快速测试、只需尝试这两者即可。

    [编辑:我终于找到了我的 Launchpad。 您希望侧面更靠近 MCU。 当我执行该操作时、您的程序会按预期中断。]

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

    感谢您的思考。  我在两方面都没有运气。  在 MCU 最近的一侧、我可以示波并看到线路空闲高电平、然后通过按下按钮进行下拉。

    考虑到您能够使用上述代码获得预期结果、似乎怀疑硬件存在问题、但我也可以在2个自定义硬件副本上重复此问题。  是否有编译选项或我缺少的内容?  

    感谢你的帮助

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

    我在"项目设置"中没有做任何特殊的事情。 我的测试用例是跳线和 ISR 中的断点。 我的 driverlib 来源是"未知来源"、但可能不足2年。

    如果您可以在引脚上看到转换、我将跟踪链。 暂停调试器:

    1) P2->IN 和 P2->IFG:端口是否看到它?

    2) ISER[1].4和 ISPR[1].4应被置位(port2_IRQn=36=(32+4)):NVIC 是否看到它?

    3) 3) PRIMASK=0:CPU 是否看到它?

    当您暂停时、请记下暂停的位置。 我们预计它会在 while (1)时丢失、但可能会在某个地方丢失。

    [编辑:UM、大约2.5年(MSPWare_3_30_01_00)? 我刚刚使用了 SDK 3_20_00_06中的 driverlib_empty_project_with_source、得到了相同的结果。]

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

    这是一个老司机!

    我使用原始设置执行了您建议的测试、所有寄存器看起来都是适当设置的、除非我永远看不到中断标志被设置。   

    我一直在使用 CC256x MSP432 Bluetopia SDK 修改示例项目、而该示例项目实际上是使用旧的驱动程序。  我更新到了最新的 v3_21_00_05、现在一切正常!  

    感谢所有的帮助!