下面是相关代码
static int oldCount; //上一次计数器的值
static int pos; //旋转方向
static int leftCount,rightCount;
extern void CountTimerIRQ(void);
extern void CountExtIRQ(void);
void InitCount()
{
PORTC_PCR5=PORT_PCR_MUX(4);
PORTE_PCR17=PORT_PCR_MUX(6);
GPIOC_PDDR&=~((1<<5)|(1<<6)|(1<<7));
GPIOE_PDDR&=~(1<<17);
SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;
LPTMR0_PSR=LPTMR_PSR_PCS(1)|LPTMR_PSR_PBYP_MASK;
LPTMR0_CSR=LPTMR_CSR_TPS(2)|LPTMR_CSR_TFC_MASK
| LPTMR_CSR_TMS_MASK | LPTMR_CSR_TEN_MASK;
oldCount=LPTMR0_CNR;
pos=0;
leftCount=0;
rightCount=0;
EnableIRQ(89); //开外部中断
pit_init(1,SYSCLK/1000,10); //用定时器来实现交替测速
}
int GetLeftSpeed()
{
int ret;
ret=leftCount;
ASSERT(ret<200 && ret>-200);
return ret;
}
int GetRightSpeed()
{
return rightCount;
}
void CountTimerIRQ(void) //定时器中断
{
int count;
PIT_TCTRL1 = ~(PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK);
PIT_T标志寄存器1 = PIT_T标志寄存器_TIF_MASK;
PORTC_PCR7&=~PORT_PCR_IRQC_MASK;
count=LPTMR0_CNR;
count=(count+0xffff-oldCount)%0xffff;
leftCount=count*pos;
pos=0;
PORTC_ISFR=0xFFFFFFFF;
PORTC_PCR7=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0x9)
|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;
oldCount=LPTMR0_CNR;
PIT_TCTRL1=(PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK);
}
void CountExtIRQ(void) //外部中断,PORTC的5脚
{
PORTC_PCR5=PORT_PCR_MUX(1)|PORT_PCR_PE_MASK|PORT_PCR_PS_MASK;
if(GPIOC_PDIR&(1<<5))
pos=-1;
else
pos=1;
PORTC_PCR5=PORT_PCR_MUX(4);
PORTC_PCR7&=~PORT_PCR_IRQC_MASK;
PORTC_ISFR=0xFFFFFFFF;
}
int main(void)
{
volatile int ret;
int i=0;
InitHard(); //包含InitCount
while(1)
{
ret=GetLeftSpeed();
Delay(20);
i=(i+1)%50;
if(i==0)
LightLed(3,0);
else if(i==25)
LightLed(3,1);
}
return 0;
}
|