引脚:PB15 TRIG,PB0 ECHO;

不同距离,LED对应不良、闪烁、亮状态,并通过串口发送到PC;

TIM3定时中断,测出脉宽长度,没有像野火一样使用捕捉功能;

1.HS-SR04模块实物图、原理图、尺寸图

2.HC-SR04模块说明

2.1 产品特点:

HC-SR04超声波测距模块包括超声波发射器、接收器与控制电路;接口:VCC,GND,TRIG 触发控制信号输入,ECHO 回响信号输出。

超声波模块HC-SR04电气参数
工作电压 DC  5 V
工作电流 15mA   
工作频率 40kHz
最远射程 4m
最近射程 2cm
测距精度 3mm
测量角度 15 度
输入触发信号 10uS 的TTL 脉冲
输出回响信号 输出TTL电平信号,与射程成比例
规格尺寸 45*20*15mm

2.2 时序工作原理:

(1)IO 口TRIG 触发测距,提供最少10us 的高电平信号;
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

注:

1、此模块不宜带电连接,若要带电连接,则先让模块的 GND端先连接,否则会影响模块的正常工作;

2、测距时,被测物体的面积不少于 0.5平方米且平面尽量要求平整,否则影响测量的结果;

3.stm32程序

测试结果

程序:

//主函数
#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"
#include "bsp_usart.h"
#include "bsp_led.h"
#include "ultrasonic.h"int main(void)
{   HSE_SetSysClk(RCC_PLLMul_6);//注意:同时将 "stm32f10x.h"中8000000改为12000000USART_Config();LED_GPIO_Config();Ultrasonic_Init();        printf("测试开始\n");    //测试开始while( 1 ){GetDistance();  }
}
//超声波初始化测距函数.c程序
#include "ultrasonic.h"
#include "bsp_systick.h"
#include "bsp_led.h"
#include "bsp_usart.h"//定时器更新计数需要全局变量,在距离计算和定时器更新中断两个函数中需要
//平均距离输出需要全局变量,void GetDistance(void)函数中省去了return
u32 Count_update,Distance1;//超声波模块Trig、Echo初始化
void Ultras_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15; //triggerGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;  //echoGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_ResetBits(GPIOB,GPIO_Pin_15);GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}//定时器TIM3初始化
void Ultras_TIM3_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitStructure.TIM_Period=100-1;                       //计数次数,100个1us更新中断一次TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;                    //预分频数TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_ClockDivision=0;TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //串口中已分组NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                       //打开定时器3的更新中断
}//超声波模块初始化
void Ultrasonic_Init(void)
{Ultras_GPIO_Init();Ultras_TIM3_Init();
}///
//
//     函数:   GetDistance()
//     输入:   无
//     输出:   无
//     功能:   计算采集到的距离并进行显示
//     说明:   1、工作原理:trig拉高10us后,打开TIM3
//                 来采集超声波来回的时间,然后通过
//                 计算公式求得距离
//              2、求得的距离是六次距离的平均值
//
/void GetDistance(void)
{int i,count,Distance0;for(i=0;i<6;i++)                                    //循环六次采集距离{GPIO_SetBits(GPIOB,GPIO_Pin_15);                     //拉高trigSysTick_Delay_us(10);                               //保持10usGPIO_ResetBits(GPIOB,GPIO_Pin_15);                   //拉低trigwhile(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0);  //等待echo管脚输出高电平后打开TIM3计时TIM_Cmd(TIM3,ENABLE);                               //打开TIM3,开始获取超声波来回的时间while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1);  //等待来回时间的结束TIM_Cmd(TIM3,DISABLE);                              //关闭TIM3,结束时间的采集count=TIM_GetCounter(TIM3);                         //获取TIM3的该次计数值,即读取TIM3寄存器CNTDistance0=calculer(count);                         //调用函数计算距离Distance1+=Distance0;                      //距离距离的累加,用于后续计算距离平均值SysTick_Delay_ms(50);                                   }    Distance1=Distance1/6;                                //计算平均值Display(Distance1);                                   //调用函数来通过指示灯反馈距离范围printf("Distance:%d.%dcm\n",Distance1/100,Distance1%100);                 //输出距离SysTick_Delay_ms(50);
}/
//
//     函数:   TIM3_IRQHandler()
//     输入:   无
//     输出:   无
//     功能:   TIM3中断函数
//     说明:   每100us进入该函数,获取超声波来回时间间隔内
//              TIM3中断的次数,用于计算时间和最后的距离
//
/
void TIM3_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update)!=RESET){Count_update++;                                    //中断标志自加1TIM_ClearFlag(TIM3,TIM_FLAG_Update);      //清除中断标志}
}///
//
//     函数:   calculer()
//     输入:   count(TIM3该次的计数值)
//     输出:   Distance(计算得到的距离)
//     功能:   计算距离的核心公式
//     说明:   1、计算得到的距离单位是cm,并且放大了100倍
//              2、计算公式是:TIM3的总计数次数*(72/72000000*340/2*100*100)
//                 其中72为TIM3的预分频系数,72000000为系统的主频率
//                 340为声速,除以2是因为来回,100是声速的米换算成厘米
//                 另一个100是放大100倍,先求出1us探测的距离。
//u32 calculer(u32 count)
{u32 Distance;Distance=((float)(count+100*Count_update)*0.425);   //TIM3的周期计数是100个1usCount_update=0;                                     //清空TIM3的中断次数return Distance;
}//
//
//     函数:   Display()
//     输入:   Distance(超声波采集到的距离大小)
//     输出:   无
//     功能:   将距离范围用指示灯显示
//     说明:   该函数通过指示灯将超声波采集到的距离
//              范围反馈出来
//
//
void Display(u32 Distance)
{if(Distance>20000)                               //如果距离大于2m,则LED1亮{LED1_OFF;}else if((Distance>10000)&&(Distance<=20000))     //如果距离大于1m,小于2m,则LED2亮{LED1_TOGGLE;}else                                             //如果距离小于1m,则LED3亮{LED1_ON;}
}
//超声波初始化、测距函数.h程序
#ifndef __ULTRASONIC_H
#define __ULTRASONIC_H#include "stm32f10x.h"void Ultrasonic_Init(void);
void GetDistance(void); void Ultras_GPIO_Init(void);
void Ultras_TIM3_Init(void);void TIM3_IRQHandler(void);
u32 calculer(u32 count);
void Display(u32 Distance);#endif
//led灯用来指示距离初始化.c#include "bsp_led.h"   void LED_GPIO_Config(void)
{       /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd( LED1_GPIO_CLK, ENABLE);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;  /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); /* 关闭所有led灯 */GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);}/*********************************************END OF FILE**********************/
//led灯用来指示距离初始化.h
#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"/* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */#define LED1_GPIO_PORT     GPIOC                         /* GPIO端口 */
#define LED1_GPIO_CLK       RCC_APB2Periph_GPIOC        /* GPIO端口时钟 */
#define LED1_GPIO_PIN               GPIO_Pin_3                  /* 连接到SCL时钟线的GPIO */#define ON  1
#define OFF 0/* 使用标准的固件库控制IO*/
#define LED1(a) if (a)  \GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\else       \GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i)       {p->BSRR=i;}    //输出为高电平
#define digitalLo(p,i)       {p->BRR=i;}     //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态/* 定义控制IO的宏 */
#define LED1_TOGGLE          digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON              digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF               digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)void LED_GPIO_Config(void);#endif /* __LED_H */
//延时函数.c
#include "bsp_systick.h"#if 0
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ //  判断 tick 的值是否大于 2^24,如果大于,则不符合规则if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);// 初始化reload寄存器的值    SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;// 配置中断优先级,配置为15,默认为最低的优先级NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); // 初始化counter的值为0  SysTick->VAL   = 0; // 配置 systick 的时钟为 72M// 使能中断// 使能systickSysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk   | SysTick_CTRL_ENABLE_Msk;                    return (0);
}
#endifvoid SysTick_Delay_us(uint32_t us)
{uint32_t i;SysTick_Config(72);for(i=0; i<us; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}void SysTick_Delay_ms(uint32_t ms)
{uint32_t i;SysTick_Config(72000);for(i=0; i<ms; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
//延时函数.h
#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H#include "stm32f10x.h"
#include "core_cm3.h"void SysTick_Delay_us(uint32_t us);
void SysTick_Delay_ms(uint32_t ms);#endif /* __BSP_SYSTICK_H */
//串口通讯.c
#include "bsp_usart.h"static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART为中断源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure);
}void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校验位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收发一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中断优先级配置NVIC_Configuration();// 使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);
}/* 发送一个字节 */
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{USART_SendData(pUSARTx, data);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}/* 发送两个字节的数据 */
void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data)
{uint8_t temp_h,temp_l;temp_h = (data&0xff00) >> 8 ;temp_l = data&0xff;USART_SendData(pUSARTx, temp_h);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );USART_SendData(pUSARTx, temp_l);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}/* 发送8位数据的数组 */
void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num)
{uint8_t i;for( i=0; i<num; i++ ){Usart_SendByte(pUSARTx, array[i]);}while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );
}/* 发送字符串 */
void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str)
{uint8_t i=0;do{Usart_SendByte(pUSARTx, *(str+i));i++;}while(*(str+i) != '\0');while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );
}///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);      return (ch);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}
//串口通讯.h
#ifndef __BSP_USART_H
#define __BSP_USART_H#include "stm32f10x.h"
#include <stdio.h>#define DEBUG_USART1     0
#define DEBUG_USART2     0
#define DEBUG_USART3     1
#define DEBUG_USART4     0
#define DEBUG_USART5     0#if DEBUG_USART1
// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler#elif DEBUG_USART2
//串口2-USART2
#define  DEBUG_USARTx                   USART2
#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_2
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3#define  DEBUG_USART_IRQ                USART2_IRQn
#define  DEBUG_USART_IRQHandler         USART2_IRQHandler#elif DEBUG_USART3
//串口3-USART3
#define  DEBUG_USARTx                   USART3
#define  DEBUG_USART_CLK                RCC_APB1Periph_USART3
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOB
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
#define  DEBUG_USART_RX_GPIO_PORT       GPIOB
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11#define  DEBUG_USART_IRQ                USART3_IRQn
#define  DEBUG_USART_IRQHandler         USART3_IRQHandler#elif DEBUG_USART4
//串口4-UART4
#define  DEBUG_USARTx                   UART4
#define  DEBUG_USART_CLK                RCC_APB1Periph_UART4
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
#define  DEBUG_USART_RX_GPIO_PORT       GPIOC
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11#define  DEBUG_USART_IRQ                UART4_IRQn
#define  DEBUG_USART_IRQHandler         UART4_IRQHandler#elif DEBUG_USART5
//串口5-UART5
#define  DEBUG_USARTx                   UART5
#define  DEBUG_USART_CLK                RCC_APB1Periph_UART5
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_12
#define  DEBUG_USART_RX_GPIO_PORT       GPIOD
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2#define  DEBUG_USART_IRQ                UART5_IRQn
#define  DEBUG_USART_IRQHandler         UART5_IRQHandler#endifvoid USART_Config(void);
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);
void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num);
void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str);
#endif  /* __BSP_USART_H */
//12MHz晶振设置工作频率.c
#include "bsp_rccclkconfig.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x )
{ErrorStatus HSEStatus;// 把RCC 寄存器复位成复位值RCC_DeInit();   // 使能 HSE RCC_HSEConfig(RCC_HSE_ON);HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */}
}void HSI_SetSysClk( uint32_t RCC_PLLMul_x )
{__IO uint32_t HSIStatus = 0;// 把RCC 寄存器复位成复位值RCC_DeInit();    // 使能 HSI RCC_HSICmd(ENABLE);HSIStatus = RCC->CR & RCC_CR_HSIRDY;if( HSIStatus == RCC_CR_HSIRDY ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSI 启动失败,用户可以在这里添加处理错误的代码 */}
}void MCO_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
}
//12MHz晶振设置工作频率.h
#ifndef __BSP_RCCCLKCONFIG_H
#define __BSP_RCCCLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x );
void MCO_GPIO_Config(void);
void HSI_SetSysClk( uint32_t RCC_PLLMul_x );
#endif /*__BSP_RCCCLKCONFIG_H */

