器件型号:SK-AM64
您好!
我正在尝试配置 SK-AM64板上的 TIMER_IO4和 TIMER_IO5。 我已按如下方式配置计时器引脚排列。
timer4_pins_default:timer4-pins 缺省{ //捕获脉冲输入的计时器
PINCCTRL-SINGLE、PINS =<
AM64X_IOPAD (0x0258、PIN_INPUT、4)/*(C17) MCAN1_TX.TIMER_IO4 */
>;
};
timer5_pins_default:timer5-pins 默认{//计时器用于生成脉冲输出
PINCCTRL-SINGLE、PINS =<
AM64X_IOPAD (0x025c、PIN_OUTPUT、4)/*(D17) MCAN1_RX.TIMER_IO5 */
>;
};
此处是脉冲输入代码、将计时器设置 为捕获模式
static int timer_set_capture (struct dmtimer *timer、
INT CAP_MODE、EDG_t 边沿、内部自动重新加载)
{
结构设备*dev;
内部 RC;
u32 l;
如果(不太可能(!TIMER))
返回-EINVAL;
dev =&timer->pdev->dev;
RC = pm_runtime_resume_and_get (dev);
IF (RC)
返回 RC;
L = TIMER_READ (TIMER、OMAP_TIMER_CTRL_REG);
L &=~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_CAPTMODE |
OMAP_TIMER_CTRL_TCM_HIGHTOLOW | OMAP_TIMER_CTRL_PT |
OMAP_TIMER_CTRL_TCM_LOWTOHIGH|(0x03 << 10)|
OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_TCM_BOTHEDGES);
/*定时器 IO 引脚用作触发输入*/
L |= OMAP_TIMER_CTRL_GPOCFG;
/*在第二次事件时捕获:捕获第二次启用的捕获
TIMER_TCAR1中的事件和 TIMER_TCAR1中的第二个启用的捕获事件
Timer_TCAR2。
*/
如果(CAP_MODE)
L |= OMAP_TIMER_CTRL_CAPTMODE;
切换(边线){
案例 NO_CAP:
L &=~(OMAP_TIMER_CTRL_TCM_HIGHTOLOW |
OMAP_TIMER_CTRL_TCM_LOWTOHIGH |
OMAP_TIMER_CTRL_TCM_BOTHEDGES);
中断;
案例上升:L |= OMAP_TIMER_CTRL_TCM_LOWTOHIGH;break;
案例下降:L |= OMAP_TIMER_CTRL_TCM_HIGHTOLOW;break;
同时运行:L |= OMAP_TIMER_CTRL_TCM_BOTHEDGES;break;
默认值:break;
}
IF (自动回放)
L |= OMAP_TIMER_CTRL_AR;
Timer_write (timer、OMAP_timer_CTRL_REG、l);
PM_runtime_put_sync (dev);
返回0;
}
以下是我的主要计时器节点、
&main_timer4{
状态="可以";
兼容="elpro、el-pulse-in1";
pintctrl-names ="默认";
pintctrl-0 =<&timer4_pins_default>;
};
&main_timer5{
状态="可以";
兼容="elpro、el-pulse-OU1";
pintctrl-names ="默认";
pintctrl-0 =<&timer5_pins_default>;
};
我可以看到 timer5发生了中断、PIN 上未显示任何内容。 当我将脉冲发生器连接到 timer4引脚时、即使没有发生中断。 看起来引脚配置不正确。
我还需要配置什么其他东西才能使它正常工作。 两个管脚始终有效(高电平)。 如果 timer4引脚配置正确、则不应在配置为输入的分配引脚上显示置位信号。
这是我用于配置计时器的 C 代码
/*将设置和启动定时器作为输入(捕获模式)或输出(PWM 模式)*/
静态 int setup_timer(struct dmtimer * timer, bool is_input ){
无符号长整型速率;
if (定时器){
Timer_ENABLE (计时器);
Request_IRQ (TIMER->IRQ、TIMER_IRQ_Handler、IRQF_TIMER、TIMER->NAME、NULL);
if (is_input){
Timer_SET_int_enable (timer、OMAP_timer_INT_capture);
Timer_SET_CAPTURE (定时器、1、上升、1);
}其他{
Timer_SET_int_enable (timer、OMAP_timer_INT_match);
Timer_SET_PWM (timer、0、1、OMAP_timer_trigger_overflow_and_compare、1);
Timer_SET_LOAD (定时器、0);
rate = clk_get_rate (timer->fclk);
Timer_Set_Match (定时器、1、速率*10);//(*:更多时间;/:更少时间) FIX 使其可配置
}
Timer_start (定时器);
返回1;
}其他
pr_err ("无法设置计时器\n");
返回0;
}
这里是 TIMER_SET_PWM 函数
static int timer_set_pwm (struct dmtimer *timer、int def_on、
Int 切换、int 触发器、int 自动回放)
{
结构设备*dev;
内部 RC;
u32 l;
如果(不太可能(!TIMER))
返回-EINVAL;
dev =&timer->pdev->dev;
RC = pm_runtime_resume_and_get (dev);
IF (RC)
返回 RC;
L = TIMER_READ (TIMER、OMAP_TIMER_CTRL_REG);
L &=~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM | OMAP_TIMER_CTRL_PRE |
OMAP_TIMER_CTRL_PT |(0x03 << 10)|(0x03 << 2)| OMAP_TIMER_CTRL_AR);
如果(DEF_ON)
L |= OMAP_TIMER_CTRL_SCPWM;
if (切换)
L |= OMAP_TIMER_CTRL_PT;
L |=触发<< 10;
IF (自动回放)
L |= OMAP_TIMER_CTRL_AR;
// l |=(0x03 << 2);//预分频器
// l |= OMAP_TIMER_CTRL_PRE;
Timer_write (timer、OMAP_timer_CTRL_REG、l);
PM_runtime_put_sync (dev);
返回0;
}