串口通信(用CubeMX学习STM32)

2020-04-29来源: eefocus关键字:串口通信  CubeMX  STM32

前言: STM32串口介绍

串行通信是单片机与外部设备或其他计算机交换信息的一个方式, 数据一位一位的按顺序传送, 其优点是只需要一条传输线, 协议简单, 但是缺点就是传送速度较慢。


串口是单片机上非常便捷的一个工具, 当写程序需要调试的时候, 它可以很方便的提供调试方法, 只要在一些关键代码执行的地方, 通过串口给串口调试助手发送相关信息, 就可以使我们很方便的查看代码在这个位置的执行情况。


下面看一下我所使用的单片机上串口的原理图接线

在这里插入图片描述

外部的发送端TXD就是单片机串口的接收端USART_RX,   外部接收端RXD就是单片机串口的发送端USART_TX

TXD : Transmit(TX) Data(D)  Receive(RX) Data(D))


USART就是Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行接收/发送器)的缩写 就是一个全双工的收发器


CH340是串口芯片, 当单片机用一根USB串口线接到电脑的时候, TXD就是指电脑通过数据线给单片机发送数据,对应单片机要接收数据, 因此单片机对应引脚就是RX(接收)


(电脑端发送) TXD -----> USART_RX(单片机接收)

(单片机发送) USART_TX-----> RXD (电脑端接收)

单片机上用跳线帽将PA10, PA9和USART1_RX, USART1_TX连接起来了, 所以我们只需对PA10, PA9配置即可

在这里插入图片描述

PA9就是USART1_TX, PA10就是USART1_RX

跳线帽将PA9和CH340的RXD, PA10和CH340的TXD连接起来了


下面开始Cube配置+IAR编程


3.1 操作简介

使用异步串口通信, 分别以轮询、中断、DMA方式使用串口发送数据进行与电脑的通信。 电脑端使用串口调试助手接收单片机发送的信息


3.2 轮询方式串口通信

单片机会不断查询串口对应引脚, 有通信需求就进行处理, 这样比较浪费CPU资源, 前面在中断里面也讲过, 中断可以很好地弥补这个。 这里先演示轮询方式


Step1 : Cube配置

新建一个工程, 同时也加入LED和按键等对应引脚的配置, 用以配合串口通信


(1) RCC和SYS配置

在这里插入图片描述

(2)USART1串口1配置

在这里插入图片描述

注释 :


关于异步传送(Asynchronous)和同步传送(Synchronous)


1、同步发送 : 发送方和接收方以同一个时钟源控制发送和接收。 就是当发送方发出数据后, 等待接收方发回响应后才发下一个数据包。


2、异步传送 : 数据在线路上是以一个字为单位传送, 各个字符之间可以是接连传送也可以是间断传送, 这完全由发送方根据需要来决定。 发送和接收双方分别用自己的饿时钟源来控制发送和接收。也就是说发送方发出数据后, 不等待接收方回应, 随时可以发送下一组数据


(3) 按键和LED引脚配置[Pinout & Configuration]

在这里插入图片描述

跟第二篇博客写的按键的配置一样的 点击下方蓝字快速回到第二篇博客

第一节补充: 按键操作(CubeMX加HAL库学STM32系列)


(4) 时钟树配置[Clock Configuration]

在这里插入图片描述

(5) 工程配置[Project Manager]

在这里插入图片描述

(6) 生成代码 (Generate)

在这里插入图片描述

Step2 : IAR或Keil编程


(1) 重定向printf函数

在学习C语言的时候, 大家肯定都用过printf这个函数, printf可以将指定字符打印到电脑的显示器上。


但是, 单片机要使用这个就要把他打印的方向改一下, 不是打印在电脑的命令行中, 而是打印到串口里面,传输到串口调试助手. 因此我们需要重定向printf函数。


重定向后我们要将调试信息打印到USART1中, 需要对printf所依赖的打印函数fputc()重定向在usart.c里面添加如下代码

在这里插入图片描述

#include "stdio.h"


/******************************************************************

*@brief  Retargets the C library printf  function to the USART.

*@param  None 

*@retval None

******************************************************************/


#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)

#else 

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__*/

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch;

}


上面除了重定向的代码, 还包含了一个标准库头函数, 最好加上这个, 因为printf函数就是这个库里面的, 不加的话有时候会出错或者警告


Tips : HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); 是通过串口1传输一个字符, ch为字符的地址, 0XFFFF表示超时时间 下面是这个函数的定义 Go to definition进入 stm32f4xx_hal_uart.c可以看这个函数定义

