STM32F407串口通信

news2025/1/17 0:54:04

本文是基于江科大B站视频编写,参考各种资料进行学习。
在这里插入图片描述

1、USART串口协议

在这里插入图片描述
在这里插入图片描述
硬件电路(接线)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、USART串口外设

在这里插入图片描述
常用波特率为9600、115200
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
必须对应特定引脚,才能实现通信,如果引脚冲突,看看有没有重映射来改变引脚。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
fpclk频率是指SPI所在的APB总线频率,APB1为fpclk1,APB2为fpclk2。
在这里插入图片描述

3、串口发送程序

(1)接线

在这里插入图片描述
为什么选用PA9、10这两个引脚,如下图:
在这里插入图片描述
实物:
在这里插入图片描述

(2)代码

(a)main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "serial.h"

int main(void)
{	
	Serial_Init();
	
	Serial_SendByte(0x41);
	
	uint8_t MyArray[] = {0x42, 0x43, 0x44, 0x45};
	Serial_SendArray(MyArray, 4);
	
	Serial_SendString("\r\nNum1=");
	
	Serial_SendNumber(111, 3);
	
	printf("\r\nNum2=%d", 222);
	
	char String[100];
	sprintf(String, "\r\nNum3=%d", 333);
	Serial_SendString(String);
	
	Serial_Printf("\r\nNum4=%d", 444);
	Serial_Printf("王哈哈\r\n");
	
	while (1)
	{
		
	}
}

(b)serial.c

#include "stm32f4xx.h"
#include "serial.h"
#include <stdio.h>
#include <stdarg.h>

void SERIAL_Init(void)
{
	  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
 
	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
	
	//USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

   //USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	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(USART1, &USART_InitStructure); //初始化串口1
	
  USART_Cmd(USART1, ENABLE);  //使能串口1 
	
} 

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
	}
}

int fputc(int ch, FILE *f)//为下面的函数做准备
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}



(c)serial.h

#ifndef __SERIAL_H 
#define __SERIAL_H 

#include <stdio.h>

void Serial_Init(void);//初始化
void Serial_SendByte(uint8_t Byte);//打印单个字符
void Serial_SendArray(uint8_t *Array, uint16_t Length);//打印数组
void Serial_SendString(char *String);//打印字符串(但只能选定一个USRATx)
void Serial_SendNumber(uint32_t Number, uint8_t Length);//发送数字
void Serial_Printf(char *format, ...);//打印字符串(可以发送多个USRATx)

#endif

(d)代码说明

1、 Serial_Printf("王哈哈\r\n"); //“\r\n”为换行符
打印中文还需要以下操作,二选其一(选第一比较容易操作):
在这里插入图片描述
然后关闭main.c,再打开,编译下载。
在这里插入图片描述
记得选择GBK即可打印中文

第二个操作(比较麻烦):
选UTF-8,同上,不过多了下面的步骤:
在这里插入图片描述

(3)实物效果

A的ASCII码为41,复位一次STM32发送一个A。
在这里插入图片描述

4、串口发送&接收程序

5、USART串口数据包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
程序现象,如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现&#xff0c;其基本过程为&#xff1a; 先根…

计算机网络P5~P7

目录 1.计算机网路性能指标 2.吞吐量 3.时延 4.时延带宽积 5.往返时间 6.利用率 7.丢包率 8.计算机体系结构 1.计算机网路性能指标 速率和带宽 速率 &#xff1a;每秒传输的比特的个数 单位 b/s kb/s mb/s gb/s 带宽&#xff1a;表示传送数据的能力 。带宽可以理解为高…

医院手术麻醉信息管理系统源码

医院手术麻醉信息管理系统源码 实现整个围术期术前、术中、术后的全数字化和信息化。 医院手术麻醉临床信息管理系统是一种基于云计算技术的信息系统&#xff0c;它可以帮助医院更好地管理手术麻醉临床信息&#xff0c;提高手术麻醉的安全性和效率。 首先&#xff0c;医院手术…

数学分析:多元微积分1

卓里奇的数学分析的好处在于直接从多元函数来入手多元微积分&#xff0c;引出矩阵&#xff0c;十分自然。 紧集的概念&#xff0c;感觉直接用闭集去理解就行&#xff0c;&#xff08;对于图形学来说&#xff09;。 多元函数的极限&#xff0c;其实和单元函数并没有什么区别。 这…

在你眨眼时,VR这样欺骗你的视觉

VR的沉浸感&#xff0c;可以让人仿佛置身于现实之外&#xff0c;还可以利用各种生物传感特性&#xff0c;来模拟一种具有存在感的虚拟空间。实际上&#xff0c;VR可以很好的欺骗人的感官&#xff0c;比如尽管你身处空间有限的房间中&#xff0c;但在VR中你仿佛已来到开阔的户外…

网络应用程序设计(idea版)——实验三:Web组件重用与JavaBeans

