新人求助,关于us-100的串口触发方式无法实现的问题

2019-10-11 15:01发布

#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上。超声波模块的跳线帽有接上,硬件没有接错,检查了几遍,几多测试仍然不行,实在没办法出来求助,希望好心人帮忙解答,拜托了!!!



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
洪培隆
1楼-- · 2019-10-11 19:49
#ifndef __WAVE_H
#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


洪培隆
2楼-- · 2019-10-11 21:52
哇,(&#3665;&#336;д&#336;)b,求大佬帮助!!!!!
洪培隆
3楼-- · 2019-10-11 22:12
自顶!!!!
正点原子
4楼-- · 2019-10-11 23:50
 精彩回答 2  元偷偷看……
洪培隆
5楼-- · 2019-10-12 01:57
洪培隆
6楼-- · 2019-10-12 02:41
没人理,,,

一周热门 更多>