工具与软件:
尊敬的 TI 专家:
SDK 版本:SDK8.4
我们当前正在尝试实现 GPIO 模拟 PWM 函数。 我们需要使用 MCU20上的计时器来定期翻转 GPIO 端口。 如何使用计时器?
此致。
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.
工具与软件:
尊敬的 TI 专家:
SDK 版本:SDK8.4
我们当前正在尝试实现 GPIO 模拟 PWM 函数。 我们需要使用 MCU20上的计时器来定期翻转 GPIO 端口。 如何使用计时器?
此致。
您好、Brijesh:
您的意思是从计时器中断切换 GPIO 输出吗?
是的、您说得对。
现在已知、Timer12正在由 MCU30使用、而其他计时器目前不被我们使用。 我们可以使用 MCU20上的 Timer0或 Timer1实现此函数吗?
此致。
尊敬的 JC:
我认为 J721E 上的 SDK08.04版本支持基于 CSL 的计时器、因此我编写了一个例程来配置计时器、您能否看看这是否是您要找的?
#define GPTIMER_MAX_RESOLUTION (0xFFFFFFFFU)
#define TIMER_INITIAL_COUNT (0x3C0U)
#define TIMER_RLD_COUNT (0x3C0U)
#define TIMER16_IRQ_NUM 172
void TimerMode_Init(uint32_t baseAddr)
{
TIMERReset(baseAddr);
TIMEREmuModeConfigure(baseAddr, TIMER_TIOCP_CFG_EMUFREE_TIMER_FREE);//GPTIMER_FREE);
TIMERIdleModeConfigure(baseAddr, TIMER_TIOCP_CFG_IDLEMODE_IDLE_MODE_0X1);//GPTIMER_NO_IDLE);
TIMERPostedModeConfig(baseAddr, TIMER_TSICR_POSTED_POSTED_VALUE_0);//GPTIMER_NONPOSTED);
TIMERCounterSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_INITIAL_COUNT));
TIMERReloadSet(baseAddr, (GPTIMER_MAX_RESOLUTION - TIMER_RLD_COUNT));
TIMERModeConfigure(baseAddr, TIMER_TCLR_AR_MASK); //GPTIMER_AUTORLD_NOCMP_ENABLE);
TIMERWakeEnable(baseAddr, TIMER_IRQWAKEEN_OVF_WUP_ENA_MASK);
TIMERIntEnable(baseAddr, TIMER_INT_OVF_EN_FLAG);
TIMERDisable(baseAddr);
}
Timer_PeriodConfig(uint32_t baseAddr, uint32_t wTime)
{
HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0002);
HW_WR_REG32(baseAddr + TIMER_TCRR, (GPTIMER_MAX_RESOLUTION - wTime));
HW_WR_REG32(baseAddr + TIMER_TLDR, (GPTIMER_MAX_RESOLUTION - wTime));
HW_WR_REG32(baseAddr + TIMER_TCLR, 0x0003); /* start timer */
}
void Timer_IntCfg(void)
{
uint32_t baseAddr;
HwiP_Handle hwiHandle;
OsalInterruptRetCode_e osalRetVal = 0;
OsalRegisterIntrParams_t intrPrms;
/*Timer18*/
baseAddr = TIMER16_ADDRESS;
Osal_RegisterInterrupt_initParams(&intrPrms);
intrPrms.corepacConfig.arg = (uintptr_t)baseAddr;
intrPrms.corepacConfig.name = NULL;
intrPrms.corepacConfig.isrRoutine = Timer16_InterruptIsr;
intrPrms.corepacConfig.priority = 0x01U;
intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */
intrPrms.corepacConfig.triggerSensitivity = OSAL_ARM_GIC_TRIG_TYPE_HIGH_LEVEL;
intrPrms.corepacConfig.intVecNum = TIMER16_IRQ_NUM;
osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
if(osalRetVal == 0)
{
printf("Timer16_IntCfg success!\n");
}
else
{
printf("Timer16_IntCfg is fail!\n");
}
}
此致、
Brijesh
您好、Brijesh:
我很抱歉没有及时回复、因为我有假期庆祝中国新年。
感谢您提供示例代码。 我有几个问题想问你:
1.我认为 Timer_Period 455()是一个重置定时器的操作,但我不确定哪个值更适合设置 wTime 变量;
Timer16InterruptIsr 指针应该要求我自己执行定时器的中断计数、但是我不知道定时器中断有多长时间? 这是我们可以设置的吗? 如果我想计数33ms 的时间、理论上应该接收多少个计时器中断?
此致。