自学内容网 自学内容网

STM32F407之超声波模块使用

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "includes.h"
#include "HC_SR04.h"

int main()
{

OS_ERR err;//错误

uart_init(9600);//串口初始化
//超声波初始化
HC_SR04();


//OS初始化 他是第一个运行的函数 初始化各种变量各种全局变量 列如 中断嵌套 优先级 存储器等
OSInit(&err);
//创建任务1
OSTaskCreate((OS_TCB *)&HC_SR04_TCB,//任务控制块,等同于线程id
(CPU_CHAR *)"HC_SR04",//任务的名字,名字可以自定义的
(OS_TASK_PTR)HC_SR04_Init,//任务函数,等同于线程函数
(void *)0,//传递参数,等同于线程的传递参数
(OS_PRIO)6, //任务的优先级6
(CPU_STK *)HC_SR04_STK,//任务堆栈基地址
(CPU_STK_SIZE)128/10,//任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE)128,//任务堆栈大小
(OS_MSG_QTY)0,//禁止任务消息队列
(OS_TICK)0,//默认时间片长度
(void  *)0,//不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE,//没有任何选项
&err//返回的错误码
);

//启动OS,进行任务调度
OSStart(&err);


}

#include "HC_SR04.h"
#include "delay.h"
#include "usart.h"
/*
引脚
PB12 TRIG 输出模式
PB13 ECHO 输入模式


*/
#define TRIG_SET(x)  (x)?GPIO_SetBits(GPIOB,GPIO_Pin_12):GPIO_ResetBits(GPIOB,GPIO_Pin_12)
//#define ECHO_READ GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
#define  ECHO_READ    GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
static GPIO_InitTypeDef  GPIO_InitStructure;

void HC_SR04(void)
{
//启用GPIO时钟
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

//给引脚PB2 TRIG 配置输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  // 推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速率
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //无拉

//给PB13引脚配置输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;        //输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //无拉

GPIO_Init(GPIOB, &GPIO_InitStructure);
TRIG_SET(0);

}

//获取数据模块自动发送8bit
uint8_t Get_Data(void)
{

uint8_t cnt = 0;
TRIG_SET(1);//发送数据高电平
delay_us(15);//至少延迟10us
TRIG_SET(0);//停止发送

while(ECHO_READ == 0);//等待高电平出现

while(ECHO_READ == 1)//高电平出现
{
/*
声速340m/s
340m= 340*100cm = 340*100*10mm3mm
--------------------------------------- = ----------
1s = 1000ms = 1000000us?  = 8.8us
*/
delay_us(9);//为什么要延迟9us   

cnt++;
}
//计算出来的距离则要/2
cnt= cnt/2;
return cnt;
}

//-----------------------------------------------------------
//操作系统任务块
//任务块
OS_TCB HC_SR04_TCB;

void HC_SR04_Init(void *parg);//函数名称

CPU_STK HC_SR04_STK[128]; //任务堆栈 大小128 也就是512

void HC_SR04_Init(void *parg)
{
uint8_t distance = 0;

while(1)
{

distance = Get_Data();

printf("distance is %d mm\n",distance);

delay_ms(1000);

}


}










#ifndef __HC_SR04_H
#define __HC_SR04_H    
#include "stm32f4xx.h"
#include "includes.h"
void HC_SR04(void);
uint8_t Get_Data(void);

//任务块
extern OS_TCB HC_SR04_TCB;

extern void HC_SR04_Init(void *parg);//函数名称

extern CPU_STK HC_SR04_STK[128]; //任务堆栈 大小128 也就是512
#endif

 


原文地址:https://blog.csdn.net/m0_60615238/article/details/142466284

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!