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/MSP430FR6989:如何使 MSP430从1个引脚获取输出作为另一个引脚的输入、以触发中断服务例程?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/948756/ccs-msp430fr6989-how-do-i-get-the-msp430-to-take-the-ouput-from-1-pin-as-input-to-another-pin-to-trigger-an-interrupt-service-routine

器件型号:MSP430FR6989

工具/软件:Code Composer Studio

我正在尝试让 MSP430使用1引脚的输出作为另一引脚的输入。 但是、我似乎无法使代码正常工作。 我的程序非常简单、如下所示。 未显示的是用于去抖的简单延迟环路和外部电路、后者只是一个将 P8.4连接到 P2.1的按钮。 当我按下它时、由于8.4为高电平、2.1变为高电平。 然后、我有一个 ISR、当2.1变为高电平(或者、严格地说、由于我选择了下降沿中断、从高电平变为低电平)时、该 ISR 应该触发。 此 ISR 应切换板载 LED。 但是、LED 不会亮起。 我不确定是对引脚正确使用输入功能、还是在其他地方出错。

void main (void)

WDTCTL = WDTPW | withold;

P1DIR |= BIT0;

P1OUT = 0x00;//调用前不输出

   P2DIR  |= BIT6 | BIT7;     // P2.6和 P2.7设置为输出
   P2OUT = 0x00;//在需要之前确保它们没有输出。
   P3OUT = 0x00;
   P8OUT = 0x00;

   P8DIR |= BIT4 | BIT5 | BIT6 | BIT4;
   P8REN |= BIT4 | BIT5 | BIT6 | BIT7;
   P8OUT |= BIT4 | BIT4 | BIT6 | BIT4;

   P2DIR &=~(BIT1 | BIT2 | BIT3 | BIT4);
   P2REN |= BIT1 | BIT2 | BIT3 | BIT4;
   P2IN &=~(BIT1 | BIT2 | BIT3 | BIT4);//
   P2IE |= BIT1 | BIT2 | BIT3 | BIT4;//中断开启1-4
   P2IES |= BIT1 | BIT2 | BIT3 | BIT4;//下降沿
   P2IFG &= 0x00f;//清除中断标志

PM5CTL0 &=~LOCKLPM5;

while (1){//go forever

#pragma vector = port2_vector     //关联函数。 具有中断矢量
_interrupt void Port_2 (void)     // ISR 的名称

   开关(__evo_in_range (P2IV、P2IV_P2IFG7))
   {
   //我使用 P2.1-2.4作为输入。
   案例 P2IV_NONE:  break;  //向量 0:无中断
   案例 P2IV_P2IFG0:中断;  //向量 2:P2.0

   案例 P2IV_P2IFG1:
       P1OUT ^= BIT0;//切换 LED
       P2IFG &=~BIT1;//CLEAR 标志
       P2IE &=~(BIT1 | BIT2 | BIT3 | BIT4);//禁用中断
       delay();
       P2IE |= BIT1 | BIT2 | BIT3 | BIT4;//启用中断
       中断;

   案例 P2IV_P2IFG2:
       中断;

   案例 P2IV_P2IFG3:
       中断;

   案例 P2IV_P2IFG4:
       中断;

   案例 P2IV_P2IFG5:中断;  //矢量12:P2.5
   案例 P2IV_P2IFG6:中断;  //向量14:P2.6
   案例 P2IV_P2IFG7:中断;  //向量16:P2.7
   默认值:break;
   }

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

    由于 P2IN 是只读的、因此尝试将值写入 P2IN 是一个杯子的游戏。

    用 P2IFG 对0x0F 进行与操作、会将高4位清零。 您可能是指~0x0F。

    在清零 LOCKLPM5后、应与端口中断设置保持空闲、IES 应在 IE 前被置位。 (请参阅用户指南。)

    我看不到你在哪里设置 GIE 来启用全局中断。

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

    0x0F 是将代码复制到站点时的一个拼写错误。 我还在 main 中的 while 循环前面使用了__enable_interrupt (),但未能复制它。 就我所能说的而言、其余的代码就是我最初编写的代码。

    由于 P2IN 是只读的、我如何使用输入引脚来触发中断? 我想我可能会误解引脚和寄存器在这种情况下的工作方式、到目前为止、系列用户指南尚未提供任何清除当前情况的内容。 让我解释一下、也许您可以为我设置正确的位置:

    输入模式用于获取输入。 输入来自引脚外部的位置。 例如、我可以使用3.3V 外部电源并将其打开/关闭、以便为输入引脚(配置为输入的引脚)创建输入信号。

    中断检测上升/下降沿。

    因此、如果我将逻辑"1"上的电压源连接到输入引脚、并且输入引脚之前处于逻辑"0"上、其中包含上升沿、应可检测到。

    4、您说 P2输入寄存器是只读的、这意味着它们无法检测作为输入连接的引脚上的电压变化? 我对您的解释是否正确?

    下面是我的问题:如何使用输入引脚来触发中断? 该系列用户指南强烈建议、任何处于输入或输出模式的 IO 引脚都应该能够触发中断。 因此、我不明白当输入引脚上的输入发生变化时、我需要做什么来触发中断。

    例如、如果我将输出切换为 P2、将输入切换为 P8、那么是否会翻转开关以连接 P2和 P8、从而能够触发中断? (是的、我将翻转我的代码并尝试执行此操作、但我认为无论如何都值得询问)。

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

    隐藏代码位没有帮助。

    4) 4) P2IN 为只读、因此写入不执行任何操作。 您在这里看到的内容始终反映引脚的状态。 将某个东西连接到它、Twidleit 和 P2IN 将发生变化。

    并非所有端口都支持中断、我在链接器脚本中只看到端口1-4的矢量。

    您没有对我关于 LOCKLPM5和端口初始化时序的评论说任何话。 用户指南指出、在 LOCKLMP5被置位时、PxIFG 寄存器不能被更改、但是不要做出与 PxIE 相关的类似声明。 但是、使用 PxIE 启用端口中断是建议流程中的最后一步、所以这不会让我感到意外。 编辑初始化代码、使其与建议的序列相匹配。

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

    谢谢、我没有对 LOCKLPM5说任何话、因为这一点很好、我对此没有任何疑问。 我将会接受你所说的话、并对这些内容进行摆弄。 感谢你的帮助。