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.

[参考译文] TM4C129ENCPDT:Tiva TM4C1294配置单个24位捕捉计数器。

Guru**** 2487425 points
Other Parts Discussed in Thread: EK-TM4C1294XL, TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/735931/tm4c129encpdt-tiva-tm4c1294-configuring-single-24-bit-capture-counter

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:TM4C1294NCPDTEK-TM4C1294XLTM4C123

 

我在 Tiva 评估板器件型号 EK-TM4C1294XL 上使用 CCS 6.1.2 TIRTOS 2.16.0.08、编译器5.2.7和 TM4C1294NCPDT Micro

我想配置一个计时器来对微控制器输入引脚上的脉冲进行计数。 我想使用全宽定时器、因为我想对超过65535个事件使用超过16位的定时器。 我在输入边沿计数模式下读取、我只能使用24位(CPU 文档的第13.3.3.3节)

假设我使用的是 Timer2、我将用于对脉冲进行计数的评估板上的引脚是 PA4。

当我运行下面的代码时,我认为计时器是自由运行的,不对实际脉冲进行计数,因为如果我不对输入引脚 PA4进行脉冲,我从计时器读取的值仍在变化。 下面是两个函数、一个执行读取操作、另一个执行初始化和配置操作。

我的问题是:

1) 1)    为什么不对 PA4引脚上的脉冲进行计数、并且看起来是自由运行的。

2)    2)永远不会调用 IRQ 回调、我不知道原因。

3) 3)    我不清楚如何处理全宽计时器、我应该使用 TIMER_MOR_A 还是 TIMER_A 等?

谢谢、

道格

无符号整型 Timer2ReadCount ()

  无符号超长 timerCount;

  timerCount = TimerValueGet (TIMER2_base、timer_A);

  返回 timerCount;

void timerCounterInit (void)//使用 Tiva CPU 上的引脚 PA4 (请参阅 CPU 文档 P 1808/1890)

  Hwi_handle myHwi;

  Hwi_Params HwiParams;

  ERROR_Block EB;

 

  MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);//启用定时器。

  MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//启用用于引脚的 GPIO。

 

 

  MAP_GPIOPinConfigure (GPIO_PA4_T2CCP0);//设置备用功能

  GPIOPinTypeTimer (GPIO_Porta_base、GPIO_PIN_4);//将引脚配置为计时器     // GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPD);

 

  MAP_TimerConfigure (TIMER2_base、(TIMER_CFG_A_CAP_COUNT));//倒计数第503/650页 Rom 文档

 

  MAP_TimerControlEvent (TIMER2_base、TIMER_Both、TIMER_EVENT_POS_EDGE);//配置边沿。

  MAP_TimerLoadSet (TIMER2_base、TIMER_Both、0xFFFF);//

 

//安装 IRQ

  ERROR_INIT (&EB);

  Hwi_Params_init (hwiParams);

  myHwi = Hwi_create (INT_TIMER2A_TM4C123、Timer2IntHandler、&hwiParams、&EB);

 

  if (NULL ==myHwi)

  {

      printf ("为计时器安装 IRQ %d 时出错"、INT_TIMER2A_TM4C123);

  }

  其他

  {

      printf ("确定为计时器安装 IRQ %d "、INT_TIMER2A_TM4C123);

  }

 

  MAP_TimerIntEnable (TIMER2_base、TIMER_CAP_EVENT | TIMER_CAP_MATCH);//选择 IRQ 以启用。

  ROM_IntEnable (INT_TIMER2A_TM4C129);//启用 IRQ 39。 ROM 用户文档页513/650 Rom 文档

//rom_IntEnable (INT_TIMER2A);

  MAP_TimerEnable (TIMER2_base、TIMER_Both);//启用计时器。 ROM 用户文档页509/650 Rom 文档

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

    如果您的目标是对事件进行计数并在0xXXXXXX 事件之后生成中断(其中0xXXXXXX 代表24位数字)、则使用一半的定时器和预分频器。 下面的代码将定时器2A 配置为在每个0x30010上升沿生成一个中断。

    void timerCounterInit (void)//使用 Tiva CPU 上的引脚 PA4 (请参阅 CPU 文档 P 1808/1890)
    
    {
    map_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//启用用于引脚的 GPIO。
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);//启用定时器。
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER2))
    {//等待 Timer0模块准备就绪
    。}
    MAP_GPIOPinConfigure (GPIO_PA4_T2CCP0);//设置备用函数
    MAP_GPIOPinTypeTimer (GPIO_Porta_base、GPIO_PIN_4);//将引脚配置为定时器
    MAP_TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_MATCHSET
    );TIMER MAP_TIMER = 0x00_UP (TIMER_TIMER);TIMER_TIMER = Timer_MA_UP (TIMER2、TIMER_COUNT_UP) //
    map_TimerPrescaleMatchSet (TIMER2_base、TIMER_A、0x03);
    map_TimerControlEvent (TIMER2_base、TIMER_A、 Timer_EVENT_POS_EDGE);//配置边沿。
    MAP_TimerIntEnable (TIMER2_base、TIMER_CAP_MATCH);//选择 IRQ 以启用。
    MAP_IntEnable (INT_TIMER2A);//启用 IRQ 39。
    MAP_TimerEnable (TIMER2_base、TIMER_A);//启用计时器
    。}