STM32学习(三)串口实验

发布者:PeacefulWarrior最新更新时间:2025-01-15 来源: cnblogs关键字:STM32  串口实验 手机看文章 扫描二维码
随时随地手机看文章

串口简介

UART:全双工、异步、串行通信方式

  • 经常用来打印调试信息

物理层

串口物理层有很多标准及变种:TTL、RS232、RS422、RS485等;


RS232 标准

[图片上传失败...(image-6e7169-1692068503959)]上图中,设备A 与 设备B 的 DB9接口 通过串口线连接,串口信号线中使用 RS232电平标准 传输数据信号。由于 RS232电平标准不能直接被控制器识别,所以需要通过一个 “电平转换芯片(如MA3232)” 来将 RS232电平 和 TTL电平进行转换(发送数据时,将TTL电平转换成RS232电平;接收数据时,将RS232电平转换成TTL电平)。


TTL电平标准 VS RS232电平标准


逻辑0逻辑1
TTL0 ~ 0.5V2.4V ~ 5V
RS232+3V ~ +15V-15V ~ -3V

电子电路中常用的是 TTL标准,理想状态下,用 0V 表示逻辑0,用 5V 表示逻辑1,而实际情况允许一定的误差,采用的是一个范围。

RS232标准,为了增加串口通讯传输距离和提高抗干扰能力,使用 -15V 表示逻辑1,+15V 表示逻辑0,下图是表示同一信号的 TTL电平 和 RS232电平:


物理连接

DB9接口的信号线有9根,目前一般只使用 RXD、TXD、GND这3条信号线就可以了。

设备A   设备B
TXD  --  RXD
RXD  --  TXD
GND  --  GND
VCC  --  VCC

硬件电路

以 USART1 为例,使用 PA9 和 PA10 引脚(也可以使用其他引脚组合,详见引脚复用)


编程指南

串口初始化指南

主要步骤如下:

1)GPIO 时钟使能

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

2)USART1 时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3)GPIO 复用模式初始化

  • 使用 DEBUG_USART_RX_GPIO_PORT 和 DEBUG_USART_RX_PIN 是为了方便代码移植和书写,后续代码都是类似风格,不再单独说明。

#define DEBUG_USART_RX_GPIO_PORT                GPIOA

#define DEBUG_USART_RX_PIN                       GPIO_Pin_10

#define DEBUG_USART_TX_GPIO_PORT                GPIOA

#define DEBUG_USART_TX_PIN                      GPIO_Pin_9


    GPIO_InitTypeDef GPIO_InitStructure;


    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式

    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN;

    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


4)引脚复用配置

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);


5)UART 参数配置

主要设置如下参数:

  • 波特率       115200

  • 字长            8位

  • 奇偶校验  无校验

  • 不使用硬件流控

    USART_InitTypeDef USART_InitStructure;


    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);


6)使能串口

USART_Cmd(USART1, ENABLE);

串口接收中断配置

7)配置 NVIC 嵌套中断向量控制器

中断优先级分组设置,一般是在 main() 函数中设置,后续默认已经配置,不再单独说明。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC 参数配置

void uart1_nvic_config(void){
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);}

8)串口接收中断使能

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

串口收发数据接口

串口发送数据

如下是发送单个数据的接口,Data 最多是9位

// Transmits single data through the USARTx peripheral.

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

{

    USARTx->DR = (Data & (uint16_t)0x01FF);

}

串口接收数据

// Returns the most recent received data by the USARTx peripheral.

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)

{

    return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);

}

重定向 printf() 和 scanf() 函数

int fputc(int ch, FILE *f)

{

    USART_SendData(USART1, (uint8_t)ch);


    /* 等待发送完毕 */

    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);


    return (ch);

}


int fgetc(FILE *f)

{

    /* 等待串口输入数据 */

    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);


    return (int)USART_ReceiveData(USART1);

}


主要代码

#define DEBUG_USART_RX_GPIO_PORT                GPIOA

#define DEBUG_USART_RX_PIN                       GPIO_Pin_10

#define DEBUG_USART_TX_GPIO_PORT                GPIOA

#define DEBUG_USART_TX_PIN                      GPIO_Pin_9


void uart1_init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;


    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式

    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN;

    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


    // 引脚复用配置

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);


    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);


    uart1_nvic_config();

    USART_Cmd(USART1, ENABLE);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

}


uint16_t uart1_send(USART_TypeDef* USARTx, char *data)

{

    unsigned int k = 0;


    do

    {

        USART_SendData(USARTx, *(data+ k));

        while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

        k++;

    } while (*(data+ k) != '');


    /* 等待发送完成 */

    while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)

    {

    }

}


关键字:STM32  串口实验 引用地址:STM32学习(三)串口实验

上一篇:stm32 调试
下一篇:STM32学习(四) SyxTick 实验

推荐阅读最新更新时间:2026-03-23 11:10

