主题中讨论的其他器件:SysConfig
工具与软件:
您好!
我们要使用计时器的输入捕获功能、但在 SysConfig 软件中未看到计时器和引脚之间的连接。 是否有任何相关的样片计划?
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.
您好、Wanglili、
感谢您的耐心。
[quote userid="602647" url="~/support/processors-group/processors/f/processors-forum/1432141/am6422-sdk-8-6-timer-compare-and-capture-modes 是否有任何相关的样片计划?当我们讨论计时器时、目前没有样例程序。 这可能会出现在未来的 SDK 版本中。
到目前为止、我可以提供的唯一计时器示例如下:
"
对于 AM64x MCU + SDK、我已经编写了一段代码来演示计时器中断。
我已经通过获取下的空应用编写了此应用 MCU_PLUS_SDK/examples/empty 作为基准。
我随附了 zip 文件、以便您继续操作、导入到 CCS 中并在移动中运行该文件。
empty_am64x-sk_r5fss0-0_nortos_ti-arm-clang.zip
"
此致、
Vaibhav
您好!
我了解计时器中断的这种用法。 目前我们要使用计时器采集、是否还不受支持? 我们的使用方案如下:通过 GPS pps 脉冲中断清除计时器值、并在一个计算周期内修改计时器的计数值、以便实现与第二个脉冲相同的频率计数。 我 目前有一些问题、我希望你可以帮助分析它。
首先介绍我的应用背景。
1、、一个完整的第二计时器定义了200MHz 的时钟频率、中断优先级为1 μ s、如列表中所示

2 μ s、捕获中断捕获 GPS 的 PPS 脉冲

3 μ s、 PPS 脉冲时、首先关闭中断、然后将计时器计数恢复到初始值、μ s、然后 打开中断。


4、在输入捕捉中断时记录当前计时器计数、从大约30个计数值计算平均值、并使用该平均值作为计时器的负载值。
difarr 为重新加载值。
5、通过4计算,调整计时器基本上与 GPS 的 PPS 一致。 此时有2个外部中断、但中断优先级低于捕捉中断。

6 μ s、SPI 与外部器件交换数据时、捕获中断计时器的计数不稳定、偏差达到4us、但当 SPI 未运行时、捕获中断到达时计时器计数误差基本上在1us 以内。

7、我还使用系统时钟进行测试、结果是在使用 SPI 时错误为3-4 μ s。
关于我的现象、如何验证问题是什么? 如有任何疑问、请随时提醒我添加说明。
您好、Wanglili、
AM64X 上提供了计时器模块。 可以支持此计时器来测量 PWM 参数和驱动 PWM 信号。
您可以使用计时器模块捕获 PWM 信号。
请查看 下面的常见问题解答 和下面的 TRM 章节、对捕获模式进行更改。
我已经创建了一个关于从时间模块生成 PWM 的常见问题解答、同样的过程也可应用于捕捉模式。


此致、
Anil。
您好、
我根据您提供的 PWM 示例配置了捕获模式。 当前配置完成后、我会检查寄存器以确认配置已完成、但当前无法接收捕获的信号。 在分析此器件的问题可能发生在哪里时、我需要您的帮助?
我使用 timer7的 u7引脚进行捕获、计时器时钟频率为200MHz、溢出中断周期为1s。我没有 发现配置有问题。 我希望您能帮我找到问题所在。 非常感谢。
void Timer_config(void)
{
TimerP_Params timerParams;
HwiP_Params timerHwiParams;
int32_t status;
volatile uint32_t *addr;
uint32_t ctrlVal = 0x00;
/* set timer clock source */
SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MAIN, 2);
*(volatile uint32_t*)AddrTranslateP_getLocalAddr(0x430081CC) = 2;
SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MAIN, 2);
gTimer7BaseAddr = (uint32_t)AddrTranslateP_getLocalAddr(0x2470000u);
TimerP_Params_init(&timerParams);
timerParams.inputPreScaler = 1;
timerParams.inputClkHz = 200000000u;
timerParams.periodInNsec = 1000000000u;
timerParams.oneshotMode = 0;
timerParams.enableOverflowInt = 1;
timerParams.enableDmaTrigger = 0;
TimerP_setup(gTimer7BaseAddr, &timerParams);
addr = (volatile uint32_t *)(gTimer7BaseAddr + 0x38);
ctrlVal = ( (1<<1U) | (1<<14U)| (1<<8U) | (1<<5U) ); //Trigger on overflow, Toggle, enable Auto Reload Mode
*addr = ctrlVal;
addr = (volatile uint32_t *)(gTimer7BaseAddr + 0x2c);
ctrlVal = (0x1U << 2)|(0x1U << 1);
*addr = ctrlVal;
HwiP_Params_init(&timerHwiParams);
timerHwiParams.intNum = 159;
timerHwiParams.callback = Timer7_isr0;
timerHwiParams.isPulse = 0;
timerHwiParams.priority = 2;
status = HwiP_construct(&gTimerHwiObj[CONFIG_TIMER1S], &timerHwiParams);
DebugP_assertNoLog(status==SystemP_SUCCESS);
Pinmux_PerCfg_t Timer_pin_Cfg[] =
{
{
PIN_PRG1_PRU0_GPO17,//U7
( PIN_MODE(6) | PIN_PULL_DISABLE )
},
{PINMUX_END, PINMUX_END}
};
Pinmux_config(Timer_pin_Cfg, PINMUX_DOMAIN_ID_MAIN);
TimerP_start(gTimer7BaseAddr);//start timer
}
void Timer7_isr0(void *args)
{
// void timerirq(void *args);
uint32_t value = 0x00;
uint32_t timercnt=0;
/* clear status for overflow interrupt */
value = CSL_REG32_RD(gTimer7BaseAddr + 0x28);
if(value & (0x1U << 1))//overflow
{
value = (0x1U << 1) ;
CSL_REG32_WR((gTimer7BaseAddr + 0x28), value);
timerirq(args);
}
if(value & (0x1U << 2))//capture
{
value = (0x1U << 2) ;
CSL_REG32_WR((gTimer7BaseAddr + 0x28), value);
timercnt = CSL_REG32_RD(gTimer7BaseAddr + 0x50);
timercnt = timercnt - (0xffffffff-(200000000-1));
PPS_IsrFxn1(timercnt,0);
}
TimerP_clearOverflowInt(gTimer7BaseAddr);
HwiP_clearInt(159);
}