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

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

一直在用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)

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

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值