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.

[参考译文] TM4C1294KCPDT:GPT 单次触发时间仅在每个处理器复位时生成一个脉冲

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1443740/tm4c1294kcpdt-gpt-one-shot-time-only-generates-one-pulse-per-processor-reset

器件型号:TM4C1294KCPDT

工具与软件:

我想使用 GPT 单次触发来生成软件触发脉冲。 我的代码是:

Fullscreen
1
2
3
4
5
6
7
8
9
10
TimerDisable(TIMER4_BASE, TIMER_B);
TimerConfigure
(
TIMER4_BASE,
TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_ONE_SHOT | TIMER_CFG_B_ACT_SETCLRTO
);
TimerControlStall(TIMER4_BASE, TIMER_B, false);
TimerPrescaleSet(TIMER4_BASE, TIMER_B, 120);
TimerLoadSet(TIMER4_BASE, TIMER_B, 1000);
TimerEnable(TIMER4_BASE, TIMER_B);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

当我运行编码时、在首次执行编码时、PM5上会产生预期的脉冲。 然而、代码的后续执行不会生成输出脉冲。 如果我从 CCS 重新加载代码并再次运行、我会再次获得单个脉冲、但没有后续脉冲。

 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);系统启动期间调用一次。

我缺少什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="351454" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1443740/tm4c1294kcpdt-gpt-one-shot-time-only-generates-one-pulse-per-processor-reset 运行代码时、第一次执行代码时将按预期在 PM5上产生一个脉冲。 然而、代码的后续执行不会生成输出脉冲。 如果我从 CCS 重新加载代码并再次运行、我会再次得到一个脉冲、但没有后续脉冲。[/QUOT]

    尊敬的 Peter:

     我看不出您是如何配置 PM5的 pinmux、但我想您已在代码的另一部分中配置此功能。 我不清楚您的申请意向。  是否尝试生成单稳态脉冲? 如果您打算这样做、则模块会按预期生成单次触发事件、然后禁用计时器。 您是否已确保在重新启动另一个单次触发事件之前清除与此单次触发计时器相关的所有状态标志?

    当定时器递减计数并且到达超时事件(0x0)时、定时器将重新装载它的初始值
    来自 GPTMTnILR 和 GPTMTnPR 寄存器的值。 活动状态
    递增计数并达到超时事件(GPTMTnILR 中的值和可选的值)
    GPTMTnPR 寄存器中)所花费的时间、定时器重新载入0x0。 如果配置为单次触发计时器、即计时器
    停止计数并将 GPTMCTL 寄存器中的 TnEN 位清零。 如果配置为周期计时器、
    此定时器将在下一个时钟周期开始再次计数。

    ...

    GPTM Timer n 模式(GPTMTnMR)寄存器的 TCACT 域可被配置为清零、置位
    发生超时事件时切换输出。

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

    我有一个解决办法。 我已修改代码以在首次配置计时器时清除 TCACT、然后 在下一行中将 TCACT 设置为所需的值。 我认为在之前的代码中、计时器不会注意到 TCACT 已再次设置、因为它是相同的值、所以不会更改 CCP 的状态。 更新后的代码为:

    Fullscreen
    1
    2
    3
    4
    HwReg(TIMER4_BASE | TIMER_O_TBMR) =
    TIMER_TBMR_TBCINTD | TIMER_TBMR_TBILD | TIMER_TBMR_TBMR_1_SHOT;
    HwReg(TIMER4_BASE | TIMER_O_TBMR) |= TIMER_TBMR_TCACT_SETTOGTO;
    HwReg(TIMER4_BASE | TIMER_O_CTL) = TIMER_CTL_TBEN;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    请注意、我已切换到直接访问计时器寄存器、而不是调用 TimerXXX 函数、但这样对结果没有影响。