查看: 583|回复: 5
打印 上一主题 下一主题

STM32寄存器之输入捕获

[复制链接] qrcode

66

主题

492

帖子

924

积分

高级会员

Rank: 4

积分
924
楼主
发表于 2016-1-4 02:19 PM | 显示全部楼层
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0清除之前设置
GPIOA->CRL|=0X00000008; //PA0输入
GPIOA->ODR|=0<<0; //PA0下拉
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1|=1<<0; //CC1S=01选择输入端IC1映射到TI1上
TIM2->CCMR1|=1<<4; //IC1F=0001配置滤波器以Fck_int采样,2个时间后有效
TIM2->CCMR1|=0<<10; //IC2PS=00配置输入分频,不分频
TIM2->CCER|=0<<1; //CC1P=0上升沿捕获
TIM2->CCER|=1<<0; //CCIE=1允许捕获计数器的值到捕获寄存器中
TIM2->DIER|=1<<1; //允许捕获中断
TIM2->DIER|=1<<0; //允许更新中断
TIM2->CR1|=0X01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQn,2); //抢占2,子优先级0,组2
}
int main(void)
{

u32 temp=0;
u8  temp1;
Stm32_Clock_Init(9);    //72MHz
uart_init(72,9600);
  delay(1000);
LED_Init();
KEY_Init();

TIM1_PWM_Init(899,0);
TIM2_Cap_Init(0xffff,72-1); //以1MHz的频率计数
while(1)
{
    
delay(80);
LED0_PWM_VAL++;
if(LED0_PWM_VAL==300)LED0_PWM_VAL=0;
if(TIM2CH1_CAPTURE_STA&0X80) //成功捕获到了一次高电平
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL; //得到总的高电平时间
Uart1_SendString("HIGH:",5);
temp1=(u8)(temp/100000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100000/10000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10000/1000+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%1000/100+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%100/10+0x30);
Uart1_SendByte(temp1);
temp1=(u8)(temp%10+0x30);
Uart1_SendByte(temp1);
Uart1_SendString(" usrn",7);
TIM2CH1_CAPTURE_STA=0; //开启下一次捕获
}
}
}
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM2CH1_CAPTURE_STA&0X80)==0) //还未成功捕获
{
if(tsr&0x01) //溢出
{
if(TIM2CH1_CAPTURE_STA&0X40) //已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0xffff;
}else TIM2CH1_CAPTURE_STA++;

}
}
if(tsr&0x02) //捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM2CH1_CAPTURE_VAL=TIM2->CCR1; //获取当前的捕获值
TIM2->CCER&=~(1<<1); //CC1P=0设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA=0X40; //标记捕获到了上升沿
TIM2->CNT=0; //计数器清空
TIM2->CCER|=1<<1; //CC1P=1设置为下降沿捕获
}
}
}
TIM2->SR=0; //清除中断标志位
}
这回看懂了吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表