微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32下485使用记录

stm32下485使用记录

时间:12-01 来源:互联网 点击:
使用STM32做为控制器,板上要求有4个485接口,一个232接口,当232有数据到达时,按条件转发给485,当485有数据到达时,无条件转给232
刚开始编写代码时,由于对485使用不熟悉,不知道该注意哪些,就直接编写程序:
1.配置管脚,这里管脚配置232与485是一样的,但485要用一个管脚的高低电平控制输入输出方向,这里使用使用4个管脚对串口2--串口4控制
2.中断配置,每个串口给与打开对应的中断线,并给与一定的优先级
3.串口配置,这里包含时钟、波特率、8N1等,并选择使用的中断事件,这里所有串口都选用接收中断
232配置和485配置是一样的,无非485是半双工的,需要控制方向,还有一个特别注意的地方,也是我记录这个文档的原因:
由于硬件是我手工制作,不确定所用串口都能使用,所以使用循环输出测试是否到pc的串口助手,测试结果发现程序一直会进入
输入中断,没错是输入中断,发送数据进入输入中断,后经仔细研究发现问题,代码如下:
主函数
int main(void)
{
u8 cmd = 0xaa;
//配置过程不写了
while(1)
{

serial3_putchar(cmd);

}

}

串口接收中断我已打开,这里不写了
串口3发送字节函数
void Serial3PutChar(u8 c)
{
int i;

MAX485EN3(); //485输出控制 GPIO_SetBits(GPIOE, GPIO_Pin_15)

USART_SendData(USART3, c);

while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);

MAX485RE3(); //485输入控制 GPIO_ResetBits(GPIOE, GPIO_Pin_15)

}
串口中断服务子程序
void USART3_IRQHandler(void)
{

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Serial1PutChar(Serial3GetChar()); //串口1发送串口2接收到的数据

USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}

后来经过本人查找资料及反复思量,发现问题是485发送数据的时间不够,后经修改波特率为9600,输入中断不再产生,
但发送数据与接收到的数据不相同,后在发送函数内加了一定时间延时,方可!
void Serial3PutChar(u8 c)
{
int i;

MAX485EN3(); //485输出控制 GPIO_SetBits(GPIOE, GPIO_Pin_15)

delay_mS(1);

USART_SendData(USART3, c);

while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);

delay_mS(10);

MAX485RE3(); //485输入控制 GPIO_ResetBits(GPIOE, GPIO_Pin_15)

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top