首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

STM32(寄存器)超声波程序代码

嵌入式 | 发布时间:2018-06-19 | 人气: | #评论# | 本文关键字:STM32,寄存器,代码
摘要:我们是基于stm32f103系列,超声波模块用的是:HC-SR04(寄存器版的代码) 编译器用的是:keil5。 在此:输入捕获用的是TIM2_CH1(用的是PA0,可以从开发板原理图中看到) 由于本文只是简单的介绍超声

我们是基于stm32f103系列,超声波模块用的是:HC-SR04(寄存器版的代码)编译器用的是:keil5。在此:输入捕获用的是TIM2_CH1(用的是PA0,可以从开发板原理图中看到)

1.png

由于本文只是简单的介绍超声波测距,并不涉及其他东西,所以没有加载按键,led灯程序

test.c文件(主函数所存在的地方)

timer.c文件(输入捕获初始化的地方)

ultrasonic.c文件(超声波模块初始化)

test.c

  1. #include "sys.h"  

  2. #include "usart.h"        

  3. #include "delay.h"     

  4. #include "timer.h"   

  5. #include "ultrasonic.h"  

  6.   

  7. extern u8  TIM2CH1_CAPTURE_STA;     //输入捕获状态              

  8. extern u16  TIM2CH1_CAPTURE_VAL;    //输入捕获值  

  9.   

  10.   

  11. int main(void)  

  12. {              

  13.     u32 temp=0;       

  14.     Stm32_Clock_Init(9);                    //系统时钟设置  

  15.     uart_init(72,9600);                     //串口初始化为0  

  16.     delay_init(72);                     //延时初始化  

  17.     ultrasonic_Init();  

  18.     TIM2_Cap_Init(0XFFFF,72-1);             //以1Mhz的频率计数  

  19.     while(1)  

  20.     {  

  21.         PAout(4)=1;  

  22.         delay_us(15);    

  23.         PAout(4)=0;    

  24.           

  25.         if(TIM2CH1_CAPTURE_STA&0X80)              //成功捕获到了一次高电平  

  26.         {  

  27.             temp=TIM2CH1_CAPTURE_STA&0X3F;  

  28.             temp*=65536;                  //溢出时间总和  

  29.             temp+=TIM2CH1_CAPTURE_VAL;    //得到总的高电平的时间  

  30.               

  31.             temp=temp*170/10000;  

  32.             printf("Distance:%d cm\r\n",temp);//打印总的高电平的时间,也就是转换后的高度了  

  33.             TIM2CH1_CAPTURE_STA=0;        //开启下一次捕获  

  34.         }  

  35.     }  

  36. }  


ultrasonic.c


#include "ultrasonic.h"  

  1. #include "sys.h"  

  2.   

  3.   

  4. void ultrasonic_Init(void){  

  5.   

  6.     RCC->APB2ENR |= 1<<2;  

  7.     GPIOA->CRL &= 0xfff0ffff;  

  8.     GPIOA->CRL |= 0X00030000;  

  9. }  


ultrasonic.h

  1. #ifndef __ULTRASONIC_H  

  2. #define __ULTRASONIC_H  

  3. #include "sys.h"  

  4.   

  5. #define ULTRASONIC_TRIG PAout(4)  

  6.   

  7. void ultrasonic_Init(void);  

  8.   

  9. #endif  


