STM32F103同时使用串口2、串口3

2023-05-16

STM32F103同时使用串口2、串口3

    • 步骤
    • rs485.c
    • rs485.h
    • 中断处理函数:

一直在用STM32F103做项目,记录一下,如果觉得有用的,也可以参考一下。

步骤

  1. IO口的初始化;
  2. 串口初始化;
  3. 中断向量初始化。
  4. 中断函数的处理事件

rs485.c

`/*********************************************************************************************************
** Function name:       RS485_IO_Init
** Descriptions:        usart GPIO 初始化
** input parameters:    void
** output parameters:   void
** Returned value:      void
*********************************************************************************************************/
void RS485_IO_Init(void)
{
			GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(USART_RCC | RCC_APB2Periph_AFIO,ENABLE);
	
	//串口2配置
	//output
	GPIO_InitStructure.GPIO_Pin = USART2_OUTIO ;
	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
	GPIO_Init(USART2_PORT,&GPIO_InitStructure);
	
	
	//Input
	GPIO_InitStructure.GPIO_Pin = USART2_INIO ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
	GPIO_Init(USART2_PORT,&GPIO_InitStructure);

	
	//485RE
	GPIO_InitStructure.GPIO_Pin = USART2_REIO ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
	GPIO_Init(USART2_PORT,&GPIO_InitStructure);
	
	
	//串口3配置
	GPIO_InitStructure.GPIO_Pin = USART3_OUTIO ;
	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
	GPIO_Init(USART3_PORT,&GPIO_InitStructure);
	
	
	//Input
	GPIO_InitStructure.GPIO_Pin = USART3_INIO ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
	GPIO_Init(USART3_PORT,&GPIO_InitStructure);

	
	//485RE
	GPIO_InitStructure.GPIO_Pin = USART3_REIO ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz ;
	GPIO_Init(USART3_PORT,&GPIO_InitStructure);
	RS485_2RE(1);//串口2默认为发送
	RS485_3RE(0);//串口3默认为接收
}

/*********************************************************************************************************
** Function name:       USART_485_Init
** Descriptions:        usart 配置
** input parameters:    void
** output parameters:   void
** Returned value:      void
*********************************************************************************************************/


void USART_485_Init(void)
{
	USART_InitTypeDef USART_InitStruct;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB1Periph_USART2,ENABLE);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/*设置串口2中断的先占优先级为0,从占优先级为0*/
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	/*设置串口3中断的先占优先级为0,从占优先级为1*/
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	
	/* USART2、USART3设置波特率9600、数据位8bit、停止位1bit、无校验位、无硬件流、接收发送 、中断打开*/
	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(USART2,&USART_InitStruct);
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	
	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(USART3,&USART_InitStruct);
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
			
	/*使能串口2、3*/
	USART_Cmd(USART2,ENABLE);
	USART_Cmd(USART3,ENABLE);
	
}

rs485.h

/**************485使能开关***************/
#define RS485_2RE(x)	x?(GPIOA->ODR |= (1<<4),USART2->CR1 &=~ (3<<2),USART2->CR1 |= (2<<2)):(GPIOA->ODR &=~ (1<<4),USART2->CR1 &=~ (3<<2),USART2->CR1 |= (1<<2))
#define RS485_3RE(x)	x?(GPIOB->ODR |= (1<<12),USART3->CR1 &=~ (3<<2),USART3->CR1 |= (2<<2)):(GPIOB->ODR &=~ (1<<12),USART3->CR1 &=~ (3<<2),USART3->CR1 |= (1<<2))

/*************485IO定义*****************/
#define USART_RCC RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA
#define USART2_OUTIO GPIO_Pin_2
#define USART2_INIO  GPIO_Pin_3
#define USART2_REIO  GPIO_Pin_4
#define USART2_PORT  GPIOA

#define USART3_OUTIO GPIO_Pin_10
#define USART3_INIO  GPIO_Pin_11
#define USART3_REIO  GPIO_Pin_12
#define USART3_PORT  GPIOB

#ifndef YES
#define YES 1
#endif

#ifndef NO
#define NO 0
#endif

中断处理函数:

void USART2_IRQHandler(void)
{
	Usart2_Send = NO;//发送标志
	if(USART_GetITStatus(USART2,USART_IT_RXNE))
	{
		DRData.usart2_DRdata = USART2->DR;//清中断
		//接下来就是事件处理
	}
	Usart2_Send = YES;
}
void USART3_IRQHandler(void)
{
	Usart3_Send = NO;//发送标志
	if(USART_GetITStatus(USART3,USART_IT_RXNE))
	{
		DRData.usart3_DRdata = USART3->DR;//清中断
		//接下来就是事件处理
	}
	Usart3_Send = YES;
}

发送的时候使用这个函数就好
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

第一次写,哪里写错了或者不对的地方,请多多指教!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103同时使用串口2、串口3 的相关文章

  • qglobal.h:45: error: C1083: 无法打开包括文件:

    看了很多人的错误调试记录就是不行 xff0c 后来在百度知道里面看到这个 xff0c 添加进入后就可以了 在系统环境变量path 添加下面内容即可 SystemRoot system32
  • 卡尔曼滤波器学习笔记(二)

    扩展卡尔曼滤波器的原理及应用 经典的卡尔曼滤波只适用于线性且满足高斯分布的系统 xff0c 但实际工程中并不是这么简单 xff0c 比如飞行器在水平运动时有可能伴随着自身的自旋 xff0c 此时的系统并不是线性的 xff0c 这时就需要应用
  • 串口回环测试

    串口lookback测试 基础知识 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff09 xff0c 通常称作UART UART 是一种通用的数据通信协议 xff
  • STM32学习--USART

    串口工作方式 1 查询 xff1a 串口程序不断循环查询 xff0c 看看有没有数据需要它发送 2 中断 xff1a 平时串口只要打开中断即可 如果有中断来即需要传输数据 xff0c 它就马上进行数据的传输 STM32编程 xff1a 1
  • Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结Atitit HT

    Atitit HTTP 认证机制 基本验证 Basic Authentication 和摘要验证 Digest Authentication attilax总结 1 1 最广泛使用的是基本验证 Basic Authentication 和摘
  • 实验二 读取和理解激光雷达数据

    1 体验内容 xff08 1 xff09 为rplidar添加USB权限 注 xff1a 实验室的rplidar A2买得比较早 xff0c 硬件版本可能与github程序不匹配 xff0c 出现运行错误 xff0c 解决方法为到 Wind
  • Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)

    一 linux内核中neitfilter的处理过程 1 5个HOOK点的执行点说明 xff1a 数据包从进入系统 xff0c 进行IP校验以后 xff0c 首先经过第一个HOOK函数NF IP PRE ROUTING进行处理 xff1b 然
  • 基于TCP 实现客户端之间通信【1】

    前段时间学习了基于TCP协议下实现服务器与一个客户端的通信 xff0c 服务器与多个客户端之间的通信 xff0c 以及客户端之间的互相通信 下面就是我写的利用TCP和多线程技术实现客户端之间互相通信的代码 xff1a 服务器端 xff1a
  • 回环接口(loop-back/loopback)

    回环接口 xff08 loop back loopback xff09 Moakap 整理 Loopback 接口是一个虚拟网络接口 xff0c 在不同的领域 xff0c 其含义也大不一样 1 xff0e TCP IP 协议栈中的 loop
  • socket封装HTTP请求

    之前写过两个socket封装的HTTP GET请求 xff0c 可是知其然 xff0c 不知所以然 这次写POST请求就有点懵逼了 还是从大佬的文章出发 xff1a https blog csdn net a19881029 article
  • access中,如何删除不可见空格

    1 可以使用 Trim 函数 xff0c 删除字符串 首 尾 的正常空格 span class token keyword update span 表名 span class token keyword set span 字段 span c
  • Raspberry Pi树莓派分类和其相似产品介绍

    文章目录 前言一 1代树莓派二 2代树莓派三 3代树莓派四 4代树莓派五 树莓派Pico六 目前可替代板子介绍引用 前言 树莓派官网 作为小型计算机的代表 xff0c 树莓派可是作为开山鼻祖 xff0c 本文聊一下目前树莓派几代板子发展历程
  • ARM汇编指令ldr和MOV的区别

    1 八位图 数据 2 MOV指令 MOV指令可以把立即数或者寄存器内容 xff08 注意 xff1a 这里绝对不可以是内存 xff01 xff01 xff09 传递给一个寄存器 MOV对于立即数是有要求的 xff0c 就是上边的 8位图 数
  • GPS NEMA 0183协议

    一 NMEA0183标准语句 GPS常用语句 GPGGA 例 xff1a GPGGA 092204 999 4250 5589 S 14718 5084 E 1 04 24 4 19 7 M 0000 1F 字段0 xff1a GPGGA
  • 使用setvbuf更改printf的默认buffer 行为

    有3种buffer行为 xff0c 不缓冲 xff0c 基于块的缓冲 和 基于行的缓冲 stdout xff08 printf xff09 默认是基于行的缓冲 xff0c 即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候 xf
  • linux 下 tcpdump详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • 结构体与共同体(联合体)的妙用

    结构体与共同体 xff08 联合体 xff09 的妙用 学习过C语言后 xff0c 大家都了解了结构体与共同体 两者之间的区别是 xff1a 共同体 xff1a 使几个不同类型的变量共占一段内存 相互覆盖 所占内存长度是各最长的成员占的内存
  • [北力电子] 无人机4G图传数传一体 pixhawk mavlink GSLINK 720P

    随着无人机和4G技术的发展 xff0c 实时监看空中视角的画面已经成为可能GSLINK突破传统的传输方式 xff0c 利用了4G网络将数据和视频流融为一体进行无限距离的传输 用户使用EC2地面站 xff08 Mission Planner
  • C#笔记(基础篇)

    简介 第一次发博客 xff0c 欢迎交流沟通 因为学习虚拟现实需要所以暑假一个月学了点C xff0c 做了笔记 xff0c 在这进行分享 xff0c 欢迎浏览 有些代码打在VS中 没有记录在笔记里 请见谅 xff08 视频指路 xff09
  • 《机器人操作系统(ROS)浅析》笔记

    机器人操作系统 xff08 ROS xff09 浅析 这是看了 A Gentle Introduction to ROS 这本书后记的笔记 xff0c 网上刚好找得到中文版的 xff0c 就看中文版了 xff0c 欢迎大佬批评指正 xff0

随机推荐