stm32控制超声波测距模块HC-SR04相关推荐

  1. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

  2. STM32F103关于输入捕获以及控制超声波测距模块的笔记(2)

    今天操控了超声波测距模块并尝试了关于超声波精度的测量.后来学习了OLED显示屏的一些知识. 首先先说一下超声波测距控制程序中timer.c里面除去相应的串口,定时器,中断等相应的初始化后的一些函数: ...

  3. Arduino 控制超声波测距模块

    一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单 转载于:https://www.cnblogs.com/caoguo/p/4785700.ht ...

  4. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  5. hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解

    超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...

  6. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  7. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  8. stm32蓝牙模块和超声波测距模块

    蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...

  9. 使用超声波测距模块控制LED灯

    本文章为你介绍如何使用Arduino开发板和超声波测距模块来控制LED灯的明灭. 所需硬件 -Arduino开发板 -LED -超声波测距模块 下面主要为大家说明一下超声波模块. 超声波传感器通过采用 ...

最新文章

  1. 环形熔断器设计与gobreaker源码分析
  2. 位于/var/log目录下的20个Linux日志文件
  3. 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析
  4. Apache Storm 官方文档 —— 源码组织结构
  5. 一个循环、一个变量打印乘法口诀
  6. css块元素与行内元素特点,CSS区分块级元素和行内元素
  7. Java File类详解
  8. java猜拳论文_Java人机猜拳实现的思路及方法实例
  9. 为什么出现股市二八现象?
  10. 无法安装 Microsoft Visual Studio 2010 Service Pack 1
  11. 如何搭建maven中,分布式工程
  12. ae2020不支持的视频驱动程序_英伟达发布支持GeForce GTX 1660 SUPER的新Linux图形驱动程序...
  13. linux驱动系列之挂载(转)
  14. python基本函数的导数公式_算法中的微积分:5大函数求导公式让你在面试中脱颖而出...
  15. AD7705驱动代码 -- Linux SPI设备驱动
  16. matlab中floor函数,floor函数
  17. Ubuntu 16 AX201网卡安装后无法使用WIFI解决办法
  18. 高翔orbslam_高翔Slambook第七讲代码解读(特征点提取)
  19. csgo 一键配置cfg、道具图、练枪图、连跳图
  20. 安装爬虫框架Scrapy,安装后运行不了~

热门文章

  1. ES6的Lambda表达式
  2. 小程序商品规格选择高亮功能的实现
  3. 【Linux】Linux 指令练习题 (一)
  4. Chromium-Dev中一些英文缩写
  5. Redis-5-实际应用
  6. 2021阳城一中高考成绩查询,山西高考分数线,晋城一中、阳城一中高考捷报这里都有...
  7. 我是一个坚持“朝九晚五”的程序员
  8. 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】
  9. asp.net医院信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
  10. Python打印空心等腰三角形