找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2096|回复: 0
收起左侧

STM32双定时器TIM2和TIM4+8个HC-SR04超声波源程序

[复制链接]
ID:259935 发表于 2020-2-25 23:31 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include "timer.h"
  2. TIM_ICInitTypeDef  TIM2_ICInitStructure;
  3. TIM_ICInitTypeDef  TIM4_ICInitStructure;
  4. void TIM2_Cap_Init(u16 arr,u16 psc)
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  8.   NVIC_InitTypeDef NVIC_InitStructure;
  9.         
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能TIM2时钟
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
  12.         
  13.         //TIM2的2个通道
  14.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  下拉
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  17.         GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  18.         
  19.         
  20.         TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  21.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  24.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  25.         
  26.         //初始化TIM2通道1输入捕获参数
  27.         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  28.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  29.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  30.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  31.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  32.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  33.         //初始化TIM2通道1输入捕获参数
  34.         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         选择输入端 IC1映射到TI1上
  35.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  36.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  37.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  38.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  39.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  40.                
  41.                         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01         选择输入端 IC1映射到TI1上
  42.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  43.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  44.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  45.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  46.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  47.                
  48.                         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01         选择输入端 IC1映射到TI1上
  49.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  50.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  51.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  52.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  53.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  54.                

  55.         
  56.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
  57.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
  58.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级0级
  59.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  60.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  61.         
  62.         TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC2IE捕获中断
  63.         
  64.         TIM_Cmd(TIM2,ENABLE );
  65. }


  66. //*****************************************************************
  67. //************************************************************




  68. void TIM4_Cap_Init(u16 arr,u16 psc)
  69. {
  70.         GPIO_InitTypeDef GPIO_InitStructure;
  71.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  72.   NVIC_InitTypeDef NVIC_InitStructure;
  73.         
  74.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能TIM4时钟
  75.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOA时钟
  76.         
  77.         //TIM4的2个通道
  78.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  79.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  下拉
  80.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  81.         GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
  82.         
  83.         

  84.         TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  85.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
  86.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  87.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  88.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  89.         
  90.         //初始化TIM4通道1输入捕获参数
  91.         TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  92.           TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  93.           TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  94.           TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  95.           TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  96.           TIM_ICInit(TIM4, &TIM4_ICInitStructure);

  97.         TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         选择输入端 IC1映射到TI1上
  98.           TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  99.           TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  100.           TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  101.           TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  102.           TIM_ICInit(TIM4, &TIM4_ICInitStructure);
  103.                
  104.                         TIM4_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01         选择输入端 IC1映射到TI1上
  105.           TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  106.           TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  107.           TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  108.           TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  109.           TIM_ICInit(TIM4, &TIM4_ICInitStructure);
  110.                
  111.                         TIM4_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01         选择输入端 IC1映射到TI1上
  112.           TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  113.           TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  114.           TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  115.           TIM4_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  116.           TIM_ICInit(TIM4, &TIM4_ICInitStructure);

  117.         
  118.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
  119.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
  120.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级0级
  121.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  122.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  123.         
  124.         TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC2IE捕获中断
  125.         
  126.         TIM_Cmd(TIM4,ENABLE );
  127. }


  128. u8  TIM2CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
  129. u16        TIM2CH1_CAPTURE_VAL;        //输入捕获值
  130. u8  TIM2CH2_CAPTURE_STA=0;        //输入捕获状态        
  131. u16        TIM2CH2_CAPTURE_VAL;        //输入捕获值
  132. u16        TIM2CH3_CAPTURE_VAL;        //输入捕获值
  133. u8  TIM2CH3_CAPTURE_STA=0;        //输入捕获状态                                                   
  134. u16        TIM2CH4_CAPTURE_VAL;        //输入捕获值                                                      
  135. u8  TIM2CH4_CAPTURE_STA=0;        //输入捕获状态        

  136. u8  TIM4CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
  137. u16        TIM4CH1_CAPTURE_VAL;        //输入捕获值
  138. u8  TIM4CH2_CAPTURE_STA=0;        //输入捕获状态        
  139. u16        TIM4CH2_CAPTURE_VAL;        //输入捕获值
  140. u16        TIM4CH3_CAPTURE_VAL;        //输入捕获值
  141. u8  TIM4CH3_CAPTURE_STA=0;        //输入捕获状态                                                   
  142. u16        TIM4CH4_CAPTURE_VAL;        //输入捕获值                                                      
  143. u8  TIM4CH4_CAPTURE_STA=0;        //输入捕获状态        

  144. extern u32 distan1,distan2;
  145. extern u32 distan3,distan4;
  146. extern u32 distan5,distan6;
  147. extern u32 distan7,distan8;
  148. void TIM2_IRQHandler(void)
  149. {
  150.         if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
  151.         {         
  152.                 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)         
  153.                 {            
  154.                         if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  155.                         {
  156.                                 if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  157.                                 {
  158.                                         TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  159.                                         TIM2CH1_CAPTURE_VAL=0XFFFF;
  160.                                 }else TIM2CH1_CAPTURE_STA++;
  161.                         }         
  162.                 }
  163.         if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  164.                 {        
  165.                         if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  166.                         {                                 
  167.                                         TIM2CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  168.                                         TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
  169.                                 

  170.                                         distan1=TIM2CH1_CAPTURE_STA&0X3F;
  171.                                         distan1*=65536;//溢出时间总和
  172.                                         distan1+=TIM2CH1_CAPTURE_VAL;//得到总的高电平时间
  173.                                         distan1=340*distan1/2/10000;

  174.                                 
  175.                                         TIM2CH1_CAPTURE_STA=0;
  176.                                    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  177.                         }else                                                                  //还未开始,第一次捕获上升沿
  178.                         {
  179.                                 TIM2CH1_CAPTURE_STA=0;                        //清空
  180.                                 TIM2CH1_CAPTURE_VAL=0;
  181.                                  TIM_SetCounter(TIM2,0);
  182.                                 TIM2CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  183.                                    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  184.                         }                    
  185.                 }                                                                                    
  186.          }
  187.         
  188.         if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获        
  189.         {         
  190.                 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  191.                  
  192.                 {            
  193.                         if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
  194.                         {
  195.                                 if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  196.                                 {
  197.                                         TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
  198.                                         TIM2CH2_CAPTURE_VAL=0XFFFF;
  199.                                 }else TIM2CH2_CAPTURE_STA++;
  200.                         }         
  201.                 }
  202.         if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
  203.                 {        
  204.                         if(TIM2CH2_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  205.                         {                                 
  206.                                         TIM2CH2_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  207.                                         TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);
  208.                                         distan2=TIM2CH2_CAPTURE_STA&0X3F;
  209.                                         distan2*=65536;//溢出时间总和
  210.                                         distan2+=TIM2CH2_CAPTURE_VAL;//得到总的高电平时间
  211.                                         distan2=340*distan2/2/10000;

  212.                                 
  213.                                         TIM2CH2_CAPTURE_STA=0;
  214.                                    TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  215.                         }else                                                                  //还未开始,第一次捕获上升沿
  216.                         {
  217.                                 TIM2CH2_CAPTURE_STA=0;                        //清空
  218.                                 TIM2CH2_CAPTURE_VAL=0;
  219.                                  TIM_SetCounter(TIM2,0);
  220.                                 TIM2CH2_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  221.                                    TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  222.                         }                    
  223.                 }                                                                                    
  224.          }
  225.         
  226.         
  227.         if((TIM2CH3_CAPTURE_STA&0X80)==0)//还未成功捕获        
  228.         {         
  229.                 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)         
  230.                 {            
  231.                         if(TIM2CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
  232.                         {
  233.                                 if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  234.                                 {
  235.                                         TIM2CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
  236.                                         TIM2CH3_CAPTURE_VAL=0XFFFF;
  237.                                 }else TIM2CH3_CAPTURE_STA++;
  238.                         }         
  239.                 }
  240.         if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)//捕获1发生捕获事件
  241.                 {        
  242.                         if(TIM2CH3_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  243.                         {                                 
  244.                                         TIM2CH3_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  245.                                         TIM2CH3_CAPTURE_VAL=TIM_GetCapture3(TIM2);
  246.                                 

  247.                                         distan3=TIM2CH3_CAPTURE_STA&0X3F;
  248.                                         distan3*=65536;//溢出时间总和
  249.                                         distan3+=TIM2CH3_CAPTURE_VAL;//得到总的高电平时间
  250.                                         distan3=340*distan3/2/10000;

  251.                                 
  252.                                         TIM2CH3_CAPTURE_STA=0;
  253.                                    TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  254.                         }else                                                                  //还未开始,第一次捕获上升沿
  255.                         {
  256.                                 TIM2CH3_CAPTURE_STA=0;                        //清空
  257.                                 TIM2CH3_CAPTURE_VAL=0;
  258.                                  TIM_SetCounter(TIM2,0);
  259.                                 TIM2CH3_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  260.                                    TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  261.                         }                    
  262.                 }                                                                                    
  263.          }
  264.         
  265.         if((TIM2CH4_CAPTURE_STA&0X80)==0)//还未成功捕获        
  266.         {         
  267.                 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)         
  268.                 {            
  269.                         if(TIM2CH4_CAPTURE_STA&0X40)//已经捕获到高电平了
  270.                         {
  271.                                 if((TIM2CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  272.                                 {
  273.                                         TIM2CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次
  274.                                         TIM2CH4_CAPTURE_VAL=0XFFFF;
  275.                                 }else TIM2CH4_CAPTURE_STA++;
  276.                         }         
  277.                 }
  278.         if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)//捕获1发生捕获事件
  279.                 {        
  280.                         if(TIM2CH4_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  281.                         {                                 
  282.                                         TIM2CH4_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  283.                                         TIM2CH4_CAPTURE_VAL=TIM_GetCapture4(TIM2);
  284.                                 

  285.                                         distan4=TIM2CH4_CAPTURE_STA&0X3F;
  286.                                         distan4*=65536;//溢出时间总和
  287.                                         distan4+=TIM2CH4_CAPTURE_VAL;//得到总的高电平时间
  288.                                         distan4=340*distan4/2/10000;

  289.                                 
  290.                                         TIM2CH4_CAPTURE_STA=0;
  291.                                    TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  292.                         }else                                                                  //还未开始,第一次捕获上升沿
  293.                         {
  294.                                 TIM2CH4_CAPTURE_STA=0;                        //清空
  295.                                 TIM2CH4_CAPTURE_VAL=0;
  296.                                  TIM_SetCounter(TIM2,0);
  297.                                 TIM2CH4_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  298.                                    TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  299.                         }                    
  300.                 }                                                                                    
  301.          }
  302.         
  303.         TIM_ClearITPendingBit(TIM2, TIM_IT_CC1| TIM_IT_CC2| TIM_IT_CC3| TIM_IT_CC4|TIM_IT_Update); //清除中断标志位
  304. }        


  305. //***********************************************************************************
  306. //***********************************************************************************


  307. void TIM4_IRQHandler(void)
  308. {
  309.         
  310.         
  311.         
  312.         if((TIM4CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
  313.         {         
  314.                 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)         
  315.                 {            
  316.                         if(TIM4CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  317.                         {
  318.                                 if((TIM4CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  319.                                 {
  320.                                         TIM4CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  321.                                         TIM4CH1_CAPTURE_VAL=0XFFFF;
  322.                                 }else TIM4CH1_CAPTURE_STA++;
  323.                         }         
  324.                 }
  325.         if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  326.                 {        
  327.                         if(TIM4CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  328.                         {                                 
  329.                                         TIM4CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  330.                                         TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4);
  331.                                 

  332.                                         distan5=TIM4CH1_CAPTURE_STA&0X3F;
  333.                                         distan5*=65536;//溢出时间总和
  334.                                         distan5+=TIM4CH1_CAPTURE_VAL;//得到总的高电平时间
  335.                                         distan5=340*distan5/2/10000;

  336.                                 
  337.                                         TIM4CH1_CAPTURE_STA=0;
  338.                                    TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  339.                         }else                                                                  //还未开始,第一次捕获上升沿
  340.                         {
  341.                                 TIM4CH1_CAPTURE_STA=0;                        //清空
  342.                                 TIM4CH1_CAPTURE_VAL=0;
  343.                                  TIM_SetCounter(TIM4,0);
  344.                                 TIM4CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  345.                                    TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  346.                         }                    
  347.                 }                                                                                    
  348.          }
  349.         
  350.         
  351.         
  352.         if((TIM4CH2_CAPTURE_STA&0X80)==0)//还未成功捕获        
  353.         {         
  354.                 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  355.                  
  356.                 {            
  357.                         if(TIM4CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
  358.                         {
  359.                                 if((TIM4CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  360.                                 {
  361.                                         TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
  362.                                         TIM4CH2_CAPTURE_VAL=0XFFFF;
  363.                                 }else TIM4CH2_CAPTURE_STA++;
  364.                         }         
  365.                 }
  366.         if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
  367.                 {        
  368.                         if(TIM4CH2_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  369.                         {                                 
  370.                                         TIM4CH2_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  371.                                         TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4);
  372.                                         distan6=TIM4CH2_CAPTURE_STA&0X3F;
  373.                                         distan6*=65536;//溢出时间总和
  374.                                         distan6+=TIM4CH2_CAPTURE_VAL;//得到总的高电平时间
  375.                                         distan6=340*distan6/2/10000;

  376.                                 
  377.                                         TIM4CH2_CAPTURE_STA=0;
  378.                                    TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  379.                         }else                                                                  //还未开始,第一次捕获上升沿
  380.                         {
  381.                                 TIM4CH2_CAPTURE_STA=0;                        //清空
  382.                                 TIM4CH2_CAPTURE_VAL=0;
  383.                                  TIM_SetCounter(TIM4,0);
  384.                                 TIM4CH2_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  385.                                    TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  386.                         }                    
  387.                 }                                                                                    
  388.          }
  389.         
  390.         
  391.                 if((TIM4CH3_CAPTURE_STA&0X80)==0)//还未成功捕获        
  392.         {         
  393.                 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  394.                  
  395.                 {            
  396.                         if(TIM4CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
  397.                         {
  398.                                 if((TIM4CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  399.                                 {
  400.                                         TIM4CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
  401.                                         TIM4CH3_CAPTURE_VAL=0XFFFF;
  402.                                 }else TIM4CH3_CAPTURE_STA++;
  403.                         }         
  404.                 }
  405.         if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)//捕获1发生捕获事件
  406.                 {        
  407.                         if(TIM4CH3_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  408.                         {                                 
  409.                                         TIM4CH3_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  410.                                         TIM4CH3_CAPTURE_VAL=TIM_GetCapture3(TIM4);
  411.                                         distan7=TIM4CH3_CAPTURE_STA&0X3F;
  412.                                         distan7*=65536;//溢出时间总和
  413.                                         distan7+=TIM4CH3_CAPTURE_VAL;//得到总的高电平时间
  414.                                         distan7=340*distan7/2/10000;

  415.                                 
  416.                                         TIM4CH3_CAPTURE_STA=0;
  417.                                    TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  418.                         }else                                                                  //还未开始,第一次捕获上升沿
  419.                         {
  420.                                 TIM4CH3_CAPTURE_STA=0;                        //清空
  421.                                 TIM4CH3_CAPTURE_VAL=0;
  422.                                  TIM_SetCounter(TIM4,0);
  423.                                 TIM4CH3_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  424.                            TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  425.                         }                    
  426.                 }                                                                                    
  427.          }
  428.         
  429.         
  430.                 if((TIM4CH4_CAPTURE_STA&0X80)==0)//还未成功捕获        
  431.         {         
  432.                 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  433.                  
  434.                 {            
  435.                         if(TIM4CH4_CAPTURE_STA&0X40)//已经捕获到高电平了
  436.                         {
  437.                                 if((TIM4CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  438.                                 {
  439.                                         TIM4CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次
  440.                                         TIM4CH4_CAPTURE_VAL=0XFFFF;
  441.                                 }else TIM4CH4_CAPTURE_STA++;
  442.                         }         
  443.                 }
  444.         if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)//捕获1发生捕获事件
  445.                 {        
  446.                         if(TIM4CH4_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  447.                         {                                 
  448.                                         TIM4CH4_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  449.                                         TIM4CH4_CAPTURE_VAL=TIM_GetCapture4(TIM4);
  450.                                         distan8=TIM4CH4_CAPTURE_STA&0X3F;
  451.                                         distan8*=65536;//溢出时间总和
  452.                                         distan8+=TIM4CH4_CAPTURE_VAL;//得到总的高电平时间
  453.                                         distan8=340*distan8/2/10000;

  454.                                 
  455.                                         TIM4CH4_CAPTURE_STA=0;
  456.                                    TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  457.                         }else                                                                  //还未开始,第一次捕获上升沿
  458.                         {
  459.                                 TIM4CH4_CAPTURE_STA=0;                        //清空
  460.                                 TIM4CH4_CAPTURE_VAL=0;
  461.                                  TIM_SetCounter(TIM4,0);
  462.                                 TIM4CH4_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  463.                                    TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  464.                         }                    
  465.                 }                                                                                    
  466.          }
  467.         
  468.         
  469.         TIM_ClearITPendingBit(TIM4, TIM_IT_CC1| TIM_IT_CC2| TIM_IT_CC3| TIM_IT_CC4|TIM_IT_Update); //清除中断标志位
  470. }        
复制代码


全部资料51hei下载地址:
TIM2和TIM4八超声波.7z (183.58 KB, 下载次数: 23)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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