【STM32】基于STM32F407实现串口通信
目录
- 一、通用同步异步收发器 (USART)
- 1.USART 简介
- 2.USART 功能说明
- 3.USART框图
- 二、基于HAL库实现串口通信
- 1.工程创建
- 2. HAL库UART函数库介绍
- 3.USART接收与发送
- 三、总结
- 四、参考
一、通用同步异步收发器 (USART)
1.USART 简介
通用同步异步收发器 (USART)
能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ
异步串行数据格式的要求。USART
通过小数波特率发生器提供了多种波特率。
它支持同步单向通信
和半双工单线通信
,还支持LIN(局域互连网络)
、智能卡协议与 IrDA(红外线数据协会)SIR ENDEC 规范
,以及调制解调器操作 (CTS/RTS)
。而且,它还支持多处理器通信
。
通过配置多个缓冲区使用DMA
可实现高速数据通信。
2.USART 功能说明
接口通过三个引脚从外部连接到其它设备。任何USART 双向通信
均需要至少两个引脚:接收数据输入引脚 (RX)
和发送数据引脚输出 (TX)
:
RX
:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
TX
:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据(USART 电平下,随后在SW_RX上接收数据)。
正常USART
模式下,通过这些引脚以帧的形式发送和接收串行数据:
- 发送或接收前保持空闲线路
- 起始位
- 数据(字长 8 位或 9 位),最低有效位在前
- 用于指示帧传输已完成的 0.5 个、1 个、1.5 个、2 个停止位
- 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数
- 状态寄存器 (
USART_SR
) - 数据寄存器 (
USART_DR
) - 波特率寄存器 (
USART_BRR
) - 12 位尾数和 4 位小数 - 智能卡模式下的保护时间寄存器 (
USART_GTPR
)
在同步模式
下连接时需要以下引脚:
- SCLK: 发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI 主模式进行同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉冲)。
RX
上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动器)。时钟相位和极性可通过软件编程。在智能卡模式下,SCLK 可向智能卡提供时钟。 - nCTS: “清除以发送”用于在当前传输结束时阻止数据发送(高电平时)
- nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)
3.USART框图
二、基于HAL库实现串口通信
1.工程创建
(1)新建工程
选择New Project
选择芯片型号,并创建工程
(2)设置RCC
- 设置高速外部时钟HSE 选择外部时钟源
(3)设置串口
- 1.点击USATR1
- 2.设置MODE为异步通信(Asynchronous) 。
- 3.基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit,无校验位,1位停止位 ,接收和发送都使能。
- 4.GPIO引脚设置
USART1_RX
/USART_TX
。 - 5.
NVIC Settings
一栏使能接收中断
(4)项目文件设置
- 1 设置项目名称
- 2 设置存储路径
- 3 选择所用IDE
(5)创建工程文件
然后点击GENERATE CODE
创建工程,完成创建。
2. HAL库UART函数库介绍
UART结构体定义
UART_HandleTypeDef huart1;
UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的uart串口的别名,默认为huart1,可以自行修改。
串口发送/接受函数
- HAL_UART_Transmit();串口发送数据,使用超时管理机制
- HAL_UART_Receive();串口接收数据,使用超时管理机制
- HAL_UART_Transmit_IT();串口中断模式发送
- HAL_UART_Receive_IT();串口中断模式接收
- HAL_UART_Transmit_DMA();串口DMA模式发送
- HAL_UART_Transmit_DMA();串口DMA模式接收
串口发送数据:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。
参数:
- UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1 。
- *pData 需要发送的数据
- Size 发送的字节数
- Timeout 最大发送时间,发送数据超过该时间退出发送
举例:
HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff); //串口发送三个字节数据,最大传输时间0xffff
3.USART接收与发送
- 在 stm32f4xx_hal.c中包含
#include <stdio.h>
#include "stm32f4xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1; //声明串口
- 在stm32f4xx_hal.c 中重写
fget
和fput
函数
/*** 函数功能: 重定向c库函数printf到DEBUG_USARTx*/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx*/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;
}
重写后便可以使用printf()
函数和Scanf()
,getchar()
函数
- 修改main.c
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){printf(" Hello Windows \r\n");HAL_Delay(1000);}}
编译工程
有一个警告,不影响。
烧录程序
使用FlyMcu
进行烧录,设置波特率为115200
串口调试
使用串口调试助手XCOM V2.0
注意:设置波特率为115200
三、总结
本文通过STM32CubeMX
创建串口例程,并使用HAL
库UATR
函数库,重定义printf
函数,实现STM32系统给上位机(win10)连续发送“Hello Windows!”
四、参考
【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解
【嵌入式09】STM32串口通信协议
基于 MDK 创建 STM32 汇编程序:串口输出 Hello world
【STM32】基于STM32F407实现串口通信相关推荐
- 基于串口助手的STM32与计算机进行串口通信
基于串口助手的STM32与计算机进行串口通信 序 言 一. 串口通信概述 二.项目说明 三.实战过程 1)实现stm32向上位机发送字符 2)实现stm32发和收 3)Keil中针对stm32系统进行 ...
- STM32平台的USART串口通信
本文目的是编写stm32串口通信程序,实现stm32上电自动循环发送hello LYJ!!!,并可通过上位机控制stm32串口发送与否.通过亲自做一下USART串口通信实验,学习如何使用stm32平台 ...
- Matlab 与stm32单片机之间的串口通信
Matlab 与stm32单片机之间的串口通信 在我们用stm32做信号处理时,我时常需要用到Matlab对我们采集的数据进行分析,拟合.按照传统的方法,我们一般都会先将数据通过串口助手打印出来,再导 ...
- 基于FPGA Uart串口通信实验
基于FPGA Uart串口通信实验 首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同. UART简介 通用异步收发传输器(Universal Asynchronous Rec ...
- Matlab 与stm32单片机之间的串口通信项目实战
前言 当我们用STM32做一些DSP运算时(比如傅里叶变化,小波变换,卡尔曼滤波等算法),我们想知道自己所码出来的程序是不是按照自己预期的运算结果来或者说检验程序的鲁棒性,那我们就需要检验每个关键步骤 ...
- STM32CubeIDE开发(二十二), stm32的RS485/232串口通信开发要点
一.stm32串口通信 stm32串口通信一般是指通过UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器传输数据,UART 作为异步串 ...
- 基于VC++开发串口通信的方法
串行通信中的关键是串行通信设备的初始化.数据的发送和接收及其实现方式. 在Dos环境下,用户可以直接对通信设备编程,可以通过查询中断的方式使用通信设备.但是Windows不提倡应用程序直接控制硬件,而 ...
- STM32常用协议之串口通信详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.相关理论概念 1.1 通信基本概念 1.1.1 串行/并行 1.1.2 单工/半双工/全双工 1.1.3 同步/异 ...
- stm32中断方式的串口通信——上位机控制串口收发
文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...
- 基于 MDK5的串口通信实验
这里写目录标题 一.串口协议 二.STM32的USART串口通讯 1.新建工程 2.重定向printf函数 3.主要代码 4.编译生成.hex文件 5.烧录程序 6.串口工具运行结果 三.小结 一.串 ...
最新文章
- 图解Windows下开发Objective-C程序之二 - Objective-C入门例子
- VsCode从零开始配置一个属于自己的Vue开发环境
- c#没有指针导致的性能问题研究一二
- python 标签字体大小_这文档动画,怎么用 Python 实现的?
- 通过读取配置文件,启动mongodb
- opencv一些常用的操作
- Nginx服务器中的Socket切分,需要的朋友可以参考下
- IPHONE手机知识大全(下)
- ORACLE函数返回数据或字符串
- 深度学习为什么会出现validation accuracy大于train accuracy的现象?
- 恶心的极速输入法windows10 删除
- ie visio 打开_visio viewer无法打开.vsdx格式的文件
- Raven2靶机练习
- Oracle导出数据库数据为dmp文件(存在空表情况)
- 计算机联锁的英语文献,计算机联锁系统毕业论文中英文资料外文翻译文献
- 5分钟完成核磁共振检查,Facebook的AI技术现在还经不住考验
- c++11:std::chrono::time_point、time_t、std::localtime、std::gmtime、std::chrono::steady_clock
- 野火i.MX6ULL Pro开发板构建根文件系统
- “耳边的战争”:腾讯、字节们鸣枪,喜马拉雅们备战
- BT面板OpenLiteSpeed安装LiteSpeed Web+ wordpress+ LSCache插件+Redis 这样wp博客站速度可以起飞