初级会员

- 积分
- 66
- 金钱
- 66
- 注册时间
- 2013-11-30
- 在线时间
- 12 小时
|
发表于 2017-7-19 17:46:11
|
显示全部楼层
本帖最后由 海上浮萍 于 2017-7-20 13:49 编辑
//定时器2通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2 时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFF0000; //PA0 清除之前设置
GPIOA->CRL|=0X00008888; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM2->CCMR1|=1<<8; //CC2S=01 选择输入端 IC2映射到TI2上
TIM2->CCMR2|=1<<0; //CC3S=01 选择输入端 IC3映射到TI3上
TIM2->CCMR2|=1<<8; //CC4S=01 选择输入端 IC4映射到TI4上
TIM2->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM2->CCER|=0<<5; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<4; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM2->CCER|=0<<9; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<8; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM2->CCER|=0<<13; //CC1P=0 上升沿捕获
TIM2->CCER|=1<<12; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=0x0f<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=0x01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQChannel,2);//抢占2,子优先级0,组2
}
TIM_Cap_Dat_T TIM_Cap_Dat;
u32 RGB[18];//颜射传感器数据
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if(tsr&0X01)//溢出中断
{
TIM_Cap_Dat.cap_time[0] += 65536;
TIM_Cap_Dat.cap_time[1] += 65536;
TIM_Cap_Dat.cap_time[2] += 65536;
TIM_Cap_Dat.cap_time[3] += 65536;
}
if(tsr&(1<<1))//捕获1发生捕获事件
{
if(TIM_Cap_Dat.state.bit.cap1_state == 0)//判断是否是第一次捕获到高电平
{
}
else//第二次捕获到上升延
{
}
}
if(tsr&(1<<2))//捕获2发生捕获事件
{
if(TIM_Cap_Dat.state.bit.cap2_state == 0)//判断是否是第一次捕获到高电平
{
}
else//第二次捕获到上升延
{
}
}
if(tsr&(1<<3))//捕获3发生捕获事件
{
if(TIM_Cap_Dat.state.bit.cap3_state == 0)//判断是否是第一次捕获到高电平
{
}
else//第二次捕获到上升延
{
}
}
if(tsr&(1<<4))//捕获4发生捕获事件
{
if(TIM_Cap_Dat.state.bit.cap4_state == 0)//判断是否是第一次捕获到高电平
{
}
else//第二次捕获到上升延
{
}
}
TIM2->SR=0;//清除中断标志位
}
|
|