我在高职教STM32——串口通信(3)

        大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享出来,主要面向广大师生朋友,单片机老鸟就略过吧。欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!

        通信,按照传统的理解就是信息的传输与交换。对于像STM32这样的单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。没有通信,单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将自己产生的信息告诉其它设备。如果单片机通信没处理好的话,它和外围器件的合作程度就会受到限制,最终整个系统也无法完成强大的功能,由此可见单片机通信技术的重要性。UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间、单片机和单片机之间、单片机与外围器件的通信。

【学习目标】

  1. 知道通信基本概念的含义;
  2. 理解通信机制中物理层和协议层分离的理念;
  3. 学会配置STM32的串口功能;
  4. 了解printf()函数“打印”至串口的实现过程;
  5. 掌握使用串口调试软件对单片机的调试方法。

        STM32串口通信涉及的知识较多,为了不让篇幅太长,本章打算分五个部分来讲解,本文是第三部分。

三、STM32串口必知的关键信息

        STM32的串口资源相当丰富的,功能也相当强劲。我们所使用的STM32F103RET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC规范、具有DMA等。对于初学者,暂时不必去硬啃这些复杂的功能,关注最基本的用法和配置即可。

3.1 用串口“打印”调试信息

        虽然STM32的串口功能异常强大,但最基本的应用就是“打印”程序信息,一般在硬件设计时都会预留一个串口连接电脑,用于在调试程序时把一些信息“打印”在电脑端的串口助手软件上,从而了解程序运行是否正确、如果出错了具体哪里出错等,图13展示了通过串口“打印”调试程序的场景。

图13 串口“打印”调试信息

3.2 USART与UART

        通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

3.3 STM32串口引脚分布

        STM32F103RET6有三个USART和两个UART,引脚分布见表1。其中USART1的时钟来源于APB2总线(最高72MHz),其他四个的时钟来源于APB1总线(最高36MHz)。UART只是异步传输功能,所以没有SCLK、nCTS和nRTS功能引脚。

表1 STM32F103芯片串口引脚分布

        如图14所示,我们的开发板使用了USART1和USART2,前者用来“打印”调试信息,后者用来与开发板上的WiFi或GPRS模块通信。这里我们只关注前者,并在表1中做了底纹标注,这两个引脚的配置会在下面讲解串口初始化的时候体现出来。 

图14 开发板上所使用的串口

四、STM32串口编程准备

4.1 串口初始化结构体详解

        通过前面的实验我们已经知道,标准库函数对每个外设都建立了一个初始化结构体,串口也不例外,即 USART_InitTypeDef,结构体成员用于设置串口工作参数,并由串口初始化配置函数 USART_Init() 调用,这些设定参数将会设置串口相应的寄存器,达到配置串口工作环境的目的。

        USART初始化结构体定义在 stm32f10x_usart.h 中,我们将其摘录在代码清单1中。初始化库函数定义在 stm32f10x_usart.c 中,编程时我们可以结合这两个文件内注释使用。

//-------------------------------------------------
// 代码清单1:USART_InitTypeDef结构体
//-------------------------------------------------typedef struct {uint32_t USART_BaudRate;            //波特率uint16_t USART_WordLength;          //字长uint16_t USART_StopBits;            //停止位uint16_t USART_Parity;              //校验位uint16_t USART_Mode;                //工作模式uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;
  • USART_BaudRate:波特率,一般设置为2400、9600、19200、115200。
  • USART_WordLength:数据帧字长,可选USART_WordLength_8b(8位)或USART_WordLength_8b(9位)。如果没有使能奇偶校验控制一般使用8数据位;如果使能了奇偶校验,则一般设置为9数据位。
  • USART_StopBits:停止位设置,可选USART_StopBits_0_5(0.5个)、USART_StopBits_1(1个)、USART_StopBits_1_5(1.5个)和USART_StopBits_2(2个)停止位,一般我们选择1个停止位。
  • USART_Parity :奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)、USART_Parity_Odd(奇校验)。
  • USART_Mode:USART模式选择,有USART_Mode_Rx和USART_Mode_Tx,允许使用逻辑或运算选择两个。
  • USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,一般选择不使能硬件流。

4.2 串口通信与中断控制

        我们在使用串口进行数据收发时往往需要配合中断来进行控制,尤其是当STM32接收到从PC端发来的信息时,程序跳转至相应的中断服务函数中运行。当然,STM32为串口规划了好多的中断请求事件,见表2。可以说,STM32串口通信过程中的任何风吹草动都可以引起中断,就看你程序需不需要而已,但我们常用的也就是表中用底纹标记的两类。

表2 USART中断请求标志

(第三部分完,共五部分) 

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

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

相关文章

编织文字之美:WebKit的CSS文本格式化能力全解析

编织文字之美:WebKit的CSS文本格式化能力全解析 在网页设计中,文本不仅是传递信息的媒介,更是展现美学的重要元素。WebKit,作为Safari、QQ浏览器等众多浏览器的内核,提供了强大的CSS文本格式化支持。通过CSS&#xff…

Kubernetes Service 之 LoadBalancer

Kubernetes 之 LoadBalancer 定义 负载均衡器 (LoadBalancer) 是 Kubernetes 中用来对外暴露 Service 服务的,它可以将服务集中到一个公共 IP 上。我们常用 MetalLB 作为自建均衡器。 使用 安装 MetalLB kubectl apply -f https://raw.githubusercontent.com/m…

pandas库方法汇总介绍

目录 1. assign() 新增一列 1. assign() 新增一列 >>> df pd.DataFrame({temp_c: [17.0, 25.0]}, ... index[Portland, Berkeley]) >>> dftemp_c Portland 17.0 Berkeley 25.0Where the value is a callable, evaluated on df: &…

