工具与软件:
您好、
我提到此链接尚未响应。 我希望您能收到您的回复!
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); }
这是相关的代码部分。 在执行期间、系统中没有其他有效的中断。