大学生
最后登录1970-1-1
在线时间 小时
注册时间2016-11-2
|
大神帮忙看看这个定时器2中断函数行得通吗?编译链接都没错误。但烧进板子没有实现功能。
- #include "input.h"
- u8 TIM2CH2_CAPTURE_STA; //输入捕获状态
- u16 TIM2CH2_CAPTURE_VAL;//输入捕获值
- u16 count=0;
- int NO;
- /*******************************************************************************
- * 函 数 名 : input_init
- * 函数功能 : 输入捕获配置初始化 定时器5通道2输入捕获配置
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void input_init()
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
- TIM_ICInitTypeDef TIM2_ICInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_DeInit(TIM2);
- /* 开启定时器2时钟 */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM5时钟
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update|TIM_IT_CC2); //清除中断和捕获标志位
- TIM_TimeBaseInitStructure.TIM_Period = 719; //设定计数器自动重装值
- TIM_TimeBaseInitStructure.TIM_Prescaler = 0; //以1Mhz的频率计数 一次即是1us
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
-
- TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择输入端 IC2映射到TI2上
- TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
- TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
- TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
- TIM2_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
- TIM_ICInit(TIM2, &TIM2_ICInitStructure); //初始化TIM5输入捕获通道1
-
- //中断分组初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //打开TIM5的全局中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
- NVIC_Init(&NVIC_InitStructure);
-
- TIM_Cmd(TIM2,DISABLE); //使能或者失能TIMx外设
- TIM_ITConfig(TIM2, TIM_IT_Update|TIM_IT_CC2, ENABLE ); //使能或者失能指定的TIM中断
-
- }
- void TIM2_IRQHandler() //定时器2输入捕获中断函数
- {
- if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获, TIM2CH2_CAPTURE_STA的最高位为0
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
- count++;
- if(count/10==238)
- {
- set(0);
- }
- if(count/10==512)
- {
- set(1);
- }
- if(count/10==787)
- {
- set(2);
- }
- if(count/10==1061)
- {
- set(3);
- }
- if(count/10==1335)
- {
- set(4);
- }
- if(count/10==1609)
- {
- set(5);
- }
- if(count/10==1884)
- {
- set(6);
- }
- if(count/10==2158)
- {
- set(7);
- }
- if(count/10==2707)
- {
- set(8);
- }
- if(count/10==3255)
- {
- set(9);
- }
- if(count/10==3804)
- {
- set(10);
- }
- if(count/10>3804)
- {
- set(11);
- }
-
- if(TIM2CH2_CAPTURE_STA&0X40) //已经捕获到高电平了
- {
- if((TIM2CH2_CAPTURE_STA&0x3f)==0x3f)//高电平太长了
- {
- TIM2CH2_CAPTURE_STA|=0x80; //标记成功捕获了一次
- TIM2CH2_CAPTURE_VAL=0xffff;
- }
- else
- {
- TIM2CH2_CAPTURE_STA++;
- }
- }
- }
- }
- if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) //捕获1发生捕获事件
- {
- if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
- {
- //TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
- TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2); //获得TIMx输入捕获1的值
- TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获
- }
- else
- {
- TIM2CH2_CAPTURE_STA=0; //清空
- TIM2CH2_CAPTURE_VAL=0;
- TIM_SetCounter(TIM2,0);
- //TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
- TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获
- }
- }
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
- }
- void set( int NO)
- {
- switch(NO)
- {
- case 0:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 0
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 1:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 1
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 2:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 2
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 3:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2); //step 3
- GPIO_SetBits(GPIOC,GPIO_Pin_3);
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 4:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_ResetBits(GPIOC,GPIO_Pin_3); //step 4
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 5:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_ResetBits(GPIOC,GPIO_Pin_3); //step 5
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 6:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_ResetBits(GPIOC,GPIO_Pin_3); //step 6
- GPIO_SetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 7:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_ResetBits(GPIOC,GPIO_Pin_3); //step 7
- GPIO_ResetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 8:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 8
- GPIO_ResetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 9:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 9
- GPIO_ResetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- case 10:
- {
- GPIO_SetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 10
- GPIO_ResetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- default:
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_SetBits(GPIOC,GPIO_Pin_3); //step 11
- GPIO_ResetBits(GPIOC,GPIO_Pin_4);
- break;
- }
- }
- }
复制代码
|
|