stm32学习笔记——串口通信_stm32f103rct6有几路串口_HYY_Simmon的博客-程序员秘密

技术标签: 串口通信  stm32  笔记  

stm32学习笔记——串口通信


前言

最近一直在学习stm32单片机,总觉得记不住要点,所以想做点笔记已记录自己的学习并勉励自己坚持下去。串口部分的内容很久之前就学过了,最近做项目又遇到这部分内容。我这里使用的是stm32f103芯片。


一、什么是串口通信

 串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外。

STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK MiniSTM32 开发板所使用
的 STM32F103RCT6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工
单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA
等。

二、串口通信原理

1.同步通信和异步通信

同步通信:要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;
异步通信:不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

同步通信和异步通信存在不同,具体区别如图所示
在这里插入图片描述
另外,“异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。
异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定界还包含确定帧的结束位置。这有两种方法。一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。
“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。

2.stm32的usart特点

我们再来说下stm32串口都有哪些特点:
在这里插入图片描述

具体的知识部分可以通过百度或者查阅相关资料进行了解

三、软件部分

串口设置一般可以分为以下几个步骤:
在这里插入图片描述
可以写一个usart_init 函数,代码如下:

void uart_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

//USART1_TX   GPIOA.9

GPIO_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);//初始化GPIOA.9

//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART1, ENABLE); //使能串口1

}

这中间可以通过查看数据手册配置所需要的模式

小结一下,可能有不足和错误的地方。that ‘s’all

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JR_Smmon/article/details/116310160

智能推荐

使用putty连接Ubuntu虚拟机--SSH_putt 虚拟机_qq_38765090的博客-程序员秘密

早先是使用的是虚拟机都是可以直接连接的,没想到新装的Ubuntu竟然没有默认安装ssh。1、更新一下源 命令:sudo apt-get update2、下载ssh并安装 sudo apt-get install openssh-server3、查看是否开启了ssh服务 (没有开始的话使用命令sudo service  ssh  start)4、使用putty连接:...

安卓开发小程序源代码!半路出家Android程序员看我轻松逆袭!全网独家首发!_android开发小程序源代码_左夜天的博客-程序员秘密

前言现在已经进入招聘季节,本篇文章旨在分享知名互联网企业面试官面试方法和心得,希望通过本文的阅读能给程序员带来不一样的面试体验和感受,放松面试心态,积极备战!阿里技术一面-35min自我介绍Android有没有遇到OOM问题(有遇到内存泄漏问题)Handler机制ThreadLocalActivity启动到加载View过程View绘制过程LinearLayout (wrap_content) & TextView (match_parent) 最终结果???OKHttp(1.

我去,安卓11来了,快!起来填坑了_xhmj12的博客-程序员秘密

作者| Zhujiang地址|juejin.im/post/5e9d16a051882573a94a34a2前言安卓更新换代非常快,5.0之前版本更新的时间线有点看不懂,但5....

retrofit2 发送json数据_使用Retrofit2在POST请求中发送JSON_weijie.tong的博客-程序员秘密

小编典典在gradle中使用这些compile 'com.squareup.retrofit2:retrofit:2.3.0'compile 'com.squareup.retrofit2:converter-gson:2.3.0'compile 'com.squareup.retrofit2:converter-scalars:2.3.0'使用这两个POJO类........LoginData....

随便推点

1.3编程基础之算术表达式与顺序执行_Dolor_Nan的博客-程序员秘密

01:A+B问题 总时间限制: 1000ms 内存限制: 65536kB 描述 在大部分的在线题库中,都会将A+B问题作为第一题,以帮助新手熟悉平台的使用方法。A+B问题的题目描述如下:给定两个整数A和B,输出A+B的值。保证A、B及结果均在整型范围内。现在请你解决这一问题。输入 一行,包含两个整数A,B,中间用单个空格隔开。A和B均在整型范围内。 输出 一个整数,即A+B

使用Glide加载网络图片,显示到高德地图的marker_薛瑄的博客-程序员秘密

使用Glide加载网络图片,显示到高德地图的marker,会遇到一些问题,下面将逐一讲解每个问题的解决方法一、marker显示网络图片问题问题:使用Glide加载网络图片,显示到高德地图的marker上,会出现,有时候显示占位符,有时候显示正常的网络图片。网络图片是可以随时正常访问的。分析:1、marker 显示的是一个自定义的view A 2、显示maker的时候,Glide加载网络图片,显示到

OpenGL中shader读取实现_weixin_30371469的博客-程序员秘密

1.需要shader在OpenGL中工作,必须经过如下过程2.代码实现/*********** loadshader.h**********/#pragma once#define _CRT_SECURE_NO_WARNINGS 1#define WIN32_LEAN_AND_MEAN 1#define GLFW_NO_GLU 1#include <Windows....

C#实现笔记本自带蓝牙与汇承HC-08(BLE)蓝牙模块通讯_Vishera的博客-程序员秘密

汇承HC-08蓝牙C#通讯 目录问题背景感谢BLE介绍参考代码参考业务逻辑参考库和例程难点介绍难点介绍新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入问题背景因最近新项目需要与蓝牙仪器通讯,起初以为很简单,搜索一下C#蓝

程序猿苦逼的一生,看完泪奔!_weixin_33965305的博客-程序员秘密

世间有一种生物,人称“程序猿”对于程序员的趣闻,莫过于,“男程序员都是秃头,女程序员满脸痘痘”“城未攻,发先掉”事实真如上所说的那样吗?他们每天真实的生活到底是啥样呢?视频来源:暴走漫画bilibili每天生活情景大概如下男主是一名程序猿,工作任务就是不停地解决Bug每天生活就是上班休息继续上班反反复复就算娱乐,也就是和同事聊天,内容都是二叉树、逻辑学、数学等有一...

消费kafka的消息,并将其SparkStreaming结果保存到mysql_weixin_30344131的博客-程序员秘密

将数据保存到mysql,需要用到jdbc。为了提高保存速度,我写了一个连接池1.保存到mysql的代码package test05import org.apache.log4j.{Level, Logger}import org.apache.spark.rdd.RDDimport org.apache.spark.sql.types._import org.apache.spark.sq...

推荐文章

热门文章

相关标签