(末尾附文件)
仿真图如下所示:
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f4xx_rcc.h" // Keil::Device:StdPeriph Drivers:RCC
#include "stm32f4xx_syscfg.h" // Keil::Device:StdPeriph Drivers:SYSCFG
#include "stm32f4xx_usart.h" // Keil::Device:StdPeriph Drivers:USART
#include "misc.h"
#include "Systick.h" //精准延时函数的头文件
#include "SR04.h"
#include
int fputc(int ch, FILE *f) //函数重定向
{
USART_SendData(USART1, ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
void Usart1_SendString(char *str) //自定义一个字符串发送函数
{
char *p = str;
while(*p != '\0')
{
USART_SendData(USART1, *p);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
p++;//偏移字符串
}
}
void BUZZ_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //GPIO初始化结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//2,设置PD0工作模式 ==》推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ; //引脚号
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //快速 ,速度越快,性能越强,功耗越大
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //GPIO初始化结构体变量
//1,打开A组GPIO时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//2,设置PA0工作模式 ==》推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2| GPIO_Pin_3; //引脚号
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //快速 ,速度越快,性能越强,功耗越大
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Usart1_Init(void) //串口初始化函数
{
GPIO_InitTypeDef GPIO_InitStruct; //GPIO初始化结构体变量
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1)使能串口时钟 --》串口1的时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//2)开启对应引脚时钟 --》PA9,PA10 --> RCC_AHB1PeriphClockCmd()
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//3)设置PA9,PA10为复用推挽功能
//将PA9,PA10设置为复用功能引脚,作为串口1的发送接收引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 ; //引脚号
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //快速 ,速度越快,性能越强,功耗越大
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
//4)使用函数USART_Init()初始化串口功能
USART_InitStruct.USART_BaudRate = 9600; //波特率
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; //硬件控制流
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送和接受
USART_InitStruct.USART_Parity = USART_Parity_No; //校验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //字长 8位
USART_Init(USART1, &USART_InitStruct);
//5,配置串口1 NVIC中断,中断分组,开启串口中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
//6,打开串口
USART_Cmd(USART1, ENABLE);
//7,使能串口中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
void USART1_IRQHandler(void) //串口1中断执行函数,每次接收到1字节就产生一次中断
{
uint8_t d; //定义一个变量接受数据
//判断串口接受的数据标志位
if( USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//如果有数据到达,那我就接受数据
d = USART_ReceiveData(USART1);
//接收到数据之后,通过串口1 的发送引脚将数据发送出去 TXD,如果有数据到达,可以通过串口助手查看内容
USART_SendData(USART1, d);
//等待串口发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
}
.
链接:https://pan.baidu.com/s/1OOKNtRG_NoQyFmW-VWKeAw
提取码:9c9h
.