串口通信(用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 引用地址:串口通信(用CubeMX学习STM32)

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

推荐阅读最新更新时间:2024-11-11 12:15

STM32利用Flymcu进行烧录
烧录教程 刻录也叫烧录,就是把数据通过刻录机等工具刻制到光盘,烧录卡(GBA)等介质中,即大家说的下载。目前大家手中没有J-link和ST-link等其他仿真器,只能用串口烧录的仿真软件FlyMcu。 提前在A盘(资料盘)解压后,找到它 因为他是利用串口烧录的,就要下载串口的驱动。 1.串口驱动安装 驱动同样在A盘(资料盘),路径如下: 点击setup。 接着我们在STM32上USB_TTL处插入USB线,并连接上电脑,如果之前没有安装过CH340的驱动(如果安装过,则应该在设备管理器看到USB串口, 如果不能则先卸载之前的驱动,卸载完后重启电脑,再重新安装),则电脑会提示找到新硬件。 不用理会这个提示,直接
[单片机]
<font color='red'>STM32</font>利用Flymcu进行烧录
stm32 接收蓝牙(uart)等设备命令的处理
方法有两种: 方法1:查询法 static void BT_RX_Handler(void) { u8 data = USART_ReceiveData(USART2); if((BT_Buf_Status & 0x80) == 0) /* not complete */ { if(BT_Buf_Status & 0x40) { BT_RcvBuf = data; BT_RecCur++; if((data == 0xEC) && (8 == BT_RecCur)) //if((data == 0xEC)) { BT_Buf_Status |= (1 7); /* comple
[单片机]
STM32单片机Systick函数的使用方法
在“嵌入式学习006_Systick使用(一)”中,详细介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。Sys
[单片机]
STM32中485采用串口DMA发送,切换收发状态问题
RS485使用DMA发送,切换收发状态,有以下几种实现方式: 开启DMA的“发送完成中断”,在DMA的发送完成中断中,切换收发的状态。但是,这会导致最后的2个字节发送不出去,这是因为:DMA的“发送完成中断”出现在刚发送倒数第二个字节的起始位置,这个时候切换485的收发,若接收端不是奇校验的话 将会误收到0xFF 最后第一肯定也出不去。 网上提供的解决办法是:①在DMA的TC中断里面 加大于两个字节的延时 这是OK的。 ②在DMA的TC中断里面 开启USART的“发送完成中断” 去USART的中断里面去处理 这是OK的。 看数据手册,可以利用串口的“发送完成中断TC”实现。开启USART的DMA,开启DMA传输通道,开启USA
[单片机]
<font color='red'>STM32</font>中485采用串口DMA发送,切换收发状态问题
stm32之电源管理(实现低功耗)
前言:STM32F10xxx系列产品都有电源管理模块,芯片功耗会影响到一个产品的续航能力;比如在一些终端传感器场合里,为了减轻后期的维护投入,要求长期工作时间较长,更需要合理的芯片功耗管理。芯片自带几种运行模式,包括正常模式、睡眠模式、停止模式、待机模式。越往后,芯片的功耗越低,但能执行功能就越少。低功耗的电源管理策略就是在芯片不需要对外界响应的时候进入低功耗模式,而当外界条件满足的时候,退出低功耗模式(唤醒),正常执行处理工作。下面对其模式之间的转换和各个模式下的芯片内部的运转情况等一探究竟。 写代码前要先了解芯片的特性及工作原理,难免会先阅读一些长长的文档。下面核心讲解一些要点。 1.硬件原理 下图是芯片的电源框架:
[单片机]
<font color='red'>stm32</font>之电源管理(实现低功耗)
STM32时钟理解
一、硬件上的连接问题 如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 ii)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面i)节省2个外部电阻。 STM32时钟系统结构图 时钟是STM32单片机的脉搏,是单片机的驱动源。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它
[单片机]
<font color='red'>STM32</font>时钟理解
关于STM32中的GPIO位设置的相关纪要与总结
1.在对GPIOx_ODR的个别位进行编程时,软件不需要禁止中断。 2.GPIO具有锁定机制。主要是在一些关键引脚上为了防止程序跑掉而引起不必要的后果。 3.GPIO的库函数问题, GPIO_SetBits:置所选端口的一个或者多个位高; GPIO_ResetBits:相应的设置相应的一个或者多个位高; GPIO_Init:设置A,B,C,D,E端口的任一个I/O的输入输出配置信息,初始化I/O芯片; GPIO_Pin:设置带选择的引脚号(GPIO_Pin_1:选中1引脚); GPIO_Speed:设置所选中的引脚的频率(GPIO_Speed_10MHz); GPIO_Mode:设置所选中的引脚的工作状态,做以上几步都必须先定
[单片机]
基于STM32单片机的数据记录装置设计
  引言   本文针对电动汽车研究的实际需求,设计一款数据记录装置,该数据记录装置是搭建在电池能量管理系统基础上的,通过与能量管理系统通信,记录电动汽车实际运行时电池的外部状态(如:电池电压、电流、温度等),一方面为了研究电池的工作特性,另一方面为了对能量管理系统的工作情况做验证,为电动汽车动力电池的理论研究提供数据支持。   1 系统总体设计   本数据记录装置的设计包括硬件设计与软件设计两方面,软件设计主要包括数据接收的编程以及数据存储的编程,而硬件设计主要有几个方面:主控芯片的选择、复位功能的实现、电源模块、实时时钟、通信模块以及SD卡连接等。主控芯片是控制系统的核心,它内部所集成的模块越多,就能省去更多的外部电路,使
[单片机]
基于<font color='red'>STM32</font>单片机的数据记录装置设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved