总结:通信引脚及连接方法。 通信数据流转过程中必须配置的串口参数。 与串口相关的库函数。 初始化串口的库函数。 步骤代码2.介绍超声的基础知识。 这是利用超声波的特性来检测距离的传感器。 它有两个超声波探头,每个探头用于发射和接收超声波。
注意! ! ! 即使不使用复用功能,也一定要打开复用功能时钟。
1.串口通信基础知识
1.
UART:通用异步发送器/接收器。
USART:通用同步异步发送器/接收器。
高容量STM32F10x系列芯片,包括3个USART和2个UART。
2. 通讯终端RXD和TXD如何连接
3. 通讯数据流处理
4.需要配置的串口参数
5. 串口相关的库函数
6. 串口函数库函数初始化流程
6.代码
void uart_init1(u32bound){ //GPIO为GPIO_InitTypeDef Define GPIO_InitStrStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//USART1,GPIOA打开clk USART_DeInit(USART1); _InitStructure.GPIO_Pin = GPIO_Pin_9; //PA .9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //输出模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //设置 PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;// GPIO_初始化(GPIOA, &GPIO_InitStructure); //设置PA10 //Usart1 NVIC NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//NVIC_Init(&NVIC_InitStructure);// //USART1USART_InitStructure.USART_BaudRate =bound;//9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//USART_InitStru cture.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(USART1, &USART_InitStructure); // USART_ITConfig(USART 1) , USART_IT_RXNE, ENABLE);// USART_Cmd(USART1 , ENABLE ); //}
2.超声波基础知识
简介:SR04是一款利用超声波的特性来检测距离的传感器。 它有两个超声波探头,每个探头用于发射和接收超声波。 测量范围为3-500cm。
1.基本原理
(1)首先使用STM32数字引脚13向TRIG引脚输入至少10us的高电平信号,触发模块的测距功能。
(2)当测距功能触发时,模块会自动发射8个40kHz超声波脉冲,并自动检测是否有信号返回。 此步骤在模块内自动完成。
(3) 当检测到回波信号时,ECHO 端输出高电平。 高电平的持续时间是超声波从发射到返回的时间。 此时,您可以使用计时器获取顶部时间并计算到被测物体的实际距离。 公式:距离=高电平时间*声速(340M/S)/2。
2. 电路图
p>
3、库函数编写流程
(1) 初始化超声波终端,打开相应的终端时钟。
(2)需要使用定时器来测量高电平返回的时间,因此必须对定时器(周期:1ms)进行初始化。
由公式(3)可知:距离=高电平时间*声速(340M/S)/2,所以我们需要创建一个函数将测量时间转换为距离并测量5次。 取平均值。
3.总体编程流程
1.串口初始化(带中断),打开串口。
2. 超声波引脚的初始化。
3. 初始化定时器(带中断)。
4. 创建测距函数
4. main 函数的输出
4. 代码(详细注释)
main 。 #include“motor.h”#include“stdio.h”#include“lay.h”#include“stm32f10x.h”#include“followline.h”#include“sys.h”#include“超声波.h"u8 UART3_数据,UART1_数据;u8 UART3_rcv[20],UART3_rcv_count;u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;int main(void){float length;lay_init();//延迟初始化 uart_init1(9600);//串口初始化 Ultrasonic_gpio_init( ); //初始化超声波引脚 Ultrasonic_time2_init();//初始化超声波定时器 while(1){ printf("开始工作!!/n");length=transfer_ditigal();printf("距离: %fcm/n", length ) ;lay_s(1);}}
ultrasonic.c
#include "ultrasonic.h"#include "stm32f10x_tim.h"#include "stm32f10x_rcc.h"int overcount; //计数变量/* * * **********************超声波引脚初始化**************** ********* ** ****************/void Ultrasonic_gpio_init(void){//超声波发送引脚//由GPIO_A定义初始化的结构体 GPIO_InitTypeDef GPIO_InitStruct_A; //打开PA引脚上的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //关闭PB4引脚上的特殊功能 GPIO_PinRemapConfig(GPIO_Remap_SW J_JTAGDisable,EN)); //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //配置PA15参数 GPIO_InitStruct_A.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct_A.GPIO_Pin=GPIO_Pin_15;GPIO_InitStruct_A.GPIO_Speed=GPIO_Speed_50MHz; //初始化PA15引脚A、&GPIO_InitStruct_A); //设置PA15 to Low GPIO_ResetBits(GPIOA, GPIO_Pin_15);//设置超声波接收引脚//PA12参数 GPIO_InitStruct_A.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitStruct_A.GPIO_Pin=GPIO_Pin_12;//初始化PA12引脚 GPIO_Init(GPIOA, &GPIO _InitStruc ) t_A);}/ * ****************************************************** ** ****** ****************************************** ************** ****** * ********** //******************** ************** 使用定时器 2 进行超声波初始化 * * ***************************** ******************** ********** ** ***/void Ultrasonic_time2_init(void){//定义结构体TIM_TimeBaseInitTypeDef即initialized by TIME_2 TIM_TimeBaseInitStruct_TIME2;//打开定时器2的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//设置TIME_2的参数 999; //初始化TIME_2TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct_TIME2) Masu. //定义NVIC初始化结构体 NVIC_InitTypeDef NVIC_InitStruct;//中断组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置NVIC参数 NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE ; .NVIC_ IRQChannelPreemptionPriority =2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; // NVIC 初始化 NVIC_Init(&NVIC_InitStruct); //清除定时器 TIME_2 更新中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //启用定时器 TIME_2 中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //启用定时器 TIME_2 //TIM_Cmd(TIM2,启用);}/************************************************ ********** * ****************************************** ********** * * ****************************************** ***//****************** ************************** 距离测量功能**************************************************** ***************** *****/ float transfer_digital(void){ float length =0,sum=0; U16 时间。 unsigned int i=0;/*测试5数据计算-平均值*/while(i!=5){ GPIO_SetBits(GPIOA,GPIO_Pin_15 );//拉高信号作为触发信号 Late_us(20);//高电平信号超过10us GPIO_ResetBits(GPIOA,GPIO_Pin_15);/*等待echo信号*/ while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12) ==RESET) ;TIM_Cmd(TIM2,ENABLE);//当echo信号到来时,启动定时器计数 i+ = 1; //每次收到回波信号+1,接收5次并计算平均值 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)== SET );//回波信号消失时 TIM_Cmd(TIM2,DISABLE);//关闭定时器time=TIM_GetCounter(TIM2);//获取回波信号时间计算时TIw2计数寄存器的计数值 length=(time+overcount*1000)/58.0;//通过回波信号计算距离 sum=length+sum; TIM2->CNT = 0; //清除 tiem2 计数寄存器的计数值 overcount = 0;//设置数量中断溢出清零 Late_ms(1);} length =sum/5;//距离作为函数返回值}/************************ ****************************************************** ********************************************************** ********** ***/void TIM2_IRQHandler() // TIM2 中断 { if (TIM_GetITStatus( TIM2, TIM_IT_Update))//检查 TIM2 更新中断是否发生 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// TIM2更新中断标志清除溢出++;}}
ultrasonic.h
#ifndef __ULTRASONIC_H#define __ULTRASONIC_H #include "stm32f10x_tim.h"#include "stm32f10x_rcc.h"#include "lay.h"#include "stm32f10x . h"#include "stm32f10x_gpio.h" float Transfer_ditigal(void);//距离显示 void Ultrasonic_gpio_init(void) ;//超声波引脚初始化 void Ultrasonic_time2_init(void);//超声波定时器初始化 #endif usart.c
#include "sys.h"#include "ultrasonic.h"#include "stdio.h"#include "sys.h"#include "usart.h"extern u8 UART3_data,UART1_data;extern u8 UART3_rcv[20],UART3_rcv_count;extern u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;//uart1 //bound:9600//use 要在不选择 MicroLIB 的情况下支持 printf 函数,请添加以下代码 #if 1#pragma import(__use_no_semihosting ) //支持标准库中所需的函数 __FILE { int handler; //定义 _sys_exit() 以避免使用半主机模式 void _sys_exit (int x) { x = x }; ch, FILE *f){ while((USART1->SR&0X40)==0); //发送循环发送直到完成 USART1->DR = (u8) ch 返回通道。 }#endif void uart_init1(u32bound){ //GPIO 定义 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;IC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//打开USART1,GPIOA clk USART_DeInit(USART1); //释放uart1 //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//输出模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //设置 PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_ IN_FLOATING;// GPIO_Init(GPIOA, &GPIO_Init结构); //设置PA10 //Usart1 NVIC NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//NVIC_InitStructure.NVIC_ IRQChannelCmd =ENABLE;//NVIC_Init(&NVIC_InitStructure);// //USART1USART_InitStructure.USART_BaudRate =bound;//9600;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(USART1, &USART_InitStructure); // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE );// USART_Cmd(USART1, ENABLE) ; //}//u art3 //bound:9600void uart_init3(u32bound){ //GPIO GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//打开USART3 clkRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开GPIOB clk USART_DeInit(USART3); //释放uart3 //USART3_TX PB.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10 GPIO_InitStructure.GPIO_S peed=GP IO_速度_50MHz; GPIO_InitStructure。 GPIO_Mode = GPIO_Mode_AF_PP;//输出模式 GPIO_Init(GPIOB, &GPIO_InitStructure); //设置 PB10 //USART3_RX PB.11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式 GPIO_Init( , &GPIO_InitStructure );//配置PB11 //Usart3 NVIC NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=5;//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//NVIC_InitStructure.NVIC_IRQChannelCmd = BLE;//NVIC_Init(&NVIC_InitStructure);// //USART_InitStructure.USART_BaudRate =bound;//9600;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(USART3, &USART_InitStructure); // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);// USART_Cmd( US ART 3、启用); // } void USART1_SendByByter( u8 Data){//USART_GetFlagStatus(USART1, USART_FLAG_TC);USART_SendData(USART1, Data);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}void USART3_SendByByter(u8 Data){//USART_GetFlagStatus(USART3, USART_FLAG_TC);USART_SendData(USART3, Data);while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);}void USART1_IRQHandler(void) //uart1 ISR{u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) ! = RESET) //{ Res =USART_ReceiveData(USART1);//(USART1->DR);// UART1_data=Res;if(Res==0x7E && UART1_rcv_count==0){ UART1_rcv[UART1_rcv_count++]=Res; } else if(Res!=0x7E && UART1_rcv_count>0) { UART1_rcv[UART1_rcv_count++]=Res; } else if(Res==0x7E && UART1_rcv_count>0) { UART1_rcv[UART1_rcv_count++]=Res; } else; }void USART3_IRQHandler(void) //uart3 ISR{if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收设置{UART3_data=USART_ReceiveData(USART3);//(USART1->DR);//UART3_rcv[UART3_rcv_count]=UART3_data;if(UART3_rcv_count
评论前必须登录!
注册