STM32学习(三)串口实验
串口简介 UART:全双工、异步、串行通信方式 经常用来打印调试信息 物理层 串口物理层有很多标准及变种:TTL、RS232、RS422、RS485等; RS232 标准 上图中,设备A 与 设备B 的 DB9接口 通过串口线连接,串口信号线中使用 RS232电平标准 传输数据信号。由于 RS232电平标准不能直接被控制器识别,所以需要通过一个 “电平转换芯片(如MA3232)” 来将 RS232电平 和 TTL电平进行转换(发送数据时,将TTL电平转换成RS232电平;接收数据时,将RS232电平转换成TTL电平)。 TTL电平标准 VS RS232电平标准 逻辑0 逻辑1 TTL 0 ~ 0.5V
[单片机]
STM32串口实验中重定向c库中的printf()函数和scanf()函数
在STM 32 的串口实验中,往往需要把内容打印输出在串口调试助手中,这时就需要重定向c库中的printf()函数,重定向后可使用。 注意下面的FILE的定义在头文件stdio.h中,所以在写程序时需要包含此头文件。 例: int fputc(int ch,FILE *f) { USART_SendData(USART_TypeDef* USARTx, uint8_t Data); //发送一个字节数到串口 while(USART_GetFlagStatus(USART_TypeDef* USARTx, USART_FLAG_TC)==RESET); //等待发送完毕 return(ch);
[单片机]
【stm32f407】stm32串口实验
一.串口理论 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 STM32F407VGT6内嵌四个通用同步/异步接收器(USART1,USART2,USART3和USART6) 和两个通用异步收发器(UART4和UART5),如图: 另外,usart和uart的差异在于usart是同步串口(亦可用于异步串口),uart是异步串口,差异如下: 同步通信:带时钟同步信号传输。 异步通信:不带时钟同步信号。 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,
[单片机]
【stm32f407】<font color='red'>stm32</font><font color='red'>串口实验</font>
【GD32F303红枫派开发板使用手册】第二十讲八 USB-虚拟串口实验
28.USB-虚拟串口实验 28.1实验内容 通过本实验主要学习以下内容: CDC虚拟串口协议原理及使用 CDC虚拟串口通信操作 28.2实验原理 USB的CDC类是USB通信设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备使用的USB子类。该设备类采用批量传输。 本例程中实现了CDC设备类的相关请求,包括SET_LINE_CODING、GET_LINE_CODING、SET_CONTROL_LINE_STATE等。后续将会在代码解析章节进行介绍。 有关CDC协议可以通过以下USB官网下载或者通过红枫派开发板配套资料获取。 大家可以在学习的过程中结合历程代
[单片机]
【GD32F303红枫派开发板使用手册】第二十讲八 USB-虚拟<font color='red'>串口实验</font>
STM32-串口实验学习笔记
USART1_IRQHandler(void)函数: 当串口1发生了相应的中断,就会跳到改函数执行。这里设计了一个小小的接收协议(系统并未定义):通过这个函数,配合一个数组USART_RX_BUF ,一个接收状态寄存器USART_RX_STA实现对串口的数据的接收管理。USART_RX_BUF 最大值为64,也就是一次接收的数据最大不能超过64字节。USART_RX_STA是一个接收状态寄存器,其各位的定义如表所示: (注意:这个是作者设计的协议,怎样判断串口接收一组数据完毕?由于每次接收的数据长度不一样,少的就3个8位数据,多的时候有十多个,这个数据个数是不定的,且没规律的数据,有什么好的方法让它接收完整? 协议的设
[单片机]
STM32-<font color='red'>串口实验</font>学习笔记
单片机 如何给MSP430开发板下载程序 并做一个串口实验
1简介 我们需要下面这些软件 CH340驱动软件:是使用BSL下载程序的话,电脑需要和单片机通信,他们之间的桥梁就是CH340芯片,电脑想要识别CH340芯片就需要驱动。下载程序需要使用CH340芯片,让单片机接受指令也需要使用CH340芯片,总之电脑和单片机之间的通信就是靠CH340芯片。 IAR软件:我们需要在这个软件里面写c代码,然后利用这个软件的编译功能,将c代码编译成hex文件,hex文件就是机器文件,单片机依靠这个文件来工作,这个文件最终是要下载到单片机里面去的。 串口助手软件:下载程序有专门用的软件,和单片机相互通信也有专门的软件,串口助手软件可以帮助你和单片机通信,可以在串口助手软件中写一个字符串发送给单片机,同
[单片机]
单片机 如何给MSP430开发板下载程序 并做一个<font color='red'>串口实验</font>
(二)s3c2440——串口实验
介绍:   通用异步收发器(简称UART)。用来传输串行数据。发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时, UART检测另一根电线的信号,将串行收集的数据放在缓冲区中,CPU就能读取UART获得这些数据。 一、实验目的:掌握uart的使用方法 二、实验内容:   在串口中输入一个内容,并通过开发板返回在串口中。 三、核心语句   a:在使用UART之前,需要配置如下寄存器:     1、设置波特率(UBRDIVn)            2、传输格式(ULCONn)     3、UART引脚(GPxCON)      b:     1、start.S程序    
[单片机]
02-JZ2440裸机学习之系统时钟和UART串口实验
1、S3C2440的系统时钟 1.1、2440的几种频率 笔记本CPU可以 1G 2G ,内存133M等 2440CPU:400MHz -------FCLK-----CPU SDRAM:100M/133M---- HCLK----存储区控制器,中断控制器,LCD,DMA,USB主机模块 串口IIC: -------------------PCLK----IIS,IIC,PWM,MMC,SD,ADC,UART,GPIO,RTC,SPI 定时器:---------------------PCLK 1.2时钟选择与启动方式选择 S3C2440可以选择晶振,或外部时钟。: 1.3PLL 两种PLL
[单片机]
02-JZ2440裸机学习之系统时钟和UART<font color='red'>串口实验</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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