[mw_shl_code=c,true]#include "stm32f10x.h"
#include <usart.h>
/************************************************
ALIENTEK 战舰STM32F103开发板实验0
工程模板
注意,这是手册中的新建工程章节使用的main文件
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
u8 TIM5CH2_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH2_CAPTURE_VAL; //输入捕获值
u16 temp_CH1;
u16 temp_CH2;
TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM5_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器3时钟*****(定时器3的时钟是挂靠在APB1总线时钟上面的)*******
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA外设***要用到GPIO口之前必须要使能GPIO的时钟***
//初始化GPIOA.0
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);
//初始化TIM5参数
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
//初始化TIM5 输入捕获通道1
TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1|TIM_Channel_2;//选择输入端IC1映射到TI1.
TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM5_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM5_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM5,&TIM5_ICInitStructure);
//初始化化中断优先级
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2,ENABLE);
TIM_Cmd(TIM5,DISABLE);
}
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0) //没有捕获完成
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
if(TIM5CH1_CAPTURE_STA&0x40) //已经捕获到高电平
{
if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f)
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
if((TIM5CH2_CAPTURE_STA&0X80)==0) //没有捕获完成
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
if(TIM5CH2_CAPTURE_STA&0x40) //已经捕获到高电平
{
if((TIM5CH2_CAPTURE_STA&0x3f)==0x3f)
{
TIM5CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH2_CAPTURE_VAL=0XFFFF;
}else TIM5CH2_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
{
if(TIM5CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH2_CAPTURE_VAL=TIM_GetCapture2(TIM5); //
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
TIM5CH2_CAPTURE_STA=0; //清空
TIM5CH2_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
void capture(u8 temp,u8 open)
{
if(open==ENABLE)
{
TIM_Cmd(TIM5,ENABLE);
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一个脉冲信号
{
temp_CH1=TIM5CH1_CAPTURE_STA&0X3F;
temp_CH1*=65536;//溢出时间总和
temp_CH1+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
printf("HIGH:%d us\r\n",temp_CH1);//打印总的高点平时间
TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
};
if(TIM5CH2_CAPTURE_STA&0X80)//成功捕获到了一个脉冲信号
{
temp_CH2=TIM5CH1_CAPTURE_STA&0X3F;
temp_CH2*=65536;//溢出时间总和
temp_CH2+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
printf("HIGH:%d us\r\n",temp_CH1);//打印总的高点平时间
TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
};
}
}
int main(void)
{
while(1)
{
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
capture(0,ENABLE);
uart_init(115200);
}
}
[/mw_shl_code]
|