您好!
在数字信号输出(GPIO44)被置位后、控制器应该至少40微秒检查一个数字信号输入(GPIO40)。
在运行时间内、大部分时间工作正常、也就是说、GPIO40在 GPIO44被置位40微秒后被测试。 但是、在 GPIO44置1后仅8微秒左右才对 GPIO40进行测试。 我正在尝试了解为什么会发生这种情况、并解决该问题。
代码结构:
代码被加载到闪存并从 RAM 运行。
CPU 定时器1用作20微秒的时基、其溢出标志被轮询以推进相关计数器。
一个可能相关的问题:
Timer1被重新加载(相同的20微秒周期)但在重新加载命令之前不会停止。 这是否与问题有关? 如果恰好 在指示计时器重新加载(CpuTimer1Regs.TCR.all = 0x8C20;)的时间(时钟)时设置计时器溢出标志(计时器达到零)、则溢出标志是否仍保持设置?
随附了一个非常简化和简化的代码、用于演示问题发生的位置。
非常感谢您的帮助。
多维尔
#include "F28x_Project.h"
//====================================================================
// Functions prototypes
//====================================================================
void ConfigGpio(void);
void Timer1_counters_increment(void);
void function1(void);
//====================================================================
// Variables
//====================================================================
Uint32 Counter;
Uint32 Flag;
//====================================================================
// main()
//====================================================================
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
InitGpio();
ConfigGpio();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimers();
EINT;
ERTM;
ConfigCpuTimer(&CpuTimer1, 150, 20u); // Timer1 serves as 20 microseconds time base
CpuTimer1Regs.TCR.all = 0x8C00;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;
while(1)
{
function1();
}
} // END of main()
//====================================================================
// Functions definitions
//====================================================================
void ConfigGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAGMUX1.all &= ~0xf0f3cfff;
GpioCtrlRegs.GPAMUX1.all &= ~0xf0f3cfff;
GpioCtrlRegs.GPBGMUX1.all &= ~0x0f0fffff;
GpioCtrlRegs.GPBMUX1.all &= ~0x0f0fffff;
GpioCtrlRegs.GPAGMUX1.all |= 0x00000000;
GpioCtrlRegs.GPAMUX1.all |= 0x00000500;
GpioCtrlRegs.GPBGMUX1.all |= 0x00000000;
GpioCtrlRegs.GPBMUX1.all |= 0x00000005;
GpioCtrlRegs.GPAPUD.all = 0xC4FF0D3F;
GpioCtrlRegs.GPBPUD.all = 0x00003C84;
GpioCtrlRegs.GPACTRL.all = 0x1E004B4B;
GpioCtrlRegs.GPBCTRL.all = 0x1E1E1E1E;
GpioCtrlRegs.GPAQSEL1.all = 0xA0008000;
GpioCtrlRegs.GPBQSEL1.all = 0x000A2A8F;
GpioDataRegs.GPADAT.all = 0x00000000;
GpioDataRegs.GPBDAT.all = 0x00000000;
GpioCtrlRegs.GPAODR.all = 0x00000000;
GpioCtrlRegs.GPBODR.all = 0x00000003;
GpioCtrlRegs.GPADIR.all = 0xC4FF0D0F;
GpioCtrlRegs.GPBDIR.all = 0x00003084;
EDIS;
}
void Timer1_counters_increment(void)
{
CpuTimer1Regs.TCR.all = 0x8C00; // Resets CPU-Timer 1 overflow flag. Timer runs free
Counter++;
}
void function1(void)
{
if(Flag == 0)
{
GpioDataRegs.GPBSET.bit.GPIO44 = 1;
CpuTimer1Regs.TCR.all = 0x8C20; //Clear timer interrupt flag and reload timer
Counter = 0; //Reset counter
while (Counter < 2) // count 40 microseconds after GPIO44 is set
{
if (CpuTimer1Regs.TCR.bit.TIF)
{
Timer1_counters_increment();
}
}
Flag = 1; // Flag that 40 microseconds were counted
if (GpioDataRegs.GPBDAT.bit.GPIO40) // After 40 microseconds GPIO40 is tested
{
GpioDataRegs.GPASET.bit.GPIO0 = 1; // Set GPIO0 to indicate that GPIO44 is high
}
}
}