timer.c

  1. #include "timer.h"  

  2. #include "led.h"  

  3.    

  4. //定时器2通道1输入捕获配置  

  5. //arr:自动重装载值  

  6. //psc:时钟分频数  

  7. void TIM2_Cap_Init(u16 arr,u16 psc)  

  8. {          

  9.     RCC->APB1ENR|=1<<0;    //TIM2时钟使能  

  10.     RCC->APB2ENR|=1<<2;        //使能A时钟  

  11.        

  12.     GPIOA->CRL&=0XFFFFFFF0;    

  13.     GPIOA->CRL|=0X00000008;  

  14.     GPIOA->ODR|=0<<0;  

  15.         

  16.     TIM2->ARR=arr;   //设定计数器自动装载值  

  17.     TIM2->PSC=psc;   //设定预分频数  

  18.   

  19.     TIM2->CCMR1|=1<<0; //CC1S=01选择输入端,IC1映射到TI1上  

  20.     TIM2->CCMR1|=1<<4;     //IC1F=0001 配置输入滤波器,以Fck_int采样,2个事件后有效  

  21.     TIM2->CCMR1|=0<<10;    //IC2PS=00  配置输入分频,不分频  

  22.   

  23.     TIM2->CCER|=0<<1;  //CC1P=0    上升沿捕获  

  24.     TIM2->CCER|=1<<0;  //CC1E=1    允许捕获计数器的值到捕获寄存器中  

  25.   

  26.     TIM2->DIER|=1<<1;      //允许捕获中断          

  27.     TIM2->DIER|=1<<0;      //允许更新中断      

  28.     TIM2->CR1|=0x01;     //使能计数器2  

  29.     MY_NVIC_Init(2,0,TIM2_IRQn,2);//抢占2,子优先级0,组2     

  30. }  

  31.   

  32. //捕获状态2个全局变量  

  33. //[7]:0,没有成功捕获,1,成功捕获一次  

  34. //[6]:0,还没有捕获到高电平,1,已经捕获到高电平了  

  35. //[5:0]:捕获高电平后的溢出次数  

  36. u8  TIM2CH1_CAPTURE_STA=0;//输入捕获状态                

  37. u16 TIM2CH1_CAPTURE_VAL;//输入捕获值-用来记录捕获到下降沿时,TIM2_CNT的值  

  38.   

  39. //定时器2中断服务程序  

  40. void TIM2_IRQHandler(void)  

  41. {             

  42.     u16 tsr;  

  43.     tsr=TIM2->SR;  

  44.     if((TIM2CH1_CAPTURE_STA&0X80)==0)//还没有成功捕获  

  45.     {  

  46.         if(tsr&0X01)//溢出  

  47.         {         

  48.             if(TIM2CH1_CAPTURE_STA&0X40)                   //已经捕获到高电平了  

  49.             {  

  50.                 if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)   //高电平太长了  

  51.                 {  

  52.                     TIM2CH1_CAPTURE_STA|=0X80;     //标记成功捕获了一次  

  53.                     TIM2CH1_CAPTURE_VAL=0XFFFF;  

  54.                 }else TIM2CH1_CAPTURE_STA++;  

  55.             }      

  56.         }  

  57.         if(tsr&0x02)//捕获1发生捕获事件  

  58.         {     

  59.             if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿    

  60.             {                 

  61.                 TIM2CH1_CAPTURE_STA|=0X80;      //标记成功捕获到一次高电平的脉冲宽度  

  62.                     TIM2CH1_CAPTURE_VAL=TIM2->CCR1;          //提取当前的捕获值  

  63.                 TIM2->CCER&=~(1<<1);           //CC1P=0 设置为上升沿捕获  

  64.             }else                       //还未开始,第一次捕获上升沿  

  65.             {   

  66.                 TIM2CH1_CAPTURE_VAL=0;  

  67.                 TIM2CH1_CAPTURE_STA=0X40;       //标记捕获到了上升沿  

  68.                 TIM2->CNT=0;             //计数器清空  

  69.                 TIM2->CCER|=1<<1;          //CC1P=1 设置为下降沿捕获  

  70.             }             

  71.         }                                                

  72.     }  

  73.     TIM2->SR=0;                                                     //清空中断标志位   

  74. }  


timer.h


#ifndef __TIMER_H  

  1. #define __TIMER_H  

  2. #include "sys.h"    

  3.   

  4. void TIM2_Cap_Init(u16 arr,u16 psc);  

  5. #endif  

验证效果:

2.png

责任编辑:STM32
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。