关于STM32串口调试RS485时自动进入接收中断

Posted Arbo_Xjb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32串口调试RS485时自动进入接收中断相关的知识,希望对你有一定的参考价值。

先说一下软硬件:

硬件:主控stm32c8t6、485芯片为隔离型芯片ADM2483,调试工具是usb转485接到PC端。

软件:采用库函数开发,开发工具为IAR 7.10,485接的是stm32的串口1(收发都是用中断方式),半双工模式, 协议是MODBUS RTU。

先说明本人是菜鸟,在不断得学习中,欢迎指出错误。

最近在调试RS485时发现一个问题,如果在串口初始化时就使能了发送中断和接收的话,那么在发送一个字节后就会自动进入接收中断。可能是收发的机制没有定好,所以后面采用的方式是在初始化时使能了接收中断,关闭发送中断,在需要发送数据的时候再开启发送中断,发送的时候关闭接收中断,发送完一帧再使能接收中断。这样就可以完整地发送一帧数据出去了。

但是随之而来的问题就是,板子没有接收到数据的时候也会进入接收中断,通常是00、F0、C0、FE、80这样的数据,让我觉得很奇怪,心想是不是串口工具有干扰,于是我就把串口工具拔了,结果还是会进入接收中断,收到的数据还是之前那些。初步判定是硬件问题,因为硬件是之前的同事留下的,所以硬件我也不清楚能不能用;在查阅了许多网友的问题后,有一点给我提示了,就是 485电路的接收端是否有上拉电阻,如果没有,你配置成上拉输入就可以了”  我看了一下板子,是没有接上拉电阻的,而我在初始化的时候设置接收端的模式为 “浮空输入”,按照网友的想法,把输入模式修改为“上拉输入”GPIOInit.GPIO_Mode = GPIO_Mode_IPU 问题果然解决了。

总结:在调试485的时候,即使没有收到数据也会进入接收中断,如果硬件方面板子的485接收端有上拉电阻,那么端口初始化接收端可以设置为浮空输入,如果没有上拉电阻,那么端口初始化时就要设置为上拉输入。

贴上初始化的代码,希望能帮到有需要的人:

<pre name="code" class="cpp">//*******************************************************************
//作用:RS485初始化
//参数:BPS-波特率
//      StopBit-停止位,1为1位,2为2位
//      Parity-校验方式,0为无校验,1为寄校验,2为偶校验
//返回:无
//*******************************************************************
void RS485Init(Uint32 BPS, Uint8 StopBit, Uint8 Parity)

	GPIO_InitTypeDef GPIOInit;
	USART_InitTypeDef USARTInit;
	NVIC_InitTypeDef NVICInit; 

       //初始化485使能脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
	GPIOInit.GPIO_Pin = GPIO_Pin_15;
	GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
	GPIOInit.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIOInit);
    
	//初始化USART1中断优先级
	NVICInit.NVIC_IRQChannel = USART1_IRQn;
	NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
	NVICInit.NVIC_IRQChannelSubPriority = 1;
	NVICInit.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInit);

	//初始化USART1管脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);	
	GPIOInit.GPIO_Pin = GPIO_Pin_9;
	GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
	GPIOInit.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIOInit);
    
	GPIOInit.GPIO_Pin = GPIO_Pin_10;
	GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
	// GPIOInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIOInit.GPIO_Mode = GPIO_Mode_IPU;//此处设为上拉输入
	GPIO_Init(GPIOA, &GPIOInit);
	
	//初始化USART1参数
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	USARTInit.USART_BaudRate = BPS ;
	if(StopBit == 1)
	
	    USARTInit.USART_StopBits = USART_StopBits_1;
	
	else
	
	    USARTInit.USART_StopBits = USART_StopBits_2;
	
	if(Parity == 0)
	
		USARTInit.USART_WordLength = USART_WordLength_8b;
		USARTInit.USART_Parity = USART_Parity_No;
	
	else if(Parity == 1)
	
		USARTInit.USART_WordLength = USART_WordLength_9b;
		USARTInit.USART_Parity = USART_Parity_Odd;
	
	else
	
		USARTInit.USART_WordLength = USART_WordLength_9b;
		USARTInit.USART_Parity = USART_Parity_Even;	
	
	USARTInit.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USARTInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART1, &USARTInit);
	USART_ITConfig(USART1, USART_IT_TC, DISABLE); 
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
    USART_Cmd(USART1, ENABLE);
	USART_ClearFlag(USART1, USART_FLAG_TC);
    RS485RXEn();				//接收使能,根据485芯片设置:高电平则发送使能,低电平则接收使能


 


以上是关于关于STM32串口调试RS485时自动进入接收中断的主要内容,如果未能解决你的问题,请参考以下文章

stm32h750串口发送中断关掉

stm32---RS485半双工通信

STM32串口发送中断

2018-10-22 使用SN75176(RS485)通讯与STM32连接发现的问题

求助:很急!关于STC 8位单片机上电后,无法进入串口接收中断的问题

stm32串口接收字符串的函数