STM32串口配置

article/2025/10/16 15:25:50

目录

串口设置的一般步骤:

1) 串口时钟使能,GPIO 时钟使能

2) 串口复位

3) GPIO 端口模式设置

4) 数据发送与接收

5) 串口状态

6) 使能串口

7) 开启串口响应中断

8.获取相应中断状态


串口设置的一般步骤:

 

1) 串口时钟使能,GPIO 时钟使能

串口是挂载在 APB2 下面的外设,所以使能函数为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);


2) 串口复位

当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数 USART_DeInit()中完成:

void USART_DeInit(USART_TypeDef* USARTx)
{/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));if (USARTx == USART1){RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);}else if (USARTx == USART2){RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);}else if (USARTx == USART3){RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);}    else if (USARTx == UART4){RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);}    else{if (USARTx == UART5){ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);}}
}


3) GPIO 端口模式设置

串口初始化是通过 USART_Init()函数实现的

void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1 }

从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。


4) 数据发送与接收

STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。

STM32 库函数操作 USART_DR 寄存器发送数据的函数是:void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_DATA(Data)); /* Transmit Data */USARTx->DR = (Data & (uint16_t)0x01FF);
}

STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));/* Receive Data */return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}


5) 串口状态

串口的状态可以通过状态寄存器 USART_SR 读取。

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。

TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写USART_DR。2)直接向该位写 0。

USART_GetFlagStatus(USART1, USART_FLAG_TC);
这些标识号在 MDK 里面是通过宏定义定义的:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)


6) 使能串口

串口使能是通过函数 USART_Cmd()来实现的,这个很容易理解,使用方法是:

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Enable the selected USART by setting the UE bit in the CR1 register */USARTx->CR1 |= CR1_UE_Set;}else{/* Disable the selected USART by clearing the UE bit in the CR1 register */USARTx->CR1 &= CR1_UE_Reset;}
}


7) 开启串口响应中断

有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
{uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00;uint32_t usartxbase = 0x00;/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_CONFIG_IT(USART_IT));assert_param(IS_FUNCTIONAL_STATE(NewState));/* The CTS interrupt is not available for UART4 and UART5 */if (USART_IT == USART_IT_CTS){assert_param(IS_USART_123_PERIPH(USARTx));}   usartxbase = (uint32_t)USARTx;/* Get the USART register index */usartreg = (((uint8_t)USART_IT) >> 0x05);/* Get the interrupt position */itpos = USART_IT & IT_Mask;itmask = (((uint32_t)0x01) << itpos);if (usartreg == 0x01) /* The IT is in CR1 register */{usartxbase += 0x0C;}else if (usartreg == 0x02) /* The IT is in CR2 register */{usartxbase += 0x10;}else /* The IT is in CR3 register */{usartxbase += 0x14; }if (NewState != DISABLE){*(__IO uint32_t*)usartxbase  |= itmask;}else{*(__IO uint32_t*)usartxbase &= ~itmask;}
}

这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断

我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:

USART_ITConfig(USART1,USART_IT_TC,ENABLE);

8.获取相应中断状态

当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:USART_GetITStatus(USART1, USART_IT_TC)

返回值是 SET,说明是串口发送完成中断发生。

串口操作相关库函数

 

 


http://chatgpt.dhexx.cn/article/dhOQNlMW.shtml

相关文章

STM32串口详解

实验一&#xff1a;简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手&#xff0c;还应知道&#xff1a; 发送英文字符需要用一个字符即8位&#xff0c;发送汉字需要两个字符即16位&#xff0c;如上图&#xff0c;发送汉字“姜”实际是发送“BD AA”而发送英文字…

stm32串口实验

目录 &#xff08;一&#xff09;STM32 串口简介 (二)软件设计 &#xff08;三&#xff09;效果&#xff1a;​ 1.实现功能&#xff1a;STM32 通过串口和上位机的对话&#xff0c; STM32 在收到上位机发过来的字符串后&#xff0c;原原本本的返回给上位机。 &#xff08;一&…

STM32 串口乱码

问题描述 用正点原子STM32F4探索者开发板调试野火骄阳电机驱动程序&#xff0c;发现串口输出一直是乱码。问题排查&#xff1a; 串口调试助手编码方式&#xff1f;同一个串口调试助手&#xff0c;用正点原子、STM32CubeMX生成的程序发送数据正常。排除串口调试助手问题。串口…

STM32串口通信编程

重庆交通大学信息科学与工程学院 《嵌入式系统基础A》课程 实验报告&#xff08;2&#xff09; 班 级&#xff1a; 物联网工程2002 姓名-学号 &#xff1a; 徐权-632007060327 实验项目名称&#xff1a; STM32串口通信编程 实验项目性质&#xff1a; 设计性 实验所…

STM32串口驱动