目录 实验预习报告 一、实验目的 二、实验原理 三、实验预习内容 实验报告 一、实验目的 二、实验要求 三、实验内容及要求 实验预习报告 一、实验目的 1. 理解静态包含和动态包含的概念&#xff0c;掌握相关指令和动作的使用&#xff1b; 2. 掌握JavaBeans的含义和…

路科验证UVM入门与进阶详解实验3

在UVM——lab3中&#xff0c;将SV环境移植到UVM的重点内容如下&#xff1a; TLM的单向、多向通信端口使用TLM的通信管道UVM的回调类型 uvm_callbackUVM的一些仿真控制函数TLM单向、多向通信 1、何为事务级、何为事务级通信&#xff08;TLM&#xff09;&#xff1f;有什么用&am…

禁用linux系统默认的22端口号

前提条件&#xff1a;在云平台上开放一个代替22的端口。 1、需查看服务器的防火墙是否开启&#xff0c; 命令&#xff1a;systemctl status firewalld.service 如果防火墙的状态为开启&#xff0c;在运行&#xff0c;需要先在防火墙增加端口 1.命令&#xff1a;firewall-cm…

【消息队列】Kafka如何实现高性能IO

我们直到Kafka是一个自称高性能的消息队列引擎&#xff0c;一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手&#xff0c;而消息从产生到消费&#xff0c;也会经历多个流程&#xff0c;比如在生产者端采用异步\同步方式发送&#xff0c;采用高效的压缩算法&#…

JavaWeb03 Cookie和Session

一个网站怎么证明你来过&#xff1f; 1.首次访问时服务器给客户端一个cookie&#xff0c;下次客户端再次访问会自动携带cookie&#xff0c;注意cookie可以是多个 2.首次访问时服务器登记了客户端一系列信息&#xff0c;下次客户端再进行访问时服务器自动匹配此客户端是否访问…

Win10搭建我的世界Minecraft服务器「内网穿透远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机转载…

Mac远程控制工具有哪些

适用于Mac的远程控制工具有很多&#xff0c;这里我们给大家列举五个常用软件。 1、Apple Remote Desktop 苹果自带远程桌面正如其名称所承诺的那样。作为 Apple 出品的应用程序&#xff0c;您可以想象它的配置和上手是多么容易。从 App Store 下载 Apple Remote Desktop 后&a…

ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现&#xff0c;它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程&#xff0c;以满足多线程并发执行任务的需要。 FutureTask作用 FutureTask的主要作用…

自动化篇 | 13 | app自动化:airtest

1 airtes简介 1.1 参考地址 http://airtest.netease.com/ # airtest官网 https://airtest.doc.io.netease.com/ # airtest操作方法 https://airtest.doc.io.netease.com/IDEdocs/faq/1_code_examples/ # 代码示例2 airtest架构 Airtest框架 3 airtest使用 3.1 打开界…

【C语言】猜数字游戏的实现

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1.思路&#xff08;代码会附在最后面&#xff09; 2.随机数函数rand 1.思路&#xff08;代码会附在最后面&#xff09; 首先实现一个猜数字游戏我们先要有一个思路&#xff1a;1.产生一个随机数 2.猜数字 3.可能猜大了 4.可能…

java简单一写一个springboot入门案例

首先 我们先打开idea编辑器 然后 选择File New>Project… 项目的话 我们选择 Spring lnitializr 右边的路径要改一下 然后 选择好路径之后 一定要要在后面加上 \项目名 例如 我这里 选择了 D盘下的学习案例下的springbootDom 项目名叫 threshold 那就这样配置 java版本选…

探索【PhySO】

目录0、 初步报错情况1、230、 初步报错情况 根据原链接&#xff0c;已确定安装成功&#xff0c;运行demo时出现报错&#xff0c;不能正常运行 报错&#xff1a; .Dummy epoch time 238.366736 ms .Dummy epoch time (w duplicate elimination) 180.852427 ms (found 15/1…

【结构型模式】代理模式

文章目录优秀借鉴1、简介2、结构3、实现方式3.1、案例引入3.2、静态代理3.3、JDK动态代理3.4、CGLIB动态代理4、区别对比4.1、静态代理和动态代理4.2、JDK动态代理和CGLIB动态代理5、代理模式优缺点6、应用场景优秀借鉴 设计模式&#xff08;四&#xff09;——搞懂什么是代理…

线段树的懒标记

上次看的那个视频讲线段树的时候压根没讲懒标记&#xff0c;然后我今天去写题目直接被薄纱&#xff01;都是70分&#xff0c;剩下3个节点tml&#xff01;&#xff01;&#xff01; 懒标记 我们在修改一些区间的时候&#xff0c;按照我昨天来学的来修改要改到最下面的叶节点去…

Visual Studio如何将UTF-8字符串输出到控制台

解决c语言使用libcurl库时控制台输出中文出现乱码的问题。 字符编码问题一直以来都是Windows系统的诟病&#xff0c;而Visual Studio也是饱受此诟病。由于历史原因&#xff0c;Windows系统对各个不同的国家地区可能采用不同的code page。由于早先Unicode并未发展成熟&#xff0…