找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4242|回复: 1
打印 上一主题 下一主题
收起左侧

STM32之TIM2收发四路超声波(寄存器版)

[复制链接]
跳转到指定楼层
楼主
ID:250368 发表于 2017-11-17 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,采用定时器2控制。不喜勿喷。

单片机源程序如下:
  1. #include "timer.h"
  2. /**************************************************************************
  3. 函数功能:定时器3通道3输入捕获初始化
  4. 入口参数:入口参数:arr:自动重装值  psc:时钟预分频数
  5. 返回  值:无
  6. **************************************************************************/
  7. void TIM2_Cap_Init(u16 arr,u16 psc)       
  8. {         
  9.         RCC->APB1ENR|=1<<0;     //TIM2时钟使能     
  10.         RCC->APB2ENR|=1<<2;            //使能PORTB时钟  
  11.        
  12.         GPIOA->CRL&=0X00000000;
  13.   GPIOA->CRL|=0X22228888;       
  14.        
  15.   TIM2->ARR=arr;                  //设定计数器自动重装值   
  16.         TIM2->PSC=psc;                  //预分频器
  17.        
  18.   TIM2->CCMR1|=1<<0;        //选择输入端  1通道配置为输入
  19.         TIM2->CCMR1|=0<<4;         //配置输入滤波器 不滤波
  20.         TIM2->CCMR1|=0<<2;         //配置输入分频,不分频
  21.         TIM2->CCER|=1<<0;         //允许捕获计数器的值到捕获寄存器中       
  22.         TIM2->CCER|=0<<1;         //上升沿捕获
  23.         TIM2->DIER|=1<<1;   //允许捕获中断
  24.        
  25.         TIM2->CCMR1|=1<<8;        //选择输入端  2通道配置为输入
  26.         TIM2->CCMR1|=0<<12;         //配置输入滤波器 不滤波
  27.         TIM2->CCMR1|=0<<10;         //配置输入分频,不分频
  28.         TIM2->CCER|=1<<4;         //允许捕获计数器的值到捕获寄存器中
  29.         TIM2->CCER|=0<<5;         //上升沿捕获
  30.         TIM2->DIER|=1<<2;   //允许捕获中断

  31.         TIM2->CCMR2|=1<<0;        //选择输入端  3通道配置为输入
  32.         TIM2->CCMR2|=0<<4;         //配置输入滤波器 不滤波
  33.         TIM2->CCMR2|=0<<2;         //配置输入分频,不分频
  34.         TIM2->CCER|=1<<8;         //允许捕获计数器的值到捕获寄存器中
  35.         TIM2->CCER|=0<<9;         //上升沿捕获
  36.         TIM2->DIER|=1<<3;   //允许捕获中断
  37.        
  38.         TIM2->CCMR2|=1<<8;          //0选择输入端  4通道配置为输入
  39.         TIM2->CCMR2|=0<<12;          //4配置输入滤波器 不滤波
  40.         TIM2->CCMR2|=0<<10;         //2配置输入分频,不分频
  41.         TIM2->CCER|=1<<12;         //允许捕获计数器的值到捕获寄存器
  42.   TIM2->CCER|=0<<13;         //CH4上升沿捕获
  43.         TIM2->DIER|=1<<4;   //允许捕获中断               
  44.        

  45.         TIM2->DIER|=1<<0;   //允许更新中断       
  46.         TIM2->CR1|=0x01;    //使能定时器3
  47.         MY_NVIC_Init(1,3,TIM2_IRQn,1);
  48. }
  49. /**************************************************************************
  50. 函数功能:超声波接收回波函数
  51. 入口参数:无
  52. 返回  值:无
  53. **************************************************************************/
  54. u16 TIM2CH1_CAPTURE_STA,TIM2CH1_CAPTURE_VAL;
  55. void ReadT2C1_Distane(void)
  56. {   
  57.        
  58.          PAout(4)=1;
  59.          delay_us(15);  
  60.          PAout(4)=0;       
  61.                         if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  62.                         {
  63.                         DisT2C1=TIM2CH1_CAPTURE_STA&0X3F;
  64.                         DisT2C1*=65536;                                                //溢出时间总和
  65.                         DisT2C1+=TIM2CH1_CAPTURE_VAL;                //得到总的高电平时间
  66.       DisT2C1=DisT2C1*170/1000;
  67.                         printf("DIST2C1:%d\n",DisT2C1);
  68.                         TIM2CH1_CAPTURE_STA=0;                        //开启下一次捕获
  69.                   }                               
  70. }

  71. u16 TIM2CH2_CAPTURE_STA,TIM2CH2_CAPTURE_VAL;
  72. void ReadT2C2_Distane(void)
  73. {   
  74.          PAout(5)=1;
  75.          delay_us(15);  
  76.          PAout(5)=0;       
  77.                         if(TIM2CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  78.                         {
  79.                         DisT2C2=TIM2CH2_CAPTURE_STA&0X3F;
  80.                         DisT2C2*=65536;                                                //溢出时间总和
  81.                         DisT2C2+=TIM2CH2_CAPTURE_VAL;                //得到总的高电平时间
  82.                         DisT2C2=DisT2C2*170/1000;
  83.                         printf("DIST2C2:%d\n",DisT2C2);
  84.                         TIM2CH2_CAPTURE_STA=0;                        //开启下一次捕获
  85.                   }                               
  86. }

  87. u16 TIM2CH3_CAPTURE_STA,TIM2CH3_CAPTURE_VAL;
  88. void ReadT2C3_Distane(void)
  89. {   
  90.          PAout(6)=1;
  91.          delay_us(15);  
  92.          PAout(6)=0;       
  93.                         if(TIM2CH3_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  94.                         {
  95.                         DisT2C3=TIM2CH3_CAPTURE_STA&0X3F;
  96.                         DisT2C3*=65536;                                                //溢出时间总和
  97.                         DisT2C3+=TIM2CH3_CAPTURE_VAL;                //得到总的高电平时间
  98.                         DisT2C3=DisT2C3*170/1000;
  99.                         printf("DIST2C3:%d\n",DisT2C3);
  100.                         TIM2CH3_CAPTURE_STA=0;                        //开启下一次捕获
  101.                   }                               
  102. }

  103. u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;
  104. void ReadT2C4_Distane(void)
  105. {   
  106.        
  107.          PAout(7)=1;
  108.          delay_us(15);  
  109.          PAout(7)=0;       
  110.                         if(TIM2CH4_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  111.                         {
  112.                         DisT2C4=TIM2CH4_CAPTURE_STA&0X3F;
  113.                         DisT2C4*=65536;                                                //溢出时间总和
  114.                         DisT2C4+=TIM2CH4_CAPTURE_VAL;                //得到总的高电平时间
  115.                         DisT2C4=DisT2C4*170/1000;
  116.                         printf("DIST2C4:%d\n",DisT2C4);
  117.                         TIM2CH4_CAPTURE_STA=0;                        //开启下一次捕获
  118.                   }                               
  119. }
  120. /**************************************************************************
  121. 函数功能:超声波回波脉宽读取中断
  122. 入口参数:无
  123. 返回  值:无
  124. 作    者:平衡小车之家
  125. **************************************************************************/
  126. void TIM2_IRQHandler(void)
  127. {                                                                   
  128.         u16 tsr;
  129.         tsr=TIM2->SR;
  130.        
  131. /*******************************************************************
  132.        
  133. ********************************************************************/
  134.         if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
  135.                                 {
  136.                                                                 if(tsr&0X01)//溢出
  137.                                                                 {            
  138.                                                                                 if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  139.                                                                                 {
  140.                                                                                         if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  141.                                                                                         {
  142.                                                                                                 TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  143.                                                                                                 TIM2CH1_CAPTURE_VAL=0XFFFF;
  144.                                                                                         }else TIM2CH1_CAPTURE_STA++;
  145.                                                                                 }         
  146.                                                                 }
  147.                                                            if(tsr&0x02)//捕获1发生捕获事件
  148.                                             {       
  149.                                                                                         if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
  150.                                                                                         {                                 
  151.                                                                                         TIM2CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
  152.                                                                                         TIM2CH1_CAPTURE_VAL=TIM2->CCR1;        //获取当前的捕获值.
  153.                                                                                         TIM2->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
  154.                                                                                   }else                                                                  //还未开始,第一次捕获上升沿
  155.                                            {
  156.                                                                                         TIM2CH1_CAPTURE_STA=0;                        //清空
  157.                                                                                         TIM2CH1_CAPTURE_VAL=0;
  158.                                                                                         TIM2CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  159.                                                                                         TIM2->CNT=0;                                        //计数器清空
  160.                                                                                         TIM2->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
  161.                                                         }                    
  162.                                                     }                                                                                   
  163.                    }
  164.                                
  165. /*************************************************************************/
  166.                          
  167. /*************************************************************************/

  168.         if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获       
  169.                                 {
  170.                                                                 if(tsr&0X01)//溢出
  171.                                                                 {            
  172.                                                                                 if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
  173.                                                                                 {
  174.                                                                                         if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  175.                                                                                         {
  176.                                                                                                 TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
  177.                                                                                                 TIM2CH2_CAPTURE_VAL=0XFFFF;
  178.                                                                                         }else TIM2CH2_CAPTURE_STA++;
  179.                                                                                 }         
  180.                                                                 }
  181.                                                            if(tsr&0x04)//捕获2发生捕获事件
  182.                                             {       
  183.                                                                                         if(TIM2CH2_CAPTURE_STA&0X40)                //捕获到一个下降沿                
  184.                                                                                         {                                 
  185.                                                                                         TIM2CH2_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
  186.                                                                                         TIM2CH2_CAPTURE_VAL=TIM2->CCR2;        //获取当前的捕获值.
  187.                                                                                         TIM2->CCER&=~(1<<5);                        //CC1P=0 设置为上升沿捕获
  188.                                                                                   }else                                                                  //还未开始,第一次捕获上升沿
  189.                                            {
  190.                                                                                         TIM2CH2_CAPTURE_STA=0;                        //清空
  191.                                                                                         TIM2CH2_CAPTURE_VAL=0;
  192.                                                                                         TIM2CH2_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  193.                                                                                         TIM2->CNT=0;                                        //计数器清空
  194.                                                                                         TIM2->CCER|=1<<5;                                 //CC1P=1 设置为下降沿捕获
  195.                                                         }                    
  196.                                                     }                                                                                   
  197.                    }
  198. /***************************************************************************************
  199.                          
  200. ****************************************************************************************/

  201.         if((TIM2CH3_CAPTURE_STA&0X80)==0)//还未成功捕获       
  202.                                 {
  203.                                                                 if(tsr&0X01)//溢出
  204.                                                                 {            
  205.                                                                                 if(TIM2CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
  206.                                                                                 {
  207.                                                                                         if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  208.                                                                                         {
  209.                                                                                                 TIM2CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
  210.                                                                                                 TIM2CH3_CAPTURE_VAL=0XFFFF;
  211.                                                                                         }else TIM2CH3_CAPTURE_STA++;
  212.                                                                                 }         
  213.                                                                 }
  214.                                                            if(tsr&0x08)//捕获1发生捕获事件
  215.                                             {       
  216.                                                                                         if(TIM2CH3_CAPTURE_STA&0X40)                //捕获到一个下降沿                
  217.                                                                                         {                                 
  218.                                                                                         TIM2CH3_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
  219.                                                                                         TIM2CH3_CAPTURE_VAL=TIM2->CCR3;        //获取当前的捕获值.
  220.                                                                                         TIM2->CCER&=~(1<<9);                        //CC1P=0 设置为上升沿捕获
  221.                                                                                   }else                                                                  //还未开始,第一次捕获上升沿
  222.                                            {
  223.                                                                                         TIM2CH3_CAPTURE_STA=0;                        //清空
  224.                                                                                         TIM2CH3_CAPTURE_VAL=0;
  225.                                                                                         TIM2CH3_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  226.                                                                                         TIM2->CNT=0;                                        //计数器清空
  227.                                                                                         TIM2->CCER|=1<<9;                                 //CC1P=1 设置为下降沿捕获
  228.                                                         }                    
  229.                                                     }                                                                                   
  230.                    }
  231. /***************************************************************************
  232.                          
  233. ****************************************************************************/

  234.         if((TIM2CH4_CAPTURE_STA&0X80)==0)//还未成功捕获       
  235.                                 {
  236.                                                                 if(tsr&0X01)//溢出
  237. ……………………

  238. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
USART_TIM2.rar (110.91 KB, 下载次数: 42)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:276828 发表于 2019-4-9 08:30 | 只看该作者
你好,你这程序超声波引脚没有定义?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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