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.

[参考译文] MSP432P401R:上升沿触发的脉冲计数

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/665342/msp432p401r-count-number-of-pulses-on-rising-edge-triggered

部件号:MSP432P401R

您好,

   我想使用MSP432计算在端口引脚(上升沿)上触发的高至低边缘上的编码器脉冲数。 我在 中断中提取变量"A"。当上升沿发生中断时,我的计数以1为增量。但我的中断在两个边缘上触发。我得到了1000脉冲,正如我预期的只有500。

程序如下所示:-


Int A = 0;

Void主(void)

WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;//停止监视程序计时器

P6->DIR &=~BIT0;//将WFP 6.0 设置为输入方向
P6->REN = BIT0;//启用上拉电阻
P6->IFG &=~ BIT0;//已清除WFP 1.4 IFG
P6->IES &=~ BIT0;//高到低
P6->IE |= BIT0;//已启用WFP 1.4 中断

//在NVIC上启用端口1中断
NVIC->ISER[1]= 1<<(PORT6_IRQn)& 31);

//在ISR出口处唤醒
SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;

for (;){}
}


//端口1中断服务例程
void PORT6_IRQHandler (void)

IF (P6IFG和BIT0)

A=A+1;
}
P6->IFG &=~BIT0;
}

请告诉我代码中的错误位置??

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否描述您尝试测量/计数的信号? 是否为激活信号并与上拉冲突?

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

    您好,
    我的问题已解决。现在我想一次触发2个端口中断,因为我的编码器有3个输出引脚A,B和Z,它们连接到端口引脚。
    我的代码如下:-
    #include "msp.h"

    #include <ti/devices/msp432p4xx/driverlib/driverlib.h>

    /*标准包括*/
    #include <stdint.h>

    #include <string.h>
    国际a,b;
    浮点数;
    浮点数2;
    内部主(无效)

    //按住看门狗
    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;

    //将WFP 1.0 配置为输出,将WFP 1.1 (开关)配置为使用上拉功能输入
    //电阻器。 其余引脚配置为输出低电平。
    //由于所有的P1引脚都在,所以请注意有意的'='分配
    //特意配置
    P6->DIR =~BIT0;
    P3->DIR =~BIIT2;
    P6->IES = BIT0;//高到低转换时中断
    P3->IES = BIIT2;//高到低转换时中断
    P6->IFG =0;//清除所有P1中断标志
    P3->IFG =0;//清除所有P1中断标志
    P6->IE = BIT0;//为WFP启用中断1.1
    P3->IE = BIT2;//为WFP启用中断1.1


    /*配置中断优先级并将优先级掩码设置为0x40 */
    MAP_Interrupt_setPriority (INT_PORT6,0x00);
    MAP_Interrupt_setPriority (INT_PORT3,0x20);

    //在NVIC上启用端口1中断
    NVIC->ISER[1]= 1<<(PORT6_IRQn)& 31);
    NVIC->ISER[2]= 1<<(PORT3_IRQn)和31);

    //终止设备上的所有其余引脚
    P2->DIR || 0xFF;P2->OUT = 0;
    P4->DIR |= 0xFF;P4->OUT = 0;
    p5->DIR |= 0xFF;p5->out = 0;
    P1->DIR |= 0xFF;P1->OUT = 0;
    P7->DIR || 0xFF;P7->OUT = 0;
    P8->DIR || 0xFF;P8->OUT = 0;
    P9->DIR || 0xFF;P9->OUT = 0;
    P10->DIR || 0xFF;P10->OUT = 0;

    //配置端口J
    PJ->DIR ||(BIT0| BIT1 | BIT2 | BIT3);
    pj->out &=~(BIT0 | BIT1 | BIT2 | BIT3);

    //启用PCM粗鲁模式,允许设备进入LPM3而无需等待外围设备
    PCM->CTL1 = PCM_CTL0_KEY_VAL | PCM_CTL1_FORT_LPM_ENTRY;

    //启用全局中断
    __enable_IRQ();

    for (;){}
    }

    /*端口1 ISR */
    void PORT6_IRQHandler (void)

    //切换LED上的输出
    IF (P6->IFG和BIT0)

    A=A+1;
    COUNT=A*(0.001);
    }
    P6->IFG &=~BIT0;
    }

    /*端口1 ISR */
    void PORT3_IRQHandler (void)

    //切换LED上的输出
    IF (P3->IFG和BIT2)

    B=b+1;
    count2=a*(0.001);
    }
    P3->IFG &=~BIT2;
    }
    值“a”是增量,但值“b”显示为0。为什么??

    请提供一次触发2个中断的示例代码以及如何设置优先级???

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    如果您有新的问题,通常最好是开始新的线程。 我看不到您提供的代码有任何问题。 中断的频率如何?您是否分配了足够的时间来处理中断并响应下一个事件?

    此致,
    Chris