主题中讨论的其他器件:C2000WARE
你好。
我编写了一个基于 Timer1的自定义延迟函数、并尝试每20us 切换一次 GPIO 引脚。
如下图所示、切换每22-24us 进行一次。

void initTimer1(void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.CPUTIMER1=1;
EDIS;
CpuTimer1Regs.TCR.bit.TSS=1;
CpuTimer1Regs.PRD.all=0xFFFFFFFF;
CpuTimer1Regs.TPR.bit.TDDR=9;
CpuTimer1Regs.TPRH.bit.TDDRH=0;
CpuTimer1Regs.TCR.bit.TRB=1;
CpuTimer1Regs.TCR.bit.TSS=0;
}
uint64_t micros(void)
{
uint64_t time1;
time1 = time0 + (0xFFFFFFFF-CpuTimer1Regs.TIM.all);
return time1/10;
}
void delay_us(uint64_t delay)
{
uint64_t time1=micros();
while((micros()-time1)<delay);
return;
}
__interrupt void timer1ISR(void)
{
time0 += (429.5*1000000);
}
void main(void){
Device_init();
initTimer1(0xFFFFFFFF);
EALLOW;
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0x00;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x00;
GpioCtrlRegs.GPADIR.bit.GPIO0=1;
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
_disable_interrupts();
while(1)
{
delay_us(20);
GpioDataRegs.GPATOGGLE.bit.GPIO0=1;
}
}
我的代码中没有太多内容、2-4美元的开销是合理的还是其他的? 是否有任何方法可以使延迟更精确? 我之所以这样写、是因为我注意到、即使 C2000Ware 延迟函数也有类似这样的小漂移、尽管漂移不大。
如果能提供任何援助,将不胜感激。
此致、
Vishnu
详细信息:
我将 Timer1设置为以0.1us 的分辨率进行计数、并编写了自定义函数来测量代码中经过的时间(micros())、还使用 micros()函数编写了延迟函数(代码中的 delay_us())。
micros()函数只读取 TIMH:TIM 计数器、并从0xFFFFFFFF (给定周期)中减去它、因为它是递减计数器。 这将为我提供自计时器初始化以来的当前经过时间、以微秒为单位。 在计时器 ISR 中、我将维护一个变量、该变量在计时器计数器每次到达0时递增、这是已知的持续时间。 在 delay 函数中,我只是读取输入函数的时间,然后不断调用 micros()函数,直到所需的时间经过(从当前时间减去进入时间并等待它超过阈值)。
然后在 main()中,我在调用 delay_us()后切换 GPIO。
微控制器以默认的100MHz 运行。 在整个循环中、唯一定期重复的操作是寄存器读取(TIM)、两个算术运算和一个 GPIO 切换- 2-4美元的开销似乎有点过大。
此外、由于我还不关心计时器 ISR、我在禁用中断后尝试运行它、但仍然存在此问题-这排除了中间触发其他一些 ISR 的可能性。

