STM32开发(7)----CubeMX配置串口通讯(轮询方式)

news2024/11/28 22:47:23

CubeMX配置串口通讯(轮询方式)

  • 前言
  • 一、串口的介绍
  • 二、实验过程
    • 1.实验材料
    • 2.STM32CubeMX配置PWM
    • 3.代码实现
      • 重载printf
      • 轮询接收
    • 4.编译烧录
    • 5.硬件连接
    • 6.实验结果
      • 重载printf结果
      • 串口轮询接收结果
  • 总结


前言

本章介绍使用STM32CubeMX对串口进行配置的方法,因为我的最小系统没有其他外设,所以使用串口进行调试很重要,首先实现重载printf串口输出,然后实现串口通讯有三种方式:轮询,中断和DMA,接下来进行逐一介绍 ,本章接仅仅实现串口轮询接收和重载printf功能。

一、串口的介绍

通用同步异步收发器 (Universal Synchronous Asynchronous Receiver and Transmitter) 是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。
在这里插入图片描述
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。 USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。

- 波特率

对于异步通信,没有时钟信号进行同步,因此需要事先定好设备之间的波特率。 波特率表示每秒钟传送的码元符号的个数,所以它决定了数据帧里面每一个位的时间长度。两个要通信的设备的波特率必须相同,我们常见的波特率是 4800、9600、 115200 等。

- 数据帧格式

数据帧格式也需要约定好,串口通信的数据帧包括起始位、停止位、有效数据位以及校验位。

  1. 起始位和停止位:串口通信的一个数据帧是从起始位开始,直到停止位。数据帧中的起始位是由一个逻辑 0的数据位表示,而数据帧的停止位可以是 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示,通讯双方要必须设定一致,一般情况下我们设为1。

  2. 有效数据位:数据帧的起始位之后,就接着是数据位,也称有效数据位,这就是我们真正需要的数据,有效数据位通常会被约定为 5、 6、 7 或者 8 个位长。有效数据位是低位(LSB)在前,高位(MSB)在后,一般情况下我们设定为8位。

  3. 校验位:校验位可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,无校验是指数据帧中不包含校验位。一般情况下我们使用无校验位。

二、实验过程

1.实验材料

  • STM32F103C6T6最小系统开发板

在这里插入图片描述

  • ST-LINK V2

在这里插入图片描述

  • 杜邦线
  • 示波器

2.STM32CubeMX配置PWM

选择芯片stm32f103c6t6,新建工程

在这里插入图片描述

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

在这里插入图片描述

配置时钟树,这里使用官方推荐的配置

在这里插入图片描述

stm32f103c6t6中有2个USART口,全都支持DMA方式,其中一个通讯速率可以达到4.5Mb/s,另个一通讯速录可达2.25Mb/s,都具有CTS和RTS信号引脚。
在这里插入图片描述配置引脚功能,从datasheet中可以PA8-PA11可以USART1的复用引脚,因为我们这里使用异步模式,所以仅仅需要TX和RX两个引脚(即PA9,PA10),这样就可以在PA9管脚得到PWM输出。datasheet截图如下:在这里插入图片描述
前面设置HSE时钟为72MHz;USART1的时钟挂载在APB2上
在这里插入图片描述![
CubeMX配置如下:
在这里插入图片描述
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9668266ed864849882aae9a530cbbcc.png)
SYS选项卡中Debug选项选择串口(这个选项可以设置,不会有影响)
在这里插入图片描述

Code Generator中设置只拷贝使用到的库,分离.c和.h文件

在这里插入图片描述

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

在这里插入图片描述

3.代码实现

重载printf

C语言中的标准库中所用的标准输入输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */

main函数如下,使用printf注意包含stdio.h头文件

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			printf("Hello STM32\r\n");
			HAL_Delay(1000);
		
  }
  /* USER CODE END 3 */
}

轮询接收

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	unsigned char data[16]= {0};
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Receive(&huart1, data, 8, 0xffff);

		HAL_UART_Transmit(&huart1, data, 8, 0xffff);
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

这里实现轮询接收,HAL_UART_Receive(&huart1, data, 8, 0xffff);函数的最后一个参数是超时数值,这里设置为0xffff,也就是说函数的执行超时是65535ms。

在接收函数中,如果65535ms还未接收完8个字节的数据,则会向后执行,如果接收完则立即向后执行。发送数据的函数也一样。

轮询模式使用起来最简单,但是会占用大量的cpu时间,在等待接收和等待发送完毕时,cpu不能去做别的运算,只能在这里空等,运行的效率很低。

4.编译烧录

代码编译成功

在这里插入图片描述
注意:一定要记住勾选MicroLIB选项哦!

在下载前检查keil是否检测到ST-LINK,选择魔法棒进行设置

在这里插入图片描述

如图所示,已经检测到ST-LINK 下载器

在这里插入图片描述

点击load,自动下载固件

在这里插入图片描述

5.硬件连接

烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源,PA9 PA10连接TTL转USB工具
在这里插入图片描述

6.实验结果

重载printf结果

在这里插入图片描述

串口轮询接收结果

在这里插入图片描述

总结

轮询方式:CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。

中断方式:当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。

直接内存存取技术(DMA)方式:所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。

本章介绍使用STM32CubeMX对串口进行配置的方法,首先实现重载printf串口输出,然后实现串口轮询接收功能,接下来介绍中断方式和DMA方式。

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

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

相关文章

​力扣解法汇总1797. 设计一个验证系统

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个…

vue:自定义组件如何使用v-model

