STM8S903K的片子做红外遥控接收,用I/O口的中断加定时器测低电平脉冲宽度(项目限制,不能用捕捉),I/O口设定是上升和下降沿中断,下降沿清零并启动定时器,上升沿读取
发现测量的脉宽都一样,并且不准确。
代码如下:
void IRInit(void) // 初始化
{
TIM2->PSCR = 2; // 4MHz
TIM2->CR1 = 0x03; /*!< control register 1 */
EXTI->CR1 = 0x30; /*!< External Interrupt Control Register for PORTA to PORTD */
GPIO_Init(GPIOC, 0x10 , GPIO_MODE_IN_PU_IT);
}
@interrupt void INT1_Exception (void) //ISR
{
static INT16U tcnt1bk, tcnt2pre,tcnt2,tcnt2bk;
static INT16U count = 0;
INT8U i;
static INT16U bk[32];
{
ucCnt++; // 这个变量的计数来看,中断次数是正确的
#if 1
if(IRPort) // PC_IDR4
{
tcnt2bk = TIM2->CNTRH;
tcnt2bk <<= 8;
tcnt2bk |= TIM2->CNTRL;
if(count<32)
{
bk[count] = tcnt2bk ; // 这里除了记录的头码是正确的之外,其他都基本差不多,且不准确
count++;
}
}
else
{
TIM2->CR1 = 0;
TIM2->CNTRH = 0;
TIM2->CNTRL = 0;
TIM2->CR1 = 0x03; // 这里改为TIM2->EGR |= 0X01;也是一样结果
}
#endif
}
}
我看ST的触摸库也是用TIM2来测量时间,只是读取是用ASM读取,并且不是在中断读取,这个会有影响吗?
以前也用过ST的片子的IO口来模拟SPI总线,也出现诸多问题
|