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.

[参考译文] TM4C129XNCZAD:#39;定时器比较操作模式#39;:输出引脚在比较匹配时不受影响

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1015145/tm4c129xnczad-timer-compare-action-mode-output-pin-is-not-affected-at-compare-match-time

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:TM4C129CNCZADDK-TM4C129XSEGGER

您好!

在 TM4C 微控制器上‘Timer Compare Action Mode’(计时器比较操作模式)时出现问题,希望您能为我们提供支持。 比较匹配时、连接的输出引脚不受影响。

环境条件:

  • 目标控制器:TM4C129CNCZAD
  • 当前使用的控制器:DK-TM4C129X 评估板上的 TM4C129XNCZAD
  • 编译器:IAR Embedded Workbench for ARM 9.10.2.39460

用例:

为了控制我们的物理过程、我们需要将多个计时器与计时器比较操作模式相结合、以便在未来的指定时间切换数字输出、而无需处理器操作。

  • 定时器 A 和 B 在16位模式下单独使用
  • 定时器被配置为周期定时器、定时器间隔装载值为0xFFFF。 定时器可自由运行、并且在正常运行期间无法重新初始化。
  • 数字输出只能在比较时间切换。 定时器超时一定不能影响数字输出。 物理过程与定时器周期异步。

已用配置:

  • 为了配置引脚切换、GPTMTnMR 寄存器中的 TCACT 被设置为非零值。
  • TnAMS 位被设定为零:捕获或者比较模式被启用。
  • 对于开关、输出 GPTMTnMATCHR 寄存器根据下次开关的时间进行设置。
  • 定时器中断被配置为定时器匹配中断
  • GPIO 通过 MUX 连接到计时器。

问题/当前行为:

  • 定时器匹配中断在比较匹配时间正确发生。 à 确定
  • 在比较匹配时间内不会切换相应的输出。 à 不正常
  • 相应的输出在计时器超时时时切换。 à 不正常
  • TCACT 的所有非零值都不会导致比较匹配时的输出引脚动作。

 代码提取:

void Timer1IntHandler(void)
{
    // this port switch is only for testing the timer match ISR
    GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_3, GPIO_PIN_3);
    TimerIntClear(TIMER1_BASE, TIMER_TIMA_MATCH);
    GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_3, 0);
}

int main(void)
{
    //
    // Run from the PLL at 120 MHz.
    // Note: SYSCTL_CFG_VCO_240 is a new setting provided in TivaWare 2.2.x and
    // later to better reflect the actual VCO speed due to SYSCTL#22.
    //
    ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                           SYSCTL_OSC_MAIN |
                                           SYSCTL_USE_PLL |
                                           SYSCTL_CFG_VCO_240), 120000000);

    //
    // Configure the device pins.
    //
    PinoutSet();

    //
    // Enable the peripherals used by this example.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);

    //
    // Enable processor interrupts.
    //
    IntMasterEnable();

    TimerConfigure(TIMER1_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | TIMER_CFG_A_ACT_TOGGLE);
    
    TimerLoadSet(TIMER1_BASE, TIMER_A, 0xFFFF);
    TimerMatchSet(TIMER1_BASE, TIMER_A, 30000);

    IntEnable(INT_TIMER1A);
    
    TimerIntEnable(TIMER1_BASE, TIMER_TIMA_MATCH);

    GPIOPinConfigure(GPIO_PD2_T1CCP0);
    GPIOPinTypeTimer(GPIO_PORTD_BASE, GPIO_PIN_2);
    
    // configure output for ISR testing
    GPIOPinTypeGPIOOutput(GPIO_PORTQ_BASE, GPIO_PIN_3);
    GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_3, 0);
       
    //
    // Enable the timers.
    //
    TimerEnable(TIMER1_BASE, TIMER_A);

    //
    // Loop forever while the timers run.
    //
    while(1)
    {
    }
}

我们有以下问题:

  • 是否可以配置定时器比较操作模式、以便仅比较匹配会影响相应的输出引脚? 计时器超时一定不能影响输出引脚。
  • 在代码示例中发生了什么错误、因此无法实现所需的行为。

 非常感谢您的支持。

 

此致、