关于串口通信的其他接口函数都可以在 stm32f4xx_hal_uart.h文件里面找到声明

在这里插入图片描述

在stm32f4xx_hal_uart.h里面的一些串口通信相关功能函数

在这里插入图片描述

(2) 主函数

由于我们CubeMX配置了串口, 所以主函数里面也自动添加了串口初始化函数

在这里插入图片描述

下面添加测试printf的代码

在这里插入图片描述

/* USER CODE BEGIN 3 */

// 在while(1)里面循环扫描, 判断读取的按键引脚状态

// 判断 WK_UP 按键是否按下  

if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)

{

    HAL_Delay(10); // 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下

    if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)         // 如果确实按下了

    {

        while(HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET); // 松手检测, 即当这个按键松开后才进行下面的程序, 下同

        printf("key WK_UP was pressed rn");

    }

}


// 判断 KEY0 按键是否按下 

if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)

{

    HAL_Delay(10); // 延时10ms, 软件消抖

    if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)

    {

        while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);

        printf("key KEY0 was pressed rn");

    }

}

  /* USER CODE END 3 */


(3) 编译下载

在这里插入图片描述

关键字:串口通信  CubeMX  STM32 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic495901.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【STM32CubeMX】 串口通信(USART) Printf重定向
下一篇:STM32CubeMX系列教程 5.0版本环境开发——2.Uart串行通信功能

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

TI MSP430系列单片机串口通信波特率计算方法
TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N ,主要是计算出N。BRCLK:时钟源,可以通过寄存器设定何为时钟源; 通过寄存器UCAxCTL1的SSEL两位选择,01:ACLK,02:SMCLKN:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分,其中 UxBR1为高位,UxBR0为低位,两者结合起来为一个16位的字。举例说明:波特率=115200,时钟源=8MHz ,为外部晶体振荡器N=8000000/115200=69.44 。很明显:Ux
发表于 2020-06-06
HAL+Cube MX 学习之UART串口通信
一、UART’s Configuration在Connectivity的USART1配置中,Mode选择为Asynchronous(异步通信),Cube MX已经配置好了相关的引脚,下面的波特率没有特别要求,需要跟串口助手的波特率一致,常用的波特率是9600和115200,然后生成代码。二、Coding in MDK可以直接用printf来打印,打印的内容会在串口调试助手上显示,但是用printf需要添加头文件和函数,/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes
发表于 2020-05-18
HAL+Cube MX 学习之UART串口通信
【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
中断接收HAL库UATR接收与发送例程工程创建 1设置RCC设置高速外部时钟HSE 选择外部时钟源2设置串口1点击USATR1   2设置MODE为异步通信(Asynchronous)       3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1      接收和发送都使能 4GPIO引脚设置 USART1_RX/USART_TX5 NVIC Settings 一栏使能接收中断3设置时钟我的是  外部晶振为8MHz 1选择外部时钟HSE 8MHz 
发表于 2020-05-17
【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
51单片机串口通信(字符串接收和发送)
#include<reg52.h> //------------------串口通信协议-----------------///*    客户端数据包格式解释(长度恒为15):    例如:A01_fmq_01Off___#    A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)    01-----设备代号    fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部   
发表于 2020-05-12
【51单片机】(手把手教你)串口通信-基础篇
;;   j=0; } s[j]=SBUF; flag=1; if(s[j]=='#'||j==49) //以'#'作为传送字符串的结尾符,我定义的字符数组最长为50所以49也应该结束。 flag_t=1; else j++; }  if(TI)     //发送数据 { }  }运行截图:代码解读:基本上就是几个模块:计时器、中断以及串口通信中断寄存器介绍IE(interrupt enable):(可位寻址)设定各个中断源的打开和关闭IP(interrupt prior)中断优先级寄存器:(可位寻址)用来设定各个中断源
发表于 2020-05-12
【51单片机】(手把手教你)串口通信-基础篇
STM32CubeMX学习--(3)串口通信
Cube配置USART配置在Connectivity中选中USART1MODE = AsynchronousHardware Flow Control = DisableParameter Settings中配置Baud Rate = 115200Word Length = 8bitParity = NoneStop Bits =1Data Direction = Receive and TransmitOver Sampling = 16 SamplesNVIC Setting勾选Enable,Preemption Priority =2生成代码修改代码生成代码后,即可使用HAL_UART_Transmit_IT(&hua
发表于 2020-04-29
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved