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/TM4C123GE6PM:如果其他饱和操作未按预期进行、则可能是由于"Now"变量的值。

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/762811/ccs-tm4c123ge6pm-if-else-satement-is-not-behaving-as-expected-might-be-due-to-the-value-for-the-now-varaiable

器件型号:TM4C123GE6PM
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

您好!  

我正在尝试使用 Tiva C 来检测来自输入信号的上升沿、我正在尝试使用循环来实现这一点。  

我遇到了循环变量问题、我尝试 通过用二进制值将输入引脚固定在循环的读取状态、但是、我不确定我是否正确执行了该操作。  

以下是我正在使用的变量:

#define Pind 0x00000010
#define SIGANLIN_PIN GPIO_PIN_4 

这里是我用来检测上升沿和下降沿的环路:

如果(pulsevalue!= 0)
{
UARTprintf ("检测到的脉冲数"\n);
//这将使脉冲能够被读取
SafteyCountdown ();//将使 LED 闪烁,以显示程序将开始运行
while (1){
最后= 0;
现在= Pind &(1< 0){
BPM ++;//上升沿,执行某项操作
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3 | GPIO_PIN_0、GPIO_PIN_3);//需要输出到高电平引脚
}
其他
{
//需要输出到低电平引脚
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_3、GPIO_PIN_0);
}


Last = Now;//下次通过时记住状态
} //End of Now != Last
} // while 结束
UARTprintf ("中断传导\n");
// InterruptEnable();
}
其他
{
//如果不存在脉冲,这将允许程序以相同的方式运行
UARTprintf ("未检测到脉冲\n");
SafteyCountdown ();//将使 LED 闪烁,以显示程序将开始运行
// InterruptEnable();
while (1){
现在= Pind &(1< 0){
BPM ++;//上升沿,执行某项操作
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3 | GPIO_PIN_0、GPIO_PIN_3);//需要输出到高电平引脚
}
其他
{
//需要输出到低电平引脚
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_3、GPIO_PIN_0);
}

}
Last = Now;//下次通过时记住状态
} //End of Now != Last
} // while 结束
UARTprintf ("中断传导\n"); 

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

    不确定您的问题到底是什么、因为我不清楚您所面临的问题是什么、什么不起作用。

    您是否尝试同时设置 PA3和 PA0或仅设置 PA3? 当您写入 GPIOPinWrite (GPIO_PORta_base、GPIO_PIN_3 | GPIO_PIN_0、GPIO_PIN_3)时、您仅设置 PA3、而不设置 PA3和 PA0。 这是我的第一个评论。 如果要同时设置 PA3和 PA0、则需要写入 GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3 | GPIO_PIN_0、GPIO_PIN_3 | GPIO_PIN_0)。

    BTW、您可以将引脚配置为在检测到指定的边沿时生成中断。 这一切都由硬件完成。 在中断 ISR 中、您可以执行其他操作、即设置或清除其他引脚。 您是否不会为您的项目考虑这种方法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我已经考虑过中断并使用它们编写了代码、但我在编码方面没有非常强的背景、因此我对中断的理解不是很好、因此我无法使原始代码正常工作。

    因此、为了能够理解我的代码、我使用了循环。 我尝试单独写入 PA3和 PA0。 当检测到上升沿时、我尝试写入 PA3;当没有上升沿时、我尝试写入 PA0 (从技术上讲、是下降沿)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     处理中断并不困难。 您正在创建一个超级循环结构、当您需要在项目中添加新功能时、该结构将不会有所帮助。 下面是一个示例代码、演示了当按下引脚(连接到 TM4C129 Launchpad 上 SW1的 TM4C129器件中的 PJ0)时产生中断的情况。 一旦进入 SW1Hnadler 中断 ISR、它只需重新加载计时器即可切换另一个引脚。 请注意、这是 TM4C129器件的示例代码。 如果要使用中断模式、则需要端口到 TM4C123器件。

    #include 
    #include 
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/timer.timer.idio"
    
    #define 32_uel_uidu_u_uidio.h
    
    
    
    
    *#define #define "_dio/u.idio.idio./u.idio.u_u.u.u.idio
    
    
    
    //
    //计数器来计算已调用的中断数。
    ////
    *****************
    静态易失性 uint32_t g_ui32Counter = 0;
    
    
    //*********
    //
    // Timer0中断的中断处理程序。
    ////
    *****************
    void
    Timer0IntHandler (void)
    {
    //
    //清除计时器中断标志。
    //
    TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    
    
    如果((g_ui32Counter % 2)= 0){
    GPIOPinWrite (GPIO_PORTN_BASE、(USER_LED1|USER_LED2)、USER_LED1);
    
    } 否则{
    GPIOPinWrite (GPIO_PORTN_BASE、(USER_LED1|USER_LED2)、USER_LED2);
    
    }
    
    //
    //更新周期性中断计数器。
    //
    G_ui32Counter++;
    
    
    }
    
    void SW1Handler (void)
    {
    GPIOIntClear (GPIO_PORTJ_BASE、GPIO_PIN_0);
    ui32SysClock *= 1.2;
    TimerLoadSet (TIMER0_BASE、TIMER_A、ui32SysClock / 2);
    
    }
    
    
    
    //*********
    //
    ////将 Timer0B 配置为16位周期计数器,带有中断
    //每1ms 一次。
    ////
    *****************
    int
    main (void)
    {
    
    
    
    //
    //将时钟设置为直接从外部晶振/振荡器运行。
    // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
    板上的//晶体。
    //
    
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)、25000000);
    
    //
    //必须启用 Timer0外设才能使用。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    
    //
    //启用并等待端口准备好访问
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION))
    {
    }
    
    //
    //为 LED 操作配置 GPIO 端口。
    //
    GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、(USER_LED1|USER_LED2));
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_GPIOJ)));
    GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0);
    // HWREG (GPIO_PORTJ_BASE + GPIO_PUR)= GPIO_PIN_0;
    GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE);
    GPIOIntRegister (GPIO_PORTJ_BASE、SW1处理程序);
    GPIOIntEnable (GPIO_PORTJ_BASE、GPIO_INT_PIN_0);
    IntEnable (INT_GPIOJ);
    //
    //将 Timer0B 配置为16位周期定时器。
    //
    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
    
    
    //
    //将 Timer0B 加载值设置为1ms。
    //
    TimerLoadSet (TIMER0_BASE、TIMER_A、ui32SysClock / 2);
    
    //
    //启用处理器中断。
    //
    IntMasterEnable();
    
    //
    //将 Timer0B 中断配置为计时器超时。
    //
    TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    
    //
    //在处理器(NVIC)上启用 Timer0B 中断。
    //
    IntEnable (INT_TIMER0A);
    
    //
    //初始化中断计数器。
    //
    G_ui32Counter = 0;
    
    //
    //启用 Timer0B。
    //
    TimerEnable (TIMER0_BASE、TIMER_A);
    
    //
    //在 Timer0B 运行时永久循环。
    //
    while (1)
    {
    
    }
    }
    

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

    这是一个很好的人,谢谢。
    但是、我相信我没有时间在当前项目中实施它。
    希望我能够最终回来。
    谢谢你