野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9637|回复: 1

用一个定时器实现中断

[复制链接]
发表于 2017-5-23 15:05:56 | 显示全部楼层 |阅读模式
大神帮忙看看这个定时器2中断函数行得通吗?编译链接都没错误。但烧进板子没有实现功能。
  1. #include "input.h"
  2. u8 TIM2CH2_CAPTURE_STA; //输入捕获状态
  3. u16 TIM2CH2_CAPTURE_VAL;//输入捕获值
  4. u16 count=0;
  5. int NO;
  6. /*******************************************************************************
  7. * 函 数 名         : input_init
  8. * 函数功能                   : 输入捕获配置初始化           定时器5通道2输入捕获配置
  9. * 输    入         : 无
  10. * 输    出         : 无
  11. *******************************************************************************/
  12. void input_init()
  13. {
  14.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
  15.         TIM_ICInitTypeDef TIM2_ICInitStructure;

  16.         NVIC_InitTypeDef NVIC_InitStructure;
  17.         TIM_DeInit(TIM2);

  18.         /* 开启定时器2时钟 */
  19.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);         //使能TIM5时钟

  20.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update|TIM_IT_CC2); //清除中断和捕获标志位

  21.         TIM_TimeBaseInitStructure.TIM_Period = 719;         //设定计数器自动重装值        
  22.         TIM_TimeBaseInitStructure.TIM_Prescaler = 0;   //以1Mhz的频率计数 一次即是1us
  23.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;          //设置时钟分割:TDTS = Tck_tim
  24.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;         //TIM向上计数模式
  25.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  26.        
  27.         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择输入端 IC2映射到TI2上
  28.         TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
  29.         TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
  30.         TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
  31.         TIM2_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
  32.         TIM_ICInit(TIM2, &TIM2_ICInitStructure); //初始化TIM5输入捕获通道1       
  33.        
  34.         //中断分组初始化
  35.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  36.         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;        //打开TIM5的全局中断
  37.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;        //抢占优先级为0
  38.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1
  39.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能
  40.         NVIC_Init(&NVIC_InitStructure);
  41.        
  42.         TIM_Cmd(TIM2,DISABLE); //使能或者失能TIMx外设
  43.         TIM_ITConfig(TIM2, TIM_IT_Update|TIM_IT_CC2, ENABLE );        //使能或者失能指定的TIM中断
  44.                
  45. }
  46. void TIM2_IRQHandler()          //定时器2输入捕获中断函数
  47. {
  48.         if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获,    TIM2CH2_CAPTURE_STA的最高位为0
  49.         {
  50.                 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)       
  51.                 {
  52.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  53.           count++;         
  54.                 if(count/10==238)
  55.                 {
  56.                         set(0);
  57.                 }
  58.                 if(count/10==512)
  59.                 {
  60.                 set(1);
  61.                 }
  62.                 if(count/10==787)
  63.                 {
  64.                         set(2);
  65.                 }
  66.                         if(count/10==1061)
  67.                 {
  68.                         set(3);
  69.                 }
  70.                 if(count/10==1335)
  71.                 {
  72.                 set(4);
  73.                 }
  74.                 if(count/10==1609)
  75.                 {
  76.                         set(5);
  77.                 }
  78.                         if(count/10==1884)
  79.                 {
  80.                         set(6);
  81.                 }
  82.                 if(count/10==2158)
  83.                 {
  84.                 set(7);
  85.                 }
  86.                 if(count/10==2707)
  87.                 {
  88.                         set(8);
  89.                 }
  90.                         if(count/10==3255)
  91.                 {
  92.                         set(9);
  93.                 }
  94.                 if(count/10==3804)
  95.                 {
  96.                 set(10);
  97.                 }
  98.                 if(count/10>3804)
  99.                 {
  100.                         set(11);
  101.                 }
  102.                
  103.                         if(TIM2CH2_CAPTURE_STA&0X40) //已经捕获到高电平了         
  104.                         {
  105.                                 if((TIM2CH2_CAPTURE_STA&0x3f)==0x3f)//高电平太长了
  106.                                 {       
  107.                                         TIM2CH2_CAPTURE_STA|=0x80;        //标记成功捕获了一次
  108.                                         TIM2CH2_CAPTURE_VAL=0xffff;               
  109.                                 }
  110.                                 else
  111.                                 {
  112.                                         TIM2CH2_CAPTURE_STA++;       
  113.                                 }
  114.                         }
  115.                 }       
  116.         }
  117.         if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) //捕获1发生捕获事件
  118.         {
  119.                 if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
  120.                 {
  121.                         //TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
  122.                         TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2); //获得TIMx输入捕获1的值
  123.                         TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获       
  124.                 }
  125.                 else
  126.                 {
  127.                         TIM2CH2_CAPTURE_STA=0; //清空
  128.                         TIM2CH2_CAPTURE_VAL=0;
  129.                         TIM_SetCounter(TIM2,0);
  130.                         //TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
  131.                         TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //设置为下降沿捕获
  132.                 }       
  133.         }
  134.         TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
  135. }

  136. void set( int NO)
  137.   {
  138.   switch(NO)
  139.   {
  140.          case 0:
  141.   {                       
  142.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  143.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  144.   GPIO_SetBits(GPIOC,GPIO_Pin_3);    //step 0
  145.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  146.   break;
  147.   }
  148.   case 1:
  149.   {
  150.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  151.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  152.   GPIO_SetBits(GPIOC,GPIO_Pin_3);      //step 1
  153.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  154.   break;
  155.   }
  156.   case 2:
  157.   {
  158.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  159.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  160.   GPIO_SetBits(GPIOC,GPIO_Pin_3);      //step  2
  161.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  162.   break;
  163.   }
  164.   case 3:
  165.   {
  166.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  167.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);      //step  3
  168.   GPIO_SetBits(GPIOC,GPIO_Pin_3);
  169.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  170.   break;
  171.   }
  172.   case 4:
  173.   {
  174.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  175.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  176.   GPIO_ResetBits(GPIOC,GPIO_Pin_3);     //step  4
  177.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  178.   break;
  179.   }
  180.   case 5:
  181.   {
  182.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  183.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  184.   GPIO_ResetBits(GPIOC,GPIO_Pin_3);    //step  5
  185.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  186.   break;
  187.   }
  188.          case 6:
  189.          {
  190.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  191.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  192.   GPIO_ResetBits(GPIOC,GPIO_Pin_3);    //step 6
  193.   GPIO_SetBits(GPIOC,GPIO_Pin_4);
  194.         break;
  195.          }
  196.          case 7:
  197.          {
  198.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  199.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  200.   GPIO_ResetBits(GPIOC,GPIO_Pin_3);   //step 7
  201.   GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  202.    break;
  203.          }
  204.          case 8:
  205.          {
  206.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  207.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  208.   GPIO_SetBits(GPIOC,GPIO_Pin_3);    //step 8
  209.   GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  210.    break;
  211.          }
  212.          case 9:
  213.          {
  214.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  215.   GPIO_SetBits(GPIOC,GPIO_Pin_2);
  216.   GPIO_SetBits(GPIOC,GPIO_Pin_3);   //step 9
  217.   GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  218.    break;
  219.          }
  220.          case 10:
  221.          {
  222.   GPIO_SetBits(GPIOC,GPIO_Pin_1);
  223.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  224.   GPIO_SetBits(GPIOC,GPIO_Pin_3);   //step 10
  225.   GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  226.         break;
  227.          }
  228.   default:
  229.   {
  230.   GPIO_ResetBits(GPIOC,GPIO_Pin_1);
  231.   GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  232.   GPIO_SetBits(GPIOC,GPIO_Pin_3);    //step 11
  233.   GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  234.   break;
  235.   }
  236. }
  237. }
复制代码


回复

使用道具 举报

 楼主| 发表于 2017-5-23 15:06:36 | 显示全部楼层
谢谢各位大哥们。您就给看看
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 11:56 , Processed in 0.045780 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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