#include "wave.h"
#include "sys.h"
#include "delay.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
/////////////////////////////////////////////////////////////////////////
//超声波模块初始化
//串口触发模式
/////////////////////////////////////////////////////////////////////////
//串口发送缓存区
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
#ifdef USART6_RX_EN //如果使能了接收
//串口接收缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART6_MAX_RECV_LEN个字节.
//通过判断接收连续2个字符之间的时间差不大于100ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过100ms,则认为不是1次连续数据.也就是超过100ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
u16 USART3_RX_STA=0;
#endif
u16 distance =0;
u16 Distance[2] = {0};
void MyWave_Init()
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphResetCmd(RCC_USART,ENABLE);//开启USART的时钟
RCC_APB2PeriphResetCmd(RCC_GPIO|RCC_APB2Periph_AFIO,ENABLE);//开启GPIO的时钟
//USART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = TX_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(TX_PORT, &GPIO_InitStructure);
//USART3_RX GPIOB.11
GPIO_InitStructure.GPIO_Pin = RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(RX_PORT, &GPIO_InitStructure);
//Usart NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = NVIC_USART;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
//USART 初始化设置
USART_InitStructure.USART_BaudRate = 9600;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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(USART3, &USART_InitStructure); //初始化串口3
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);//开启串口接受中断
USART_Cmd(USART3, ENABLE); //使能串口3
}
//void Ultrasonic_Cmd(char* fmt,...)
//{
// u16 i,j;
// va_list ap;
// va_start(ap,fmt);
// vsprintf((char*)USART3_TX_BUF,fmt,ap);
// va_end(ap);
// i=strlen((const char*)USART3_TX_BUF);//此次发送数据的长度
// for(j=0;j<i;j++)//循环发送数据
// {
// while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //等待上次传输完成
// USART_SendData(USART3,(uint8_t)USART3_TX_BUF[j]); //发送数据到串口3
// }
//}
u16 getDistance(void)
{
u16 distance =0;
// u8 distance_high = 0;
// u8 distance_low = 0;
USART_SendData(USART3,0x55);
//delay_ms(200);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
distance=USART_ReceiveData(USART3);
distance=distance<<8;
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
distance|=USART_ReceiveData(USART3);
// distance_low=USART_ReceiveData(USART3);
return distance;
}
void mesureDistance(void)
{
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_SendData(USART3,0x55);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
void USART3_IRQHandler(void)
{
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
Distance[0] = USART_ReceiveData(USART3);
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
Distance[1] = USART_ReceiveData(USART3);
// distance = (Distance[0] << 8) | Distance[1];
distance = Distance[0]*256 + Distance[1];
printf("距离 = %d mm",distance);
}
主函数
#include "stm32f10x.h"
#include "wave.h"
#include "sys.h"
#include "delay.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "usart.h"
/************************************************
ALIENTEK 战舰STM32F103开发板实验0
工程模板
注意,这是手册中的新建工程章节使用的main文件
技术支持:
www.openedv.com
淘宝店铺:
http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
int main(void)
{
// u8 distance_high = 0;
// u8 distance_low = 0;
// u16 distance =0;
// u16 s=0;
MyWave_Init(); //超声波模块初始化IO口
uart_init(115200); //串口初始化为115200
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
while(1)
{
mesureDistance();
delay_ms(1000);
}
}
求大佬帮忙看一下
下面讲解一下思路:通过串口3发送和接受字节,在主函数使用mesureDistance();开启发送0x55,使能超声波,并通过接收中断接收数据并在中断服务函数中进行距离的计算并用printf打印出去。
在测试程序是,发现程序死在等待发送标志位,注释掉等待发送成功的while后,用delay延时一段时间,发现又死在等待接收字节标志位置1上。超声波模块的跳线帽有接上,硬件没有接错,检查了几遍,几多测试仍然不行,实在没办法出来求助,希望好心人帮忙解答,拜托了!!!
#define __WAVE_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//超声波模块初始化
//串口触发模式
//////////////////////////////////////////////////////////////////////////////////
#define USART3_MAX_RECV_LEN 400 //最大接收缓存字节数
#define USART3_MAX_SEND_LEN 400 //最大发送缓存字节数
#define USART3_RX_EN 1 //0,不接收;1,接收.
#define TX_PORT GPIOB //TRIG(TX) 触发引脚
#define RX_PORT GPIOB //ECHO(RX) 回响引脚
#define TX_PIN GPIO_Pin_10 //TRIG
#define RX_PIN GPIO_Pin_11 //ECHO
#define RCC_GPIO RCC_APB2Periph_GPIOB //GPIO时钟初始化 RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC
#define RCC_USART RCC_APB1Periph_USART3//USART时钟初始化
#define NVIC_USART USART3_IRQn//USART的中断通道配置 接受中断
#define USART_NUM USART3;//开启第几个USART,编号
//#define RCC_TIM RCC_APB1Periph_TIM4 //定时器初始化,用于计算距离 须挂载在APB1下的
//#define TIM TIM4 //定时器
void MyWave_Init(void); //超声波模块初始化IO口
//void MyWave_StartMeasure(void); //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
//void MyWave_CalculateTime(void); //计算距离
u16 getDistance(void); //获取距离
void mesureDistance(void);
#endif
一周热门 更多>