首先了解串口通信的一些基本原理&#xff1a; ⚫ 串口通信&#xff1a; 串口通信是指数据通过一条数据线&#xff08;或者两条差分线&#xff09;一位接着一位的传输出去。串口通信的优点是占用硬件资源少&#xff0c;且传输距离较远&#xff0c;缺点是传输速度慢&#xff08;…

STM32串口

使用百问网的STM32F103MINI开发板完成下面实验。 1、通过STM32CubeMX配置串口。 串口1选择Asynchronous&#xff0c;异步通信。 115200bps&#xff0c;8N1&#xff0c;默认即可。 2、串口发送数据。 STM32Cube生成代码后&#xff0c;在main.c的while(1)前面加一句。 HAL_U…

STM32 串口详解

目录 01、USART的特点 02、USART简介 2.1、数据传输模型 2.2、帧结构 2.3、波特率 03、STM32的USART 04、代码配置 01、USART的特点 USART是通用异步收发传输器&#xff08;UniversalAsynchronousReceiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步…

STM32入门教程——串口通讯

目录 1.认识串口 2.stm32串口介绍 2.1 查询方式 2.1 中断方式 2.2 DMA方式 3.使用stm32串口实现printf 串口作为嵌入式设备最常用的外设之一&#xff0c;被广泛的应用。本文介绍STM32串口的如何使用。从以下几个方面介绍&#xff1a; 1.认识串口 常用串口的引脚主要由TX…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…

【stm32】串口通信

串口通信 一、串口通信协议原理二、usart功能框图三、stm32库的配置 一、串口通信协议原理 串口在嵌入式系统当中是一类重要的数据通信接口&#xff0c;其本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时&#xff0c;字节数据转换为串行的…

STM32-串口通信详解

目录 前言 一、通信接口背景知识 1. 并行通信和串行通信 2. 串行通信的分类 二、STM32的串口通信基础 1. 串口通信接口 2. 串口通信框图 3. 串口通信相关寄存器 4. 波特率计算方法 三、库函数配置 1. 串口配置一般步骤 总结 前言 众所周知&#xff0c;串口通信是MC…

STM32串口通信

STM32串口通信 一、串口 1.串口概述 串口是单片机中最常用也是最简单的一种通信方式通信&#xff1a;两个或两个以上的设备进行数据交换 串口是用于两个设备之间的异步全双工通信 异步——》两个设备不需要共时钟 全双工——》两个设备之间服务于数据交换的“线”有两根 Tx&…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

STM32串口通信详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转STM32 &#x1f4ac;保持学…

MacOS 安装 Matlab R2021b 手记

MacOS 安装 Matlab R2021b Maci64手记 1.下载MATLAB R2021b 安装包 2.双击MatlabR2021b_Mac64.dmg打开安装包,双击InstallForMacOSX.app开始安装程序 3.出现「install_unix想要进行更改」,出入开机密码,点击好 4.出现安装界面,点击「高级选项」,选择「我有文件安装密…

linux安装matlabRuntime

1.找到自己需要的文件夹&#xff0c;下载压缩包&#xff0c;版本自己发挥 wget https://ssd.mathworks.com/supportfiles/downloads/R2021a/Release/6/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2021a_Update_6_glnxa64.zip 2.解压 unzip MATLAB_Runtim…

四步离线安装matlab工具包

四步离线安装matlab工具包 把刚才的压缩包解压在matlab 工具包的文件夹。&#xff08;其实哪里都行&#xff0c;防止误删&#xff09; 我的是matlab安装目录下面 打开Matlab --“主页” --“设置路径” 3. 添加文件夹-选择工具包文件夹 4. 点击切换路径按钮到工具包目录&am…

安装Matlab R2022a/64位

Matlab R2022a/64位下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pb_523QrMvu–nOcmV1bqQ 提取码&#xff1a;lbcc 上面失效的看看这个 链接&#xff1a;https://pan.baidu.com/s/14cVeXQOLBqGfq3aKT45vPw 提取码&#xff1a;piq7 怎么快速下可以私信我。…

如何安装matlab?官网下载详细教程

MATLAB下载和安装教程&#xff08;官网下载&#xff09; 很多人在遇到专业数据处理时都得用到专业的数学软件&#xff0c;matlab就是这样一款对于数据处理非常有帮助的支持数据分析、算法开发和建模的专业工科数学软件。那么&#xff0c;怎么可以快速的正确安装&#xff1f;下…

【首发】 ubuntu20.04安装matlab2021b/matlab2020b

文章目录 一、下载地址1.1 2021b下载链接(BT)1.2 2021a下载链接1.3 2020b CSDN下载链接 二、MATLAB2021b安装方法2.1 Mount .iso文件2.2 通过./install 启动安装程序2.3 输入正版Key安装2.4 直接下一步2.5 选安装文件夹&#xff08;权限够&#xff09;2.6 选需要的包2.7 选link…