STM32f407的485传感器数据获取
485型传感器数据获取
项目场景:
通过STM32F407芯片USART3获取485型传感器的数据,使用的是创思通信的STM32 4G开发板,红色圈的内容是这块开发板的USART3,直接通过s3485芯片引出485的AB脚
问题描述:
在使用USART3向485型传感器发送询问帧的时候数据一致发送不出去,其他的串口都正常
原因分析:
后来经过高人提点,终于发现了问题所在,主要有两个问题
1、在STM32F4芯片上,每个端口和串口都有一个外部时钟,对模块初始化时需要进行时钟初始化,对串口初始化时要先进行串口时钟初始化和串口引脚的时钟初始化我的初始化USART3的代码是在USART1的初始化代码基础上改的,查询手册第53页可以看到USART1在APB2总线上,USART3在APB1总线上,两个总线上的初始化函数时不同,而我初始化时没有注意到这个问题。
正确代码
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART2时钟
错误
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART2时钟
2、这个是芯片的USART3通过SP3485引出的485接口的电路图
通过图片我们可以看到和开发板连接时不仅有串口的RX和TX,还有一个485的使能引PE4,因为以前使用的都是淘宝买的TTL转485的模块,只需要连接好转换模块,控制串口收发即可,不需要控制485的使能引脚,但这种方法在这里是行不通的,SP485的工作方式是半双工的,查询SP485的手册得知使能引脚高电平控制485发数据,使能引脚低电平控制485收数据。
这个问题的解决方法很简单,在串口发数据是将是能引脚置位,发送数据完成将引脚再次复位即可。
//串口3的发送函数
void Uart3_SendStr(u8* SendBuf,u8 len)
{
GPIO_SetBits(GPIOE,GPIO_Pin_4);//执行发数据是将其置位,485处于可以发送状态
while(len>0)
{
while((USART3->SR&0X40)==0);//等待发送完成
USART3->DR = (u8) *SendBuf;
SendBuf++;
len--;
}
while((USART3->SR&0X40)==0); //这个循环一定要有,确保最后一位数据发送出去,避免因为复位导致数据未全部发送,我就在这个地方找了好久
GPIO_ResetBits(GPIOE,GPIO_Pin_4); //数据发送完毕将其复位,等待接收数据
}
心得:
在进行嵌入式开发过程中,一定一定要多看芯片手册和电路原理图,虽然看芯片手册很麻烦,但可以避免开发过程中的很多麻烦问题,电路图也是重中之重,我就是吃了这个亏,在这个地方浪费了好几天时间,导致我一直怀疑自己是不是个憨批。
数据手册也不需要全部掌握,STM32的芯片数据手册基本上都是一千页以上,把主要的内容有个大致了解就行,主要就是USART,GPIO,寄存器这些东西。