您好!
我尝试使用 AM437x IDK 的 PRU1_0从 eQEP 读取正交编码器脉冲。
通过 CCS 将固件加载到 PRU1_0后、我可以从 PWMSS0.eQEP_QPOSLAT 中读取任何内容。
我尝试在 uboot 模式下停止 CortexA9、以防止内核和器件树的发生变化、并使用 GEL 文件配置 PWMSS0_eQEP 的寄存器、但仍然看不到 eQEP_QPOSLAT 有任何变化。 (但我可以看到单位计时器计数)
请帮助我了解我错过了哪些内容。 谢谢!
以下是我使用的代码和 GEL 文件:
我以335x 的 PID 控制演示(http://www.ti.com/tool/tidep0073)为参考、并将 CM_PER_PWMSS0_CLKCTRL 的地址更改为0x44DF8C38。
由于我尚未在 AM437x-idk-evm.dts 和 McASP0中看到 LCDC 和 HDMI 已禁用、因此我只需将 eQEP0A_IN、eQEP0B_IN、eQEP0_INDEX 和 eQEP0_STROBE 的引脚多路复用器设置为(PIN_INPUT_PULLUP | MUX_MODE1)。
下面是用于配置 PWMSS0_eQEP 的 GEL 文件:
菜单项"PWMSS0_eQEP"
热菜单 PWMSS0_eQEP_Init()
{
PWMSS0_eQEP_PINMUX();
PWMSS0_eQEP_Enable();
PWMSS0_eQEP_config();
}
热菜单 PWMSS0_eQEP_PINMUX()
{
*((unsigned int*) 0x44E109A0)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109A4)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109A8)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109AC)= 0x60001;// input_pullup | MODE1
}
热菜单 PWMSS0_eQEP_Enable()
{
GEL_TextOut ("\t\t**** PWMSS0 eQEP 启用步骤1正在进行****\n"、"输出"、1、1);
*((unsigned int*) 0x44DF0810)|= 0x2;//rm_per_RSTCTRL。 断言复位
*((unsigned int*) 0x44DF0810)&= 0xFFFFFFFD;//rm_per_RSTCTRL。 清除复位
GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤1完成****\n"、"输出"、1、1);
GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤2正在进行****\n"、"输出"、1、1);
*((unsigned int*) 0x44DF8C38)|= 0x2;//PRCM_CM_PER_PWMSS0_CLKCTRL
GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤2完成****\n"、"输出"、1、1);
}
热菜单 PWMSS0_eQEP_config()
{
/*在四线模式下设置为默认值:PWMSS0.eQEP_QDECCTL */
*((unsigned int*) 0x483001A8)= 0x00;
/*启用装置定时器[1]
*在设备超时时时启用捕捉锁存[2]
*启用正交位置计数器[3]
*启用位置计数器的软件加载[7]
*在最大位置上重置位置计数器[12]:
* PWMSS0.eQEP_QEPCTL
*
*((unsigned int*) 0x483001AA)= 0x308E;/* 0x108E */
/*禁用 eQEP 捕捉:PWMSS0.eQEP_QCAPCTL *
/*((unsigned int*) 0x483001AC)= 0x0;*/
/*设置 eQEP 捕捉定时器和 UPEVNT 的预分频器*/
/*注意:在更改预分频器之前必须禁用 eQEP 捕捉单元*/
*((unsigned int*) 0x483001AC)= 0x0073;
/*启用 eQEP 捕捉*/
*((unsigned int*) 0x483001AC)|= 0x8000;
/*启用单元超时中断:PWMSS0.eQEP_QEINT */
*((unsigned int*) 0x483001B0)|= 0x0800;
/*清除编码器计数:PWMSS0.eQEP_QPOSCNT_bit.QPOSCNT *
*((unsigned int*) 0x48300180)= 0x00000000;
//设置最大编码器计数:PWMSS0.eQEP_QPOSMAX_bit.QPOSMAX *
*((unsigned int*) 0x48300188)= 0xFFFFFFFF;
/*清除计时器:PWMSS0.eQEP_QUTMR_bit.QUTMR */
*((unsigned int*) 0x4830019C)= 0x00000000;
/*设置单元定时器周期计数:PWMSS0.eQEP_QUPRD_BIT.QUPRD *
/* QUPRD =周期* 100MHz */
*((unsigned int*) 0x483001A0)= 0x007FFFFF;//(0x007FFFFF~1/12s)(0x000186A0~1ms)@ 100MHz
/*清除所有中断位:PWMSS0.eQEP_QCLR */
*((unsigned int*) 0x483001B4)= 0xFFFF;
}