tim2 ch3通道 初始化
void TIMER2_Catch_Init(void)
{
TIM2_CNTRH = 0x00;//清零计数器高8位
TIM2_CNTRL = 0x00;//清零计数器低8位
TIM2_PSCR = 0x10;//计数器时钟分频低8位16分频
TIM2_CCER2_CC3E=0;//关闭捕获功能
TIM2_CCMR3 =0x01;//滤波为0,分频为0,直接接到端口上
TIM2_CCER2_CC3P=1;//上升沿时发生捕获
TIM2_IER_CC3IE=1;//开启捕获中断
TIM2_CCER2_CC3E=1;//使能捕获功能
TIM2_CR1_CEN=1;//开启计数
}
中断函数:
u16 vsync_cap_data_old,vsync_cap_data_new,vsync_period;
u8 isCaptureOver;
#pragma vector=0x10
__interrupt void TIM2_CAP_COM_IRQHandler(void)
{
if(TIM2_SR1_CC3IF)
{
TIM2_SR1_CC3IF = 0;//清除中断标志位
if(vsync_cap_data_old == 0x00)
{//第一次捕获中断来临
vsync_cap_data_old = TIM2_CCR3H;//先读取高8位数据
vsync_cap_data_old = (unsigned int)(vsync_cap_data_old<<8) + TIM2_CCR3L;//再读取低8位数据
}
else
{
//第二次捕获中断来临
vsync_cap_data_new = TIM2_CCR3H;//先读取高8位数据
vsync_cap_data_new = (unsigned int)(vsync_cap_data_new<<8) + TIM2_CCR3L;//再读取低8位数据
TIM2_IER_CC3IE=0;//关闭捕获中断
TIM2_CR1_CEN=0;//关闭计数
if(vsync_cap_data_new > vsync_cap_data_old)
vsync_period = (vsync_cap_data_new - vsync_cap_data_old);
else
vsync_period = 0xFFFF + vsync_cap_data_new - vsync_cap_data_old;
vsync_cap_data_old = 0x00;
isCaptureOver = 1;
}
}
}
主函数:
if(isCaptureOver == 1)
{ //如果捕获完成则对数据进行处理
TIM2_CNTRH = 0x00;//清零计数器高8位
TIM2_CNTRL = 0x00;//清零计数器低8位
TIM2_IER_CC3IE=1;//开启捕获中断
TIM2_CR1_CEN=1;//开启计数
UART1_Send_nBit(vsync_period);
isCaptureOver =0;
}
PA对应管脚要配置成定时器输入