STM32 CubeIDE(九)串口通讯

串口通讯

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息,本篇串口通讯均为异步串口通讯。

串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图。

STM32串口
STM32 芯片具有多个 USART 外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter 的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于 USART,它还有具有 UART 外设(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。

USART 功能框图

①功能引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,
nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

②数据寄存器
USART 数据寄存器(USART_DR)只有低 9 位有效,并且第 9 位数据是否有效要取决于USART 控制寄存器 1(USART_CR1)的 M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M 位为 1 表示 9 位数据字长,我们一般使用 8 位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。

③控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 的 M 位控制。

④小数波特率生成
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。USART 的发送器和接收器使用相同的波特率。计算公式如下:

⑤校验控制
STM32F4xx 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将是 8 位的数据帧加上 1 位的校验位总共 9 位,此时 USART_CR1 寄存器的 M 位需要设置为1,即 9 数据位。将 USART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存器的 PE 位置 1,并可以产生奇偶校验中断。使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

UART初始化结构体

/*** @brief UART Init Structure definition*/
typedef struct
{uint32_t BaudRate;                  /*!< 波特率 */uint32_t WordLength;                /*!< 数据字长 */uint32_t StopBits;                  /*!< 停止位 */uint32_t Parity;                    /*!< 校验控制 */uint32_t Mode;                      /*!< UART模式 */uint32_t HwFlowCtl;                 /*!< 硬件流控 */uint32_t OverSampling;              /*!< 过采样倍率 */
} UART_InitTypeDef;

UART函数

HAL_UART_Init(UART_HandleTypeDef *huart);    //串口初始化
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);       //串口接收字符
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);      //串口发送字符
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);  //接受中断
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //发送中断

UART实验
本次实验基于野火STM32F407-霸天虎V2开发板实现,使用串口1与电脑进行数据通讯,通讯方式为轮询和中断。

打开Cube,在Connectivity中激活USART1,设置为Asynchronous异步串口,不打开硬件流,设置波特率为115200,8位数据字长,无校验,1位停止位,收发模式,16倍过采样,开启NVIC中断。

生成代码后,在usart.c文件中相应位置添加如下代码,此为轮询方式。

/* USER CODE BEGIN 1 */
void Usart_SendString(uint8_t *str)
{uint8_t k=0;do{HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);k++;}while(*(str + k)!='\0');}#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 1 */

在main.c文件中相应位置添加如下代码。

int main(void)
{/* USER CODE BEGIN 1 */char ch;/* USER CODE END 1 *///..........///* USER CODE BEGIN WHILE */while (1){Usart_SendString((uint8_t *)"Hello World!\r\n");printf("Nice!\r\n");ch = '\0';HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);if(ch != '\0')printf("Receive is %c\r\n",ch);HAL_Delay(1000);/* USER CODE END WHILE */ //..........//

在main.c文件中相应位置添加如下代码,此为中断方式。

/* USER CODE BEGIN PV */
uint8_t Buffer[5];
/* USER CODE END PV *//* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,Buffer, sizeof(Buffer));
/* USER CODE END 2 */

在stm32f4xx_it.c中添加如下代码,每触发一次接受中断后都需要重新打开中断。

/* USER CODE BEGIN 1 */
extern uint8_t Buffer[5];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){HAL_UART_Receive_IT(&huart1,Buffer, sizeof(Buffer));HAL_UART_Transmit(&huart1,Buffer,sizeof(Buffer),100);}
}
/* USER CODE END 1 */

使用上位机必须发送5个数据才会触发一次中断,看到回显内容。如果需要每次发一个数据都能回显,需要空闲中断接受不定长数据,以后再更。

