STM32 USART入门指南

这篇具有很好参考价值的文章主要介绍了STM32 USART入门指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于刚开始涉足STM32微控制器编程的初学者来说,掌握其通用同步/异步接收/发送器(USART)功能是一项基本且必要的技能。USART在嵌入式系统中广泛用于串行通信。本指南旨在简明扼要地介绍USART的基础概念和基本步骤,并提供一个简单的示例来帮助初学者快速入门。

USART简介

USART是一种串行通讯接口,它支持同步和异步通信。在STM32微控制器中,USART是一个非常灵活的功能模块,可以在多种通信标准下工作,如RS232、RS485、LIN和IrDA。

串口通信过程简介

想象一下,有两个设备要通过串口线进行通信。我们称它们为设备A(发送方)和设备B(接收方)。
设备准备:开始时,设备A和设备B都设置了相同的波特率。这就像是它们同意按相同的节奏跳舞,确保彼此步调一致。
开始传输:设备A想要发送一个字符,比如字母“A”。在ASCII码中,“A”对应的二进制是01000001。
打包数据:设备A将这个字符打包成一系列的信号。首先,它添加一个起始位(通常是一个0),然后是字母“A”的二进制表示,然后可能还有一个校验位,最后是停止位(通常是一个1)。
这个打包好的数据包看起来可能是这样的:
0   01000001 [校验位] 1
逐位发送:设备A通过串口线开始发信号,每次发送一位。按照先前设置的波特率,它准确地控制发送每个位的时间间隔。
信号传输:信号顺着串口线一路传到设备B。设备B按照相同的波特率接收这些信号。
接收数据:设备B首先检测到起始位,然后逐个接收数据位,并在最后读取停止位。如果启用了校验,它还会检查数据是否完好。
完成传输:一旦设备B读取了完整的信号,并且确认无误,它就知道它成功接收了一个字符。然后它就准备好接收下一个字符了。
在此过程中,如果波特率设置错误,或数据中有干扰导致错误,设备B可能会得到错误的字符。这就是波特率和准确的通信设置为何极其重要的原因。

配置USART

配置STM32上的USART(通用同步/异步接收/发送器)功能需遵循以下步骤:
时钟配置:
首先,需要为相关的USART和GPIO时钟使能。通过RCC(Reset and Clock Control)可以配置这些时钟。例如,如果使用的是USART1,通常需要使能它的时钟以及连接到它的GPIO端口时钟。


GPIO配置:
接下来配置GPIO,将涉及到的针脚设置为USART TX(发送)和RX(接收)功能。在STM32中,大多数GPIO针脚可被配置为多种模式,包含USART复用功能。


USART配置:
设置USART的基本通信参数,包括:
        波特率(Baud rate):例如9600、115200等。
        字长(Word length):数据位长度,如8位、9位。
        停止位(Stop bits):常见有1位停止位或2位停止位。
        校验位(Parity):可选无校验、奇校验或偶校验。
        流控(Flow control):可选无、硬件(RTS/CTS)或软件(XON/XOFF)流控。
这些参数可以通过USART_Init函数设置在STM32标准固件库或HAL库中。


中断配置(可选):
如果计划使用中断来管理USART通信,需要配置USART中断并在NVIC中使能它们。这涉及到编写ISR(Interrupt Service Routine中断服务程序)以及在NVIC中设置优先级和使能中断。


使能USART:
最后,初始化过程中,在配置完所有必要的参数后,使能USART模块。

数据发送和接收

发送数据:要发送数据,可以将数据写入USART的数据寄存器,然后等待发送缓冲区(USART_FLAG_TXE)为空,即可发送下一个数据。
接收数据:接收数据时,要检查接收数据寄存器(USART_FLAG_RXNE )非空标志位,当接收到数据时,从数据寄存器读取数据即可。

// 如果收到数据
    if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
    {
      // 从USART1读取数据并回显
      char data = USART_ReceiveData(USART1);
      USART_SendData(USART1, data);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }

USART_FLAG_RXNE(接收缓冲区非空标志)和USART_FLAG_TXE(发送缓冲区空标志)是USART通信中两个很重要的状态标志,它们存在于USART的状态寄存器中,用于指示USART某些事件的状态。


USART_FLAG_RXNE (Read data register not empty):

当接收到数据,接收数据寄存器非空时,该标志位被置1。
这意味着至少有一个数据可以被读取。
在轮询模式下可以检查这个标志位,如果置位,则可以通过USART_ReceiveData()函数读取数据。
如果启用了接收中断(通过USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)),当USART_FLAG_RXNE置位时将触发中断。


