智能车制作
标题:
K60 PIT模块
[打印本页]
作者:
daiminsdu
时间:
2013-1-21 22:35
标题:
K60 PIT模块
我写了个PIT计数出发中断的程序,发现,计数器只进一次中断,但是在ISR中,重新加载计数值就正常了,请问是什么原因?
文档上不是讲pit工作方式是计数到0产生一个中断并且重新加载计数值,又开始计数的吗?
作者:
daiminsdu
时间:
2013-1-22 12:30
求回复啊
作者:
GordonFreeman
时间:
2013-1-23 09:33
进入PIT中断服务函数后要清除中断标志位才能再次进入中端
作者:
daiminsdu
时间:
2013-1-23 13:21
GordonFreeman 发表于 2013-1-23 09:33
进入PIT中断服务函数后要清除中断标志位才能再次进入中端
谢谢您的回复我在中断服务子程序里清过中断了,以下是我PIT初始化程序和ISR程序,请您帮我看一下:
初始化程序:
void pit_init(PITn pitn, u32 cnt)
{
//PIT 用的是 Bus Clock 总线频率
//溢出计数 = 总线频率 * 时间
/* 开启时钟*/
SIM_SCGC6 |= SIM_SCGC6_PIT_MASK; //使能PIT时钟
/* PIT模块控制 PIT Module Control Register (PIT_MCR) */
PIT_MCR &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK ); //使能PIT定时器时钟 ,调试模式下继续
switch(pitn)
{
case PIT0:
{
PIT_LDVAL0 = cnt; //设置溢出中断时间
PIT_TFLG0=0x1; //清中断标志位
PIT_TCTRL0 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
enable_irq(0 + 68); //开接收引脚的IRQ中断
}
break;
case PIT1:
{
PIT_LDVAL1 = cnt; //设置溢出中断时间
PIT_TFLG1=0x1; //清中断标志位
PIT_TCTRL1 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
enable_irq(1 + 68); //开接收引脚的IRQ中断
}
break;
case PIT2:
{
PIT_LDVAL2 = cnt; //设置溢出中断时间
PIT_TFLG2=0x1; //清中断标志位
PIT_TCTRL2 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
enable_irq(2 + 68); //开接收引脚的IRQ中断
}
break;
case PIT3:
{
PIT_LDVAL3 = cnt; //设置溢出中断时间
PIT_TFLG3=0x1; //清中断标志位
PIT_TCTRL3 |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定时器,并开PITn中断
enable_irq(3 + 68); //开接收引脚的IRQ中断
}
break;
}
}
ISR程序:
void pit0_isr(void)
{
PIT_TFLG0=0x1; //Clear the flag
GPIOA_PCOR|=GPIO_PCOR_PTCO(GPIO_PIN(28)); //Lighten yellow,E2
delay();
GPIOA_PCOR|=GPIO_PCOR_PTCO(GPIO_PIN(29)); //Lighten green,E3
delay();
j++;
}
作者:
liming77
时间:
2016-1-17 20:29
需要使能中断优先级
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2