工具与软件:
您好、
我提到此链接尚未响应。 我希望您能收到您的回复!
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、
在新的10.1 MCU SDK 中、我们提供了以下代码、并且计时器常见问题解答中的 PWM 生成有助于创建计时器的捕获实现。
C:\ti\mcu_plus_sdk_am64x_10_01_00_32\examples\drivers\gp_timer\gp_timer_pwm_capture
此致、
Anil。
您好、Wanglili、
我们还没有计划替换10.1。 我看到您发送的连接。 我根据寄存器对其进行了配置、并按照说明进行操作、但仍然无法正常工作。 我希望你能帮助你看到哪里有一个缺失的地方。谢谢你![/报价]这不是 MCU+SDK 中支持的功能,用户需要使他们根据 TRM 和上述 PWM 常见问题解答工作...
请分享您的申请。 我可以检查您的更改并提供反馈。
[报价 userid="602647" url="~/support/processors-group/processors/f/processors-forum/1491997/am6422-skd8-6-timer-capture/5733817 #5733817"] 我使用了 ECAP 模块并配置了 ECAP 中断。 R5F 程序通过 A53引导。 当使用示波器进行测量时、从外部中断触发到进入用户 ISR (中断服务例程)的时间为2.0μs。 这一次是否涉及堆栈推入/弹出操作? 在800MHz 实时内核(R5F)上、这似乎时间过长、会显著影响性能。 我使用 ECAP 是否错误、或者这是否为预期的性能水平?
您能否分享您如何测量2个已用时间的过程?
此致、
Anil。
您好、
1 μ、A
我使用 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);
}
2 μ、A
我将使用具有 D18引脚的 eCAP 模块来捕获 GPS 1PPS (第二个脉冲)信号。 当脉冲到达时、它会触发我的中断服务例程(ISR)。 在 ISR 内部、我将另一个 GPIO 引脚切换为低电平状态。 通过观察示波器上的两个信号(GPS 脉冲和 GPIO 切换)、我测量1PPS 信号到达和 GPIO 引脚被拉低之间的时间差、以评估中断响应延迟。
static void App_ecapInit(void)
{
/* Disable and Clear Interrupts */
ECAP_intrDisable(gEcapBaseAddr, ECAP_INT_ALL);
ECAP_intrStatusClear(gEcapBaseAddr, ECAP_INT_ALL);
/* Disable CAP1-CAP4 register loads */
ECAP_captureLoadingDisable(gEcapBaseAddr);
/* Configure eCAP */
ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_STOP);
/* Enable capture mode */
ECAP_operatingModeSelect(gEcapBaseAddr, ECAP_CAPTURE_MODE);
ECAP_continousModeConfig(gEcapBaseAddr);
/* One shot mode, stop capture at event 4 */
// ECAP_oneShotModeConfig(gEcapBaseAddr, ECAP_CAPTURE_EVENT4_STOP);
/* Set polarity of the events to rising, falling, rising, falling edge */
ECAP_captureEvtPolarityConfig(gEcapBaseAddr,
ECAP_CAPTURE_EVENT_RISING,
ECAP_CAPTURE_EVENT_FALLING,
ECAP_CAPTURE_EVENT_RISING,
ECAP_CAPTURE_EVENT_FALLING);
/* Set capture in time difference mode */
ECAP_captureEvtCntrRstConfig(gEcapBaseAddr,
ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET);
ECAP_syncInOutSelect(gEcapBaseAddr, ECAP_SYNC_IN_DISABLE, ECAP_SYNC_OUT_DISABLE);
ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_FREE_RUNNING);
/* Enable eCAP module */
ECAP_captureLoadingEnable(gEcapBaseAddr);
/* Enable interrupt */
ECAP_intrEnable(gEcapBaseAddr, ECAP_INT_ALL);
// ECAP_oneShotReArm(gEcapBaseAddr);
}
//interupt
HwiP_Params_init(&hwiPrms4);
hwiPrms4.intNum = CONFIG_ECAPRF1_INTR;
hwiPrms4.callback = &RF_ecapIntrISR;
hwiPrms4.isFIQ = 1;
hwiPrms4.isPulse = 0;//CONFIG_ECAPRF1_INTR_IS_PULSE;
hwiPrms4.priority = 0;
retVal= HwiP_construct(&gEcapHwiObject, &hwiPrms4);
DebugP_assert(retVal == SystemP_SUCCESS);
void RF_ecapIntrISR(void *arg)
{
// double capval=0;
uint32_t cap32val=0;
uint32_t status=0;
uint32_t cap1Count=0;
cap32val = TimerP_getCount(gTimerBaseAddr[CONFIG_TIMER1S]);
status = ECAP_getIntrStatus(gEcapBaseAddr, ECAP_INT_ALL);
if(((status&0x02)==ECAP_CEVT1_INT)||((status&0x08)==ECAP_CEVT3_INT))
GPIO_pinWriteLow(gpioDO1BaseAddr,CONFIG_DO1_PIN);
}
这是相关的代码部分。 在执行期间、系统中没有其他有效的中断。