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)
}
刚开始编写代码时,由于对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)
}
stm32485使用记 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)