vue slot:为什么 $slots 无值而 $scopedSlots 有值?

在 Vue.js 中,$slots 和 $scopedSlots 是组件实例上用于访问插槽内容的两个属性,但它们各自有不同的用途和表现方式,特别是在处理作用域插槽(scoped slots)时。 $slots $slots 是一个包含所有插槽内容的对象。对于普…

使用Python爬虫下载视频源码

一、引言(●ˇ∀ˇ●) 在当今互联网时代,视频内容已成为人们获取信息和娱乐的重要方式。有时,我们可能希望将这些视频下载到本地,以便在没有网络的情况下观看。本文将介绍如何使用Python编写一个简单的爬虫。 二、环境准备😘 在…

Nginx部署前端项目尝试 - windows版

前端还是要学一点服务器端的东西,才能更好的理解一些知识 1、项目打包 生成dist 2、下载nginx解压,start nginx 启动 浏览器输入 localhost 显示如下页面表示启动成功 3、配置nginx server {listen 8080;# ip 不要加http 前后不要加 /server_name…

结合金融场景的Scipy模块编程

结合金融场景的Scipy模块编程 数据链接:https://pan.baidu.com/s/1VMh8-4IeCUYXB9p3rL45qw 提取码:c6ys import numpy as np import pandas as pd import statsmodels import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-se…

蓝牙耳机推荐哪个品牌?四款必入热门蓝牙耳机品牌推荐

面对市场上琳琅满目的蓝牙耳机品牌和型号,选择一款合适的蓝牙耳机可能会令人感到困惑,蓝牙耳机推荐哪个品牌?为了帮助大家做出明智的决策,我将带来四款必入热门蓝牙耳机品牌推荐,均是我自用还不错的,大家可…

VisualRules-Web案例展示(一)

VisualRules单机版以其卓越的功能深受用户喜爱。现在,我们进一步推出了VisualRules-Web在线版本,让您无需安装任何软件,即可在任何浏览器中轻松体验VisualRules的强大功能。无论是数据分析、规则管理还是自动化决策,VisualRules-W…

【JavaScript 算法】堆排序:优先队列的实现

🔥 个人主页:空白诗 文章目录 一、算法原理堆的定义堆排序的步骤 二、算法实现构建最大堆注释说明: 三、应用场景四、总结 堆排序(Heap Sort)是一种基于堆数据结构的排序算法,具有较好的时间复杂度表现。堆…

JDBC常见用法

JDBC中主要的类及常用方法 Class类 Class类全称java.lang.Class,Java程序运行时会自动创建程序中的每个类的Class对象,通过Class类的方法,可以得到程序中每个类的信息。Class类方法主要包括: public static Class forName(S…

Electron案例解析——切换主题颜色的案例

效果图 核心 Electron的 nativeTheme.themeSource属性,值是string。有三个参数:system, light 和 dark,用来覆盖、重写Chromium内部的相应的值 Election的api描述值nativeTheme.themeSource被用来覆盖、重写Chromium内部的相应的值system, …

邮件安全篇:邮件传输加密(SSL/TLS or STATRTTLS)

1. 前言 使用过邮件客户端的同学一定见过下面这张图。这是客户端账号配置界面,里面有SSL、STARTTLS选项。刚接触邮件客户端的同学肯定会有这些疑问:什么是SSL?什么是STARTTLS?两者有什么区别?具体该如何选择呢&#x…

Stable Diffusion 使用详解(2)---- 图生图原理,操作,参数

目录 背景 图生图原理 基本原理 1. 扩散模型基础 2. 图生图的具体流程 3. 关键技术点 4. 应用实例 CLIP 原理 1.基本概念 2. 核心特点 使用及参数 随机种子 重绘幅度 图像宽高 采样方法 1. DPM(扩散概率模型) 2. SDE(随机微…

能源化工5G防爆终端能给行业带来什么重要作用?

在能源化工领域,5G防爆终端的引入无疑为行业带来了革命性的变革与重要作用。这些集成了先进5G通信技术和防爆设计的高端设备,不仅提升了生产作业的安全性,还极大地增强了运营效率与智能化水平。 高速、低延迟的5G网络为防爆终端提供了前所未有…

机器人控制:物理人机交互控制中的不稳定性因素及其解决思路

机器人控制:物理人机交互控制中的不稳定性因素及其解决思路 物理人机交互控制中的不稳定性是指在机器人或相关物理系统与人类进行交互时,系统行为表现出的一种非预期、不可控或难以预测的动态特性。这种不稳定性可能源于多个方面,包括但不限于…

SPA Fiori开发实战课程(一)

前言 由于工作需要,对Fiori的开发有了一些具体实践,所以做一些记录和总结。 准备工作 1. 对前端有一定的了解,熟悉Node.js,Vue等前端服务器和基础框架。 2. 后端使用ABAP系统。 3. 使用Visual Studio Code进行开发。 工程搭建 打…

基于springboot+vue+uniapp的开放实验室预约管理系统

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

快速创建 vue 项目并添加 Dockerfile 文件

文章目录 快速创建 vue 项目方法 1:使用 Vue CLI方法 2:使用 create-vueVue 前端 Dockerfile 镜像基于 Node 镜像,打包运行基于 Nginx 镜像,直接运行参考🚀 本文内容:使用 Vue CLI / create-vue 快速创建一个 vue 项目,并添加 Dockerfile 镜像实现打包启动。 ⭐ 前提条…

通信流程:https【SSL/TLS】,git仓库【https/SSH】,蓝牙【面对面快传/AirDrop】

目录 HTTPS HTTP(80端口) SSL/TLS协议(传输层,443端口) 密文传输:SSL的后续版本TLS TLS1.2握手 1.摘要算法(散列函数 Hash Function):验证信息的完整性,不可逆 第三方认证 引…