USART_FLAG_TXE (Transmit data register empty):

发送数据寄存器为空时,该标志位被置1。
这表示可以将新数据写入发送数据寄存器。
在发送数据时,可以检查这个标志位,确保发送数据寄存器为空,然后通过USART_SendData()函数发送下一个数据。
如果启用了发送中断(通过USART_ITConfig(USART1, USART_IT_TXE, ENABLE)),当USART_FLAG_TXE置位时将触发中断。
在实际应用中,这两个标志位常常用于轮询方式或中断方式的数据发送和接收,以保证USART通信的正确性和效率。 文章来源地址https://www.toymoban.com/news/detail-835388.html

实际操作示例

#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void USART1_Init(void);
int main(void)
{
  // 系统时钟初始化
  SystemInit();
  // 初始化USART1
  USART1_Init();
  // 主循环
  while(1)
  {
    // 如果收到数据
    if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
    {
      // 从USART1读取数据并回显
      char data = USART_ReceiveData(USART1);
      USART_SendData(USART1, data);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
  }
}
void USART1_Init(void)
{
  // 各种外设时钟使能
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  // GPIOA 9和10为TX和RX初始化
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // PA9作为USART1的TX
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; // PA10作为USART1的RX
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  // USART1初始化设置
  USART_InitTypeDef USART_InitStruct; 
  USART_InitStruct.USART_BaudRate = 9600;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStruct);
  // 使能USART1
  USART_Cmd(USART1, ENABLE);
}

到了这里,关于STM32 USART入门指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式知识08】STM32的USART串口通信,给上位机连续发送Hello Windows!

    本文主要介绍串口协议和RS-232、485标准,以及RS232、485电平与TTL电平的区别,了解\\\"USB/TTL转232\\\"模块的工作原理;并完成一个STM32的USART串口通讯程序。   串口通信(Serial Communication)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。尽管比按字节(byte)的并行通信

    2024年02月13日
    浏览(51)
  • STM32入门指南(6)—DAC的使用

    本文以 STM32F103ZET6 为例,介绍STM32的DAC的如何在 STM32CubeMX 中配置,以及一些代码上的说明。主要是针对用DAC输出一些特定信号(以各种频率的正弦信号为例)。 硬件: 一块STM32F103ZET6开发板 软件: MDK 532 STM32CubeMX 6.0.1 该芯片的数据手册可以从ST的官网下载到: https://www.stmic

    2024年02月14日
    浏览(36)
  • 初识stm32单片机(小白入门指南)

    当你看到这篇博客时不知道是否已经了解过C51单片机,如果你没了解过它。这里有一份指南(C51教程)让你入门单片机,作为初学者从功能相对简单的单片机入手更有利于打好基础。虽然stm32在性能上更为强大,但stm32开发从它的配置和代码量上来讲比C51开发更复杂,缺少点乐

    2024年02月17日
    浏览(46)
  • TIA博途WINCC触摸屏VB脚本入门指南(嵌入式)

    在本篇文章中,我们将介绍TIA博途WINCC触摸屏VB脚本的入门知识,特别是在嵌入式环境下的应用。我们将详细解释如何使用VB脚本来编写触摸屏应用程序,并提供相应的源代码示例。 引言 TIA博途WINCC是一款广泛应用于工业自动化领域的触摸屏开发软件。它提供了丰富的功能和灵

    2024年02月04日
    浏览(128)
  • 蓝桥杯嵌入式STM32G431RBT6竞赛指南与模板——最后的绝唱

    谨以此文和我去年前的一篇蓝桥杯单片机的教程构成电子类的 青铜双壁. 国信长天单片机竞赛训练之原理图讲解及常用外设原理(遗失的章节-零)_昊月光华的博客-CSDN博客     目录 时钟树 串口重定向:printf输出 动态点灯(点灯大师) 按键(常用状态机) 同一时刻对多个按键按

    2024年02月07日
    浏览(52)
  • 「STM32入门」USART串口通信

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 本文将介绍USART  概念解释 TX、RX分别是Transmit和Receive的缩写,代表发送、接受数据 全双工的含义是发送线路和接受线路互不影响,可以同时进

    2024年02月06日
    浏览(48)
  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(53)
  • STM32入门学习之USART串口通信:

    1.串口通信简介:通用异步收发传输器UART(Universal Asynchronous Receiver/Transmitter)是负责处理数据总线和串口之间的串/并通信的设备。UART通信规定了数据帧的格式:起始位、数据位、校验位、停止位等。UART异步通信只需要通信双方设置好数据帧的格式和波特率即可完成通信。因为

    2024年02月16日
    浏览(49)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(87)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包