电路板应用中出现问题,STM8S105,运用定时器的通道1和通道4,设置成为下降沿输入捕获,定时器周期1.5ms。但目前出现问题,通道1可以进入中断,通道4却不可以。输入信号为脉冲信号,周期6ms,占空比75%。输出为溢出中断,完成一定功能。怀疑是不是两通道相互有影响?1.5ms周期过短?还是其他?大神们求助。
void Init_tiM1(void)
{
TIM1_CR1=0x00; //关闭定时器
TIM1_IER=0x00; //关闭中断
TIM1_PSCRH=0x00; //将16M晶振预分频为1M,计数器精度1us
TIM1_PSCRL=0x0f;
TIM1_CCMR1=0x31; //CC1通道输入,IC1映射在TI1FP1,采样频率N=4
TIM1_CCMR4=0x31; //CC4通道输入,IC1映射在TI3FP4,采样频率N=4
TIM1_CCER1=0x03; //OC1下降沿捕捉,捕获使能;OC2输出到对应引脚,高电平有效
TIM1_CCER2=0x30; //OC4下降沿捕捉,捕获使能;OC3输出到对应引脚,高电平有效
TIM1_ARRH=0x05; //设置自动重装载寄存器(十进制6000)
TIM1_ARRL=0xdc;
TIM1_CNTRH=0x00; //设置计数器寄存器(十进制0)
TIM1_CNTRL=0x00;
TIM1_BKR=0x80; //OC,OCN使能
TIM1_EGR=0x13; //产生更新事件
TIM1_IER=0x13; //允许捕获比较1,2,3,4中断,允许更新中断
TIM1_CR1=0x01; //开启定时器
}
@far @interrupt void TIM1_CC_IRQHandler(void)
{
//******一路的捕捉控制 输入为TIM1_CH1,PC1 ******
if((TIM1_SR1&0x02)==0x02) //判断是否为TIM1_CH1捕获
{
CurrentT1Value1=TIM1_CCR1H;
CurrentT1Value1=CurrentT1Value1<<8;
CurrentT1Value1+=TIM1_CCR1L;
TIM1_SR1&=0xfd; //清除中断标志
TIM1_SR2&=0xfd; //清除中断标志
m3++; //进入中断次数
if((TIM1_CCER1&0x02)==0x02) //再次判断捕获发生在下降沿
{
if((PC_IDR&0x02)==0x02) //滤掉小毛刺
{
return;
}
TIM1_CCER1&=0xfd; //捕捉发生在TI1F的高电平或上升沿
FallingValue1=CurrentT1Value1; //记下一路第一次捕捉下降沿值
}
else //上升沿
{
if((PC_IDR&0x02)==0x00) //滤掉小毛刺
{
return;
}
TIM1_CCER1|=0x03; //下降沿捕获
RisingValue1=CurrentT1Value1;//记下一路第一次捕捉上升沿值
Pulse1=RisingValue1-FallingValue1;
}
}
return;
//******二路的捕捉控制 输入TIM1_CH4,PD7
if((TIM1_SR1&0x10)==0x10) //判断是否为TIM1_CH4捕获
{
CurrentT1Value2=TIM1_CCR4H;
CurrentT1Value2=CurrentT1Value2<<8;
CurrentT1Value2+=TIM1_CCR4L;
TIM1_SR1&=0xef; //清除中断标志 输入清除
TIM1_SR2&=0xef; //清除中断标志 输入清除
m2++;
if((TIM1_CCER2&0x20)==0x20) //再次判断捕获发生在下降沿
{
if((PD_IDR&0x80)==0x80) //滤掉小毛刺
{
return;
}
TIM1_CCER2&=0xdf; //捕捉发生在TI1F的高电平或上升沿
FallingValue2=CurrentT1Value2; //记下二缸捕捉下降沿值
}
else //上升沿
{
if((PD_IDR&0x80)==0x00) //滤掉小毛刺
{
return;
}
TIM1_CCER2|=0x30; //下降沿捕获
RisingValue2=CurrentT1Value2; //记下二路捕捉上升沿值
Pulse2=RisingValue2-FallingValue2;
}
}
return;
}
return;
}
//TIM1溢出中断
@far @Interrupt void TIM1_OVF_IRQHandler(void)
{
v++; //另有用
TIM1_SR1&=0xfe; //清除溢出标志位
return;
}
void main(void)
{
Init_TIM1();
CLK_SWR=0xb4;
CLK_PCKENR1=0xe8;
CLK_PCKENR2=0x0c;
CLK_CKDIVR=0x00; //CPU 16M
CLK_SWCR|=0x02;
_asm("rim"); //开启全局中断
while (1)
{
}
}
一周热门 更多>