【STM32】基于STM32F407实现串口通信

一、通用同步异步收发器 (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 中重写fgetfput函数
/**
  * 函数功能: 重定向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创建串口例程,并使用HALUATR函数库,重定义printf函数,实现STM32系统给上位机(win10)连续发送“Hello Windows!”

四、参考

【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解

【嵌入式09】STM32串口通信协议

基于 MDK 创建 STM32 汇编程序:串口输出 Hello world

  • 6
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值