Other Parts Discussed in Thread: SYSBIOS
Thread 中讨论的其他器件:SYSBIOS
您好!
我们要求切换具有精确时序的 GPIO 线路。 例如、将 GPIO 设置为高电平、等待至少9微秒但小于11微秒、然后将 GPIO 设置为低电平。
我们在 ipu1上运行代码、在该 IPU 上没有其他运行的代码。 (DSP 和主 CPU 上都运行代码)
我将使用分辨率为10纳秒的示波器来观察输出。
我看到输出低电平的时间短至6.12微秒、长至8.72微秒。 这超出了要求。
我们使用的代码基于 IPC_3_47_02_00/examples/DRA7XX_Linux_elf/ex02_MessageQ/ipu1/Server.c
我已将 GPIO 切换代码剥离至基础知识(见下文)
我将 ECAP 自由运行计时器(PWMSS_ECAP_TSCNT)用于延迟环路。 系统上没有其他代码正在使用或访问该寄存器。
该代码的性能取决于主 CPU 上的负载、即使在禁用中断的情况下也是如此。 我希望时间基本上独立于系统的其余部分。
此代码是否有问题?
我可以检查/更改哪些内容来实现可靠的波形时序? (特定协议不是标准协议、芯片中不可用)
谢谢、
Scott
注意:寄存器地址以"0x6"开头、而不是通常的"0x4"开头、因为代码在 IPU 上运行。
volatile U32 * const PWMSS_ECAP_TSCNT =(U32 *) 0x68442100;
volatile U16 * const PWMSS_ECAP_ECCTL2 =(U16 *) 0x6844212A;
volatile U32 * const CTRL_CORE_PAD_GPMC_A5 =(U32 *) 0x6A003454;
volatile U32 * const CTRL_CORE_PAD_GPMC_A6 =(U32 *) 0x6A003458;
易失性 U32 * const gpio1OE =(U32 *) 0x6AE10134;
易失性 U32 * const gpio1Set =(U32 *) 0x6AE10194;
易失性 U32 * const gpio1Clr =(U32 *) 0x6AE10190;
const U32 countusec = 128;
const int delay1 = 3 * countusec;
const int delay2 = 6 * countusec;
*PWMS_ECAP_ECCTL2 =(1<<4); //设置 TSCNTSTP FREE 运行 TSCNT
asm (" CPSID FI\n");
无符号循环;
for (loop = 0;loop < 16;++loop)
{
*gpio1Clr =(1<<27); //清除 GPIO1_27
*PWMSS_ECAP_TSCNT = 0;
while (* PWMSS_ECAP_TSCNT < delay1)
{}
*gpio1Set =(1<<27); //设置 GPIO1_27
*PWMSS_ECAP_TSCNT = 0;
while (* PWMSS_ECAP_TSCNT < delay2)
{}
}
asm (" CPSIE FI\n");




