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.

[参考译文] TM4C123GH6PM:每当它捕获 GPIO PB6上的上升(或下降)边沿时、如何配置定时器以运行 ISR?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/573845/tm4c123gh6pm-how-can-i-configure-the-timer-to-run-an-isr-whenever-it-captures-a-rising-or-falling-edge-on-gpio-pb6

器件型号:TM4C123GH6PM

我对 Tiva 很陌生、而且微处理器一般而言、因此很抱歉、我的问题似乎很基本。 我已经阅读了相关的技术讲座材料并看到了一些示例代码、但我仍然不理解我的代码不起作用的原因。 我将向 GPIO 引脚 B6馈送 PWM 信号。 我尝试在捕获模式下配置两个计时器、Timer0A 应在上升沿触发 ISR、TIMER0B 应在下降沿触发 ISR。 我已按照在研讨会中的说明更改了相应的启动文件、并且能够使研讨会示例正常工作、但是我似乎无法让计时器在捕获模式下工作。 当我进行调试时、我可以看到 GPIO PB6寄存器中的数据发生了变化、但从未调用过 ISR。 这是我的代码。

#include 
#include 
#include 
#include 
#include 
include "driverlib/pin_map.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/mdio.h"


#include "driverlib/mdriver.h"#include "driverlib#driver.h"#include "driverlib#driverlib.driver.h"#include "driverlib#driverlib#driver.h"#driverlib#driverlib#include "driver.h/driverlib#include "driverlib#driver.h"#include "driverlib#driverlib#driverlib#driver.h"#include "driverlib#driverlib#driver.h"#include "driverlib#driverlib#driver.h"#driverlib#driverlib#driver.h"#include "driverlib#include "driverlib#driverlib#driver.h"#driverlib#driver.h"#include "driverlib#driverlib#driverlib#driver.h"#include "driverlib.md.


















//读取 GPIO 引脚的当前状态(蓝色 LED)和
//将相反状态写回
if (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2)
{
GPIOPinWrite (GPIO_PORT_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
}GPIOPIN_BASE







(GPIO_POINTE_INTE_GPIORT0)
、GPIORT0 (GPIO_PER_INT_GPIORT0)、GPIO_INBENTRIP_POIN_IN_INBENTRIP_POINT (GPIORT0)、GPIORT0)、GPIORP0 (GPIORT0)、GPIOR_IN_IN_IN_IN_IN_IN_IN_IN_INTRIP_IN_INB_INTRIP_INTE_IN_INTRIP_POINT (GPIORT0)、GPIORT0)、GPIORT0 (GPIOR_IN_IN_IN_IN_IN_IN_INT_




else
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、4);
}

//
* main.c
*
/ int main (void){
SysClockSet (SYSCTL_4|SYSCTL_USE_PLL|SYSCTL_USE_PLL|SYSCTAL_16MHz|SysCtl_OSC_MAIN



)、GPIO_PERIPB_GPTO_6_PHIN (GPIO_PEL)、GPIO_PERIPB_TO_TO_PHIN (GPIO_PEL) GPIO_PIN_TYPE_STD_WPU);

GPIOPinConfigure (GPIO_PB6_T0CCP0);

GPIOPCtlPinTypeTimer (GPIO_PORTB_BASE、GPIO_PIN_6);

//启用 GPIO 时钟
SysEnable (SYSCTL_Periph_GPIOF);
//将 GPIO 引脚配置为输出 GP_PIN_TRIP_0_TRIP_TIME_TRIP_TRIP_TRIP_TIME_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_0_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_0_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_0










(GPIO_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_TRIP_0);

Timer_A、TIMER_EVENT_POS_EDGE);
TimerControlEvent (TIMER0_BASE、TIMER_B、TIMER_EVENT_NEG_EDGE);

TimerIntEnable (TIMER0_BASE、TIMER_CAPA_EVENT);
TimerIntEnable (TIMER0_BASE、TIMER_CAPB_EVENT);

TimerIntRegister (TIMER0_BASE、 Timer_A、RisingEdgeInt);
TimerIntRegister (TIMER0_BASE、TIMER_B、FallingEdgeInt);


TimerIntClear (TIMER0_BASE、TIMER_CAPA_EVENT);
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);

//使处理器响应中断
IntMasterEnable ();

IntEnable (INT_TIMER0A);
IntEnable (INT_TIMER0B);

//使能处理器响应中断 IntMasterEnable (TIMER0

)

;timer_base (TIMER0);timer0 (timer_return);timer_timer 0 (while)



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Elsa、
    GPTMMIS 寄存器中 CBEMIS 和 CAEMIS 位的状态是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Elsa Riachi97"]我已按照研讨会中的解释方式更改了相应的启动文件[/引用]

    Elsa、

    有两种方法可以分配哪个函数用于出席中断:在单独的文件(通常为* startup_ccs.c)内,或者在主程序本身期间,使用 TivaWare 函数(如 TimerIntRegister())。

    启动文件的使用会更加复杂、因为它需要编辑"主代码之外的代码"。 但速度更快、因为中断地址直接存储在默认位置。

    使用诸如 TivaWare 的运行时注册更容易可视化、并且更方便创建"可移植函数"-但是当中断发生时、它通常需要额外的处理。

    您在上面的句子中建议您同时使用这两种方法-这可能是冲突的。 在进入计时器中断之前、您是否尝试创建一个简单的"GPIO 按钮中断"、只是为了确保中断概念正确且正常工作?

    另一件事:您将 TIMER0_BASE 用于两个信号:

     [引用用户="Elsa Riachi97"]定时器配置(TIMER0_BASE、TIMER_CFG_A_CAP_TIME);定时器配置(TIMER0_BASE、TIMER_CFG_B_CAP_TIME);[/引用]

    第二行实际上会覆盖第一行、因为它们处理的是同一个寄存器。 您需要使用 TIMER_CFG_SPLIT_PAIR 以及同一调用中两个计时器中的每个计时器的参数。

    最后、我看到您没有将任何值加载到您的计时器限制中。 我不确定这是否是捕获信号转换中断所必需的、但您可能需要测试并发布结果。 如果需要,请将计时器限制值加载到不同于零的值,以防万一-使用 TimerLoadSet();

    此致、

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bruno 发现问题和好的提示。 Elsa、请尝试 TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_B_CAP_TIME));