Markus Karas

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

    Markus、您好!

    我重复了您当前的情况、并了解您正在尝试做什么。 我们可能需要在下周进一步努力、在这里获得解决方案、但我可以解释您当前配置的情况。

    如果  没有手动 GPIO 控制、我不确定是否可以使输出在匹配时触发并且不会超时。

    下面是器件数据表第1130页上 GPTMTAMR 寄存器的详细信息。 具体而言、这适用于 TCACT (计时器比较操作选择)寄存器位:

    值描述

    0x0  禁用比较操作。
    0x1   切换状态开启超时
    0x2   清除 CCP 超时
    0x3   设置 CCP 开超时
    0x4   立即设置 CCP 并在超时时时切换
    0x5   立即清除 CCP 并在超时时切换
    0x6   立即设置 CCP 并在超时清除
    0x7   立即清除 CCP 并设置超时

    所有这些都指示仅 在超时而不 是匹配时执行的操作、因此根据这一点、行为是合理的。

    我需要更深入地探究匹配的工作原理、以确保这一点、但在我看来、匹配似乎不会触发 I/O 切换、只是一个中断。 然后、在中断中、您可以处理 I/O 切换。

    这是美国的假日周末、所以我将在星期二取回此备份、但周三之前可能无法回复您。 希望这些初始详细信息能帮助您至少了解您的观察结果。

    此致、

    Ralph Jacobi

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

    您好 Ralph、

    非常感谢您参加本次首次评估。 您的描述与我们所做的调试结果相匹配。

    在1114页的手册中描述了我们的用例。 遗憾的是、我们无法使微控制器的运行方式与此类似。

    定时器比较操作模式
    定时器比较模式是 GPTM 现有单次触发和周期模式的扩展。 这种情况
    当应用在未来的某个时间需要改变引脚状态时、可以使用模式、
    无论处理器状态如何。 当 PWM 模式为时、比较模式不工作
    并且与 PWM 模式是互斥的。 比较模式在 TAMR 时启用
    该域设置为0x1或0x2 (单次触发或周期)、TnAMS 位为0 (捕获或比较模式)、以及
    在 GPTM Timer n 模式(GPTMTnMR)寄存器中、TCACT 域不为零。 具体取决于
    TCACT 编码时、计时器可以在相应的 CCPn 引脚上执行置位、清零或切换
    发生计时器匹配。 在16位模式中、相应的 CCP 管脚可以应用一个动作、但是
    在32位模式下运行时、此操作只能应用于偶数 CCP 管脚。
    启用 GPTM 时、可以更改 TCACT 域以生成不同的组合
    操作。 例如、在周期事件期间、可以使用编码 TCACT = 0x6或0x7来强制
    CCPn 管脚在第一个中断之前以及之后的初始状态、TCACL=0x2、TCACL=0x3
    可被用于(交替)改变引脚的感测、以便在可能的情况下进行后续切换
    为下一个周期更改加载值。
    用于单次触发和周期模式的超时中断用于比较操作模式。
    因此、如果适当的屏蔽位被置位、GPTMRIS 寄存器中的 TnTORIS 位就会被触发
    寄存器中的位。

    为您提供支持。

    此致、

    Markus Karas

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

    您好、Marcus、

    您是否已查看有关计时器操作的器件勘误表 PDF? 在某些类别的 MCU 上、在向上计数模式下存在奇数匹配行为。  

    此致、

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

    您好!

    感谢您的提示。 我们已经检查了勘误表。 列出的主题与所使用的定时器配置不对应。 我们使用基于 SYCLK 的周期性递减计数计时器。

    此致、

    Markus Karas

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

    好的、您首先检查了勘误表、并是否使用 CCS 调试来确认所有计时器寄存器是否设置为所需?  

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

    我们将 IAR Workbench 与 Segger 的 J-Trace 结合使用。 是的、我们已根据手册检查了寄存器是否正确设置。

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

    我在您列出的代码中看不到正在配置的计时器控制事件。 我们使用拉尔夫提到的中断边沿事件。

    /*为 CCP1配置边沿极性捕捉事件。 *
    MAP_TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);

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

    BTW:看似 CCP 动作事件触发器用于从向内的封装引脚捕获 GPIO 事件。 过去的实验 TM4C1294永远不可能获得 CCP 引脚来将 GPIO 输出切换至封装引脚。 它是 GPIO 检测的捕获事件操作、而不是输出控制操作事件。

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

    Markus、您好!

    我同意数据表中的描述表明、但寄存器似乎与之相冲突、这使我对能否真正实现该功能产生怀疑。 不幸的是、今天我没有花太多时间来讨论这个问题、因此我没有任何新的发现。

    此致、

    Ralph

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

    我猜 TimerControlEvent()只有在捕获模式下才有必要定义要捕获的边沿。 在比较模式下、我认为这是不必要的。

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

    您好、Ralph、
    我们在这段时间内已经尝试了、我认为捕获比较单元无法正常工作、因为我们需要它。 遗憾的是、这里的 TM4C 与目前已知的微控制器不同。
    不过,如果在这方面有其他问题,你可以给我一些反馈,那会很有帮助。

    非常感谢、致以诚挚的问候、
    Markus

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

    您可以强制计时器在超时事件发生之前重新加载。 此外、在 OneShot 模式下、默认复位匹配值为32位宽、可降至0x1。 OneShot 模式可以驱动 ADC 序列发生器触发器、甚至可以在匹配计数时切换 CCPn 引脚。  

        MAP_TimerClockSourceSet(TIMER1_BASE, TIMER_CLOCK_SYSTEM);
        MAP_TimerConfigure(TIMER1_BASE, TIMER_CFG_ONE_SHOT);
        /* Load the 32 bit Match value for one shot
         * re-load GPTMnMATCHR Reset value (FFFF.FFFF)  */
        MAP_TimerMatchSet(TIMER1_BASE, TIMER_A, 0x1);
        /* Set IMR interrupt disabled for timeout events */
        MAP_TimerIntDisable(TIMER4_BASE, TIMER_TIMA_TIMEOUT|TIMER_TIMA_MATCH);

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

    Markus、您好!

    好的、就"Timer can perform a set、clear or toggle on the 쿠 对应的 CCPn pin when  a timer match ocee"而言、您需要使用以下设置之一:

    • 0x4立即设置 CCP 并在超时时时切换
    • 0x5立即清除 CCP 并在超时时切换
    • 0x6立即设置 CCP 并在超时清除
    • 0x7立即清除 CCP 并设置超时

    问题在于、此功能不是为 保持该输出而设置的。 超时后将以某种方式切换信号。 我发现不常见的情况是、它不会切换超时、而是切换下一个匹配集。 因此、该行为似乎与确切的寄存器说明不一致、但我认为在这种情况下、数据表不够明确、因为明确提到了需要使用其他设置切换超时的想法:

    例如、在周期事件期间、可以使用编码 TCACT = 0x6或0x7来强制
    CCPn 管脚在第一个中断之前以及之后的初始状态、TCACL=0x2、TCACL=0x3
    可被用于(交替)改变引脚的感测、以便在可能的情况下进行后续切换
    为下一个周期更改加载值。

    [引用 userid="491382" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1015145/tm4c129xnczad-timer-compare-action-mode-output-pin-is-not-affected-at-compare-match-time ]\n 数字输出只能在比较时切换。 定时器超时一定不能影响数字输出。 物理过程与计时器周期异步。[/报价]

    就我所说的、您需要通过某种中断手动控制 I/O。 不过、我不太确定要为您的系统推荐什么、因为如果没有匹配功能、我实际上不知道其他选项是什么。

    此致、

    Ralph Jacobi

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

    您好、GI、

    我们还考虑了如何操作计时器重新加载值来解决该问题。 该解决方案的问题是、我们使用7个计时器来切换不同的硬件信号。 所有这些计时器必须同步运行才能具有相同的时基。 因此、我们无法操作单个计时器的计时器值或计时器重载值。

    感谢您的支持。

    此致、Markus

      

    您好 Ralph、

    感谢您的评估。 我们没有找到适合我们需求的比较输出配置。 我们现在使用比较匹配中断并手动控制输出引脚。 我们必须检查中断(或更高优先级的中断)引起的延迟是否会影响我们的控制算法。

    再次感谢您的支持。

    此致、
    Markus

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

    在中断例程中实现。

    已解决并关闭