我只把TIM5改成了TIM2的通道2 ,求大神指导!感激不尽!
void TIM2_Cap_Init(u16 arr, u16 psc)
{
RCC->APB1ENR|=1<<0; //开启TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000080; //配置PA1为输入
GPIOA->ODR|=0<<1; //配置PA1为下拉
TIM2->ARR=arr; //设置重装载值
TIM2->
SC=psc; //设置预分频器
TIM2->CCMR1|=1<<8; //CC2S=01 选择输入端ic2映射到TI1上
TIM2->CCMR1|=0<<12; //IC1F=0000 配置输入滤波器 不滤波
TIM2->CCMR1|=0<<10; //IC2PS=00 不预分频
TIM2->CCER|=1<<5; //上升沿捕获;
TIM2->CCER|=1<<4; //允许捕获;
TIM2->DIER|=1<<2; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=0X01; //使能计数器允许计数
MY_NVIC_Init(1,0,TIM2_IRQChannel,2);//抢庄优先级2,子优先级0,组2
}
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0X01)//溢出
{
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if(tsr&0x02)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=TIM2->CCR1; //获取当前的捕获值.
TIM2->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM2->CNT=0; //计数器清空
TIM2->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
}
}
}
TIM2->SR=0;//清除中断标志位
}
int main()
{
u32 temp=0;
Stm32_Clock_Init(9);
uart_init(72,9600);
//delay_init(72);
PWM_Init(999,71);
//TIM2_init(0xffff,71);
TIM2_Cap_Init(999, 71);
while(1)
{
TIM3->CCR2=600;//tim3比较寄存器的值
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间
printf("HIGH:%d us
",temp); //打印总的高点平时间
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}
}
一周热门 更多>