|
今天带来个问题,和群里的朋友交流下,
芯片平台:TMS320VC5509
目的:通过GPIO管脚输出精确的18Khz方波;
采用方案:采用定时器0周期中断管脚取反的方式输出一定数量的方波;
现象:示波器显示,脉冲串当中,有不同于18KHz方波的随机脉冲,单脉宽(高电平)分布为52---58uS,正常脉冲(高电平)为27.78uS.
疑惑:有同事说是有可能是中断后去处理别的事件,但程序已经简化到只有定时器中断一种,无其他中断进程存在。如果是中断响应时间
误差,那最大也不过几个时钟周期,多出来的几十个uS,在哪里去了呢?
请各位同仁帮助分析分析。
main:
{
CSL_init();
GPIO_RSET(IODIR,0xFF);
GPIO_pinWrite (GPIO_PIN6,0); /* Initialize CSL library */
PLL_config(&myConfig_200M); //配置成200M
for(pll_count = 0; pll_count <= 2000; pll_count++); //等待锁相环锁定
IRQ_setVecs((Uint32)(&VECSTART)); /* Set IVPH/IVPD to start of interrupt vector table */
mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET); //打开定时器0
eventId0 = TIMER_getEventId(mhTimer0);
IRQ_clear(eventId0); //清定时器中断标志
IRQ_plug(eventId0,&timer0Isr); //指定定时器中断程序路径
timer0_cnt = 5555;
TIMER_FSETH (mhTimer0,TCR,ARB,1); //设置为自动装载模式
TIMER_FSETH (mhTimer0,TCR,TLB,1); //定时器周期寄存器装载
TIMER_FSETH (mhTimer0,PRSC,TDDR,0);
TIMER_RSETH (mhTimer0,PRD,timer0_cnt);
TIMER_FSETH (mhTimer0,TCR,TLB,0);
IRQ_enable(eventId0); //打开TIMER0定时中断
IRQ_globalEnable(); //打开全局中断
TIMER_start(mhTimer0); //开始计时
timer0_cnt = 5555; //趁还为计时完毕而未到定时中断装载下一个值
TIMER_FSETH (mhTimer0,PRSC,TDDR,0);
TIMER_RSETH (mhTimer0,PRD,timer0_cnt);
while((zero_cross_cnt > 0)==1) //中断一次,脉冲数量减一,脉冲未发完毕,在此等待中断
{
}
TIMER_stop(mhTimer0); //脉冲发送完毕后,停止计时器
IRQ_disable(eventId0); //定时器中断禁止
TIMER_close(mhTimer0); //关闭定时器
}
interrupt void timer0Isr(void)
interrupt void timer0Isr(void)
{
if(GPIO_pinRead (GPIO_PIN6)==1) //管脚GPIO6取反
{
GPIO_pinWrite (GPIO_PIN6,0);
}
else
{
GPIO_pinWrite (GPIO_PIN6,1);
}
zero_cross_cnt--; //脉冲数量减1
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|