工具与软件:
我想使用 GPT 单次触发来生成软件触发脉冲。 我的代码是:
当我运行编码时、在首次执行编码时、PM5上会产生预期的脉冲。 然而、代码的后续执行不会生成输出脉冲。 如果我从 CCS 重新加载代码并再次运行、我会再次获得单个脉冲、但没有后续脉冲。
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);
在系统启动期间调用一次。
我缺少什么?
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.
工具与软件:
我想使用 GPT 单次触发来生成软件触发脉冲。 我的代码是:
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);
当我运行编码时、在首次执行编码时、PM5上会产生预期的脉冲。 然而、代码的后续执行不会生成输出脉冲。 如果我从 CCS 重新加载代码并再次运行、我会再次获得单个脉冲、但没有后续脉冲。
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);
在系统启动期间调用一次。
我缺少什么?
尊敬的 Peter:
我看不出您是如何配置 PM5的 pinmux、但我想您已在代码的另一部分中配置此功能。 我不清楚您的申请意向。 是否尝试生成单稳态脉冲? 如果您打算这样做、则模块会按预期生成单次触发事件、然后禁用计时器。 您是否已确保在重新启动另一个单次触发事件之前清除与此单次触发计时器相关的所有状态标志?
当定时器递减计数并且到达超时事件(0x0)时、定时器将重新装载它的初始值
来自 GPTMTnILR 和 GPTMTnPR 寄存器的值。 活动状态
递增计数并达到超时事件(GPTMTnILR 中的值和可选的值)
GPTMTnPR 寄存器中)所花费的时间、定时器重新载入0x0。 如果配置为单次触发计时器、即计时器
停止计数并将 GPTMCTL 寄存器中的 TnEN 位清零。 如果配置为周期计时器、
此定时器将在下一个时钟周期开始再次计数。
...
GPTM Timer n 模式(GPTMTnMR)寄存器的 TCACT 域可被配置为清零、置位
发生超时事件时切换输出。
我有一个解决办法。 我已修改代码以在首次配置计时器时清除 TCACT、然后 在下一行中将 TCACT 设置为所需的值。 我认为在之前的代码中、计时器不会注意到 TCACT 已再次设置、因为它是相同的值、所以不会更改 CCP 的状态。 更新后的代码为:
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;
请注意、我已切换到直接访问计时器寄存器、而不是调用 TimerXXX 函数、但这样对结果没有影响。