×
单片机 > 单片机程序设计 > 详情

stm32下485使用记录

发布时间:2020-05-19 发布时间:
|
使用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)
 
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机电子密码锁仿真 可修改密码