问题: 在使用自定义组件时,我们有时候需要使用 v-model 来双向绑定。方法: 在vue中,v-model 的值相当于默认传递了一个名为 value 的 prop 和一个名为 input 的事件(注意,这个value的prop是需要在自定义组件…

《皮格马利翁效应》-期待效应

“ 人生没有白走的路,没有白读的书,你触碰过的那些文字会在不知不觉中帮你认知这个世界 #每天读本书 #关注我每天解读一本书”《皮格马利翁效应》01关于作者朱瑟琳•乔塞尔森,女性心理学家,是国际 公认的精神医学大师欧文•亚隆的…

刚刚,微软推出支持chatGPT的必应

文章目录刚刚,微软推出支持chatGPT的必应什么是新的必应?如何体验页面初体验结语:搜索引擎的新时代刚刚,微软推出支持chatGPT的必应 这款新的必应功能允许用户通过自然语言方式与chatgpt进行交流,以获得快速、准确的信…

华为HCIE学习之openstack基础

文章目录一、Openstack各种文件位置二、Openstack命令操作1.使用帮助三、用命令发放云主机1、创建租户2、创建用户并与租户绑定3、注册镜像4、创建规格5、创建公有网络及其子网(做弹性IP用)6、创建私有网络及其子网7、创建路由并设置网关与端口8、创建安…

C++类与对象(中)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类中一共有六个默认成员函…

当ChatGPT遇到网络安全

ChatGPT&#xff1a;是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务。GPT 是 …

活动星投票文艺巡演活动免费投票程序制作网页投票网站

“文艺巡演活动”网络评选投票_线上小程序的投票方式_视频投票的功能_在线投票程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务…

ConcurrentHashMap底层原理介绍

概述: ConcurrentHashMap相对于HashMap的性能较差一些,但相比于Hashtable而言性能要高很多,因为Hashtable内部的所有方法都是同步方法,加了synchronized锁,所以性能上比较差,但在多线程环境下是具有很强的安全性的ConcurrentHashMap避免了对全局加锁改成了局部加锁操作&#xf…

Go最新版下载 Go1.20版新特性

Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性&#xff0c;可以升级到 Go1.20&#xff0c;而不需要做任何代码改动。 可以使用你任何喜欢的方式升级&#xff1a; 比如&#xff1a; go install golang.org/dl/go1.20latest 具体的可以参考官网教程&#xff1a; ht…

简介DNS协议、ICMP协议、NAT技术

文章目录一、DNS 协议1.背景2.域名二、ICMP 协议1.功能2.格式3. ping 命令4. traceroute 命令三、NAT 技术1.基本理解2. NAT 转换过程3. NAPT4. NAT 技术的缺陷5. NAT 和代理服务器一、DNS 协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;&#xff0…

【头歌】串的运算及应用

串的运算及应用第1关&#xff1a;求子串任务描述本关任务&#xff1a;实现字符串的求子串操作。相关知识为了完成本关任务&#xff0c;你需要理解&#xff1a;1. 求子串操作&#xff0c;2.字符串的顺序存储。求子串操作从一个字符串S的某个位置开始截取若干个连续字符&#xff…

采样电路的3个组成部分

采样电路的使用实际上是电路的一个闭环控制过程&#xff0c;也可以理解为一个负反馈过程&#xff0c;采集的信号被传送到主控制芯片进行调整。今天就来为您介绍一下采样电路的三个组成部分分析&#xff01;一起来看看吧&#xff01; 这里的采样实际上分为电流采样、电压采样、…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第6天(动态规划 专题)】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有61天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

EMR Studio 要点梳理

文章目录1. 关系梳理2. 网络配置2.1 必须是在私有子网中的EMR集群才可以被EMR Studio连接吗&#xff1f;2.2 关于网络安全组&#xff1a;DefaultEngineSecurityGroup 和 DefaultWorkspaceSecurityGroupGit2.3 18888端口2.4 无法访问Github的解决方法3. 集成Windwos AD身份认证4…

【王道数据结构】第六章(上) | 图详解

目录 一、图的基本概念 二、图的存储 1、邻接矩阵法 2、邻接表法(顺序链式存储) 3、十字链表存储 4、邻接多重表 三、图的基本操作 四、图的遍历 1、广度优先遍历 2、深度优先遍历 一、图的基本概念 1、图的定义 2、无向图 若E是无向边 简称边) 的有限集合时&#xff…

如何使用MongoDB?

一&#xff1a;与MySQL区别 RDBMS 与 MongoDB 对应的术语&#xff1a; 类似于mysql&#xff0c;刚开始数据库、集合都是要创建之后才有的。 但是每次插入数据时都是插入一个对象&#xff0c;整个对象就是文档&#xff0c;对象的属性名就是字段。字段是不需在提前创建时声明的…

linux基本功之fsck命令详解

&#x1f493; 大家好&#xff0c;我是沐风晓月&#xff0c;双一流院校英语计算机双专业在读&#xff1b; &#x1f493; 想要学好Linux&#xff0c;命令是基本功&#xff0c;企业中常用的命令大约200多个&#xff0c;不管是写shell脚本还是管理操作系统&#xff0c;最常用的命…

理解Keil编译器中编译程序时出现的Code、RO-data、RW-data和ZI-data的含义

** 1&#xff1a;Code、RO-data、RW-data和ZI-data ** STM32单片机在keil开发环境下编译完成后&#xff0c;会显示: Program Size: Codexxxx RO-dataxxxx RW-dataxxxx ZI-dataxxxx 编译后的显示窗口如图所示&#xff1a; 其中Code、RO-data、RW-data和ZI-data是什么意思呢&…

基于OpenCV 的车牌识别

基于OpenCV 的车牌识别 车牌识别是一种图像处理技术&#xff0c;用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于 OpenCV 编写 Python 代码来完成这一任务。 车牌识别的相关步骤 1. 车牌检测&#xff1a;第一步是从汽车上检测车牌所在位置。我们将使用…