STM32 CubeIDE(九)串口通讯相关推荐

  1. STM32的USART串口通讯程序(查询方式)

    STM32的USART串口通讯程序(查询方式) 文章目录 STM32的USART串口通讯程序(查询方式) 一.USART介绍 1.异步通信: 2.同步通信: 二.CubeMX创建项目 1.点击ACCE ...

  2. 在 stm32CubeMX下生成程序完成流水灯以及完成STM32的USART串口通讯程序实现STM32系统给上位机(win10)连续发送“hello windows”

    目录 一.STM32CubeMX简介及安装 二.利用STM32CubeMX生成代码 1.创建项目 2.配置芯片 3.导出项目 ​ 三.Keil中补充代码完善功能 四.在Keil中观察实验波形 五.US ...

  3. 了解串口协议,及完成STM32的USART串口通讯程序,并用keil观察波形

    文章目录 前言 一.串口协议 1.RS-232 2.485标准 二.RS-232.485和TTL电平 1.RS-232电平 2.485 3.TTL电平 4.区别 三.USB/TTL转232 1.CH3 ...

  4. STM32的USART串口通讯程序

    文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...

  5. STM32的USART串口通讯

    STM32的USART串口通讯 STM32的USART串口通讯 一,寄存器与固件库 二,STM32的串口通讯准备工作 三,操作步骤 一,寄存器与固件库 基于寄存器与基于固件库的stm32 LED流水灯 ...

  6. 【嵌入式系统开发11】串口通讯“小试牛刀”——完成一个STM32的USART串口通讯程序

    本文目的是主要介绍通过STM32F103C8T6完成一个STM32的USART串口通讯程序,在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形. 文章目录 前言 (一)需求分析 ...

  7. STM32学习:串口通讯(proteus仿真)

    文章目录 前言 一.相关知识点 二.电路搭建与硬件配置 1.proteus电路搭建 1.COMPIM元件 2.VIRTUAL TERMINAL虚拟终端元件 3.整体电路: 2.CubeMx硬件电路配置 ...

  8. STM32入门教程——串口通讯

    目录 1.认识串口 2.stm32串口介绍 2.1 查询方式 2.1 中断方式 2.2 DMA方式 3.使用stm32串口实现printf 串口作为嵌入式设备最常用的外设之一,被广泛的应用.本文介绍S ...

  9. 基于STM32的USART串口通讯程序

    文章目录 一.串口协议和RS-232.485标准,以及RS232.485电平与TTL电平的区别,USB/TTL转232模块的工作原理 1.串口协议 2.RS-232.RS-485标准 3.RS232. ...

  10. 串口通信-STM32的USART串口通讯程序

    目录 一.原理介绍 1.串口协议 2.常用协议标准 1)RS-232 2)RS-485 3.RS232.485电平与TTL电平的区别 1)RS232电平 2)RS485电平 3)TTL电平 4)RS2 ...

最新文章

  1. Windows平台SSH登录Linux并使用图形化界面
  2. Python进阶:程序界的垃圾分类回收
  3. 思科安全——企业安全棋局的“宇宙流”
  4. Java Servlet监听器的分类
  5. C/C++学习之路: 继承
  6. NamingException
  7. 华为王军:未来座舱操作系统只有1个或者2个生态
  8. 飞猪:国庆乡村民宿订单量涨560% 00后红色旅游订单量同比涨80%
  9. 静态内容负载均衡的具体实现-续《几百元搞定大型网站》
  10. ---perl 模块安装方法
  11. OS X Eagle Peak:据说这是 Mac 新系统名称
  12. 【matlab图像处理】图像处理的经典操作
  13. 想成为顶级开发者吗?亲自动手实现经典案例
  14. word设置图片上边空白24点,下边9点,图片和图注在一行怎么办?
  15. Unity发布的exe程序正常 显示窗口右上角的放大缩小功能
  16. Activiti,自定义表单,外置表单,工作流,微服务,子系统
  17. 实时语音场景下的智能对话
  18. Linux系统设置命令别名
  19. junction工具安装及简单使用
  20. (一)工业机器人简介

热门文章

  1. ubuntu18.04 network有线网络图标缺失解决记录
  2. 怎么用Q-Q图验证数据集的分布
  3. 房产抵押贷款必须搞懂的七个问题
  4. MPEG4和DivX的问题解答荟萃
  5. python gil锁为什么_day9-为什么会有GIL锁 (来自师兄总结的博客)
  6. ubuntu(linux) 离线更新显卡驱动
  7. 认证管理(锐捷业软篇)
  8. Android反模拟器的总结
  9. cat 链接并显示文件
  10. DNS(域名系统)介绍,深入解析DNS解析失败发生的原因及解决方法