使用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)
}
关键字:stm32 使用记录
引用地址:
stm32下485使用记录
推荐阅读最新更新时间:2024-03-16 14:02
STM32 IAP的使用关键点
所谓IAP其实就相当于一个小小的bootloader 用来更新程序的 很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程 typedefvoid(*pFunction)(void); pFunctionJump_To_Application; unsignedlongJumpAddress; if(!Check_Whether_Enter_UpdateMode())/
[单片机]
STM32复位来源 以及系统和内核复位区别
1STM32的复位和时钟控制 RCC:Reset and Clock Control 每一块STM32中都有这么一个RCC复位和时钟控制模块。 STM32的复位为三类:系统复位、电源复位和后备域复位。 系统复位: 1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWDG复位) 3. 独立看门狗计数终止(IWDG复位) 4. 软件复位(SW复位) 5. 低功耗管理复位 电源复位: 1. 上电/掉电复位(POR/PDR复位) 2. 从待机模式中返回 备份区域复位: 1. 软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。 2. 在VDD和VBAT两者掉电的前提下, VDD或VB
[单片机]
STM32的EXTI小实验
stm32并没有使用Cortex-M3的全部256个中断,只用了一部分(16个内核+68个外部中断) 中断线 所有GPIO口的0号引脚对应EXTI0中断线,类似的PA1~PG1对应EXTI1中断线。 中断服务函数 中断服务函数名必须与启动文件startup_stm32F10x_hd.s的中断向量表定义一致 中断线0~4对应EXTI0_IRQHandler();EXTI1_IRQHandler();EXTI2_IRQHandler();EXTI3_IRQHandler(); 中断线5~9共用EXTI9_5_IRQHandler(); 中断线10~15共用EXTI15_10_I
[单片机]
STM32F10x USART串口映射功能实现串口通讯 485初始化
篇文章很有用!新手不要自以为是,STM32串口管脚重映射小样你会吗??? STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器。通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 从前面的介绍可知USART模块功能非常的强大。这里我只简单讲讲如何用USART模块来实现标准EIA-232 串口通讯。 用过单片机的人肯定都接触过
[单片机]
485的插口种类
以上我们了解了串口的协议,而我们日常工作中接触最多的是实际的一些 设备 的外部接口,我们如何从外形上就知道它是那种接口呢?制作线缆各针脚如何定义?上面我们知道了串口RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。从我们实际工作中碰到的使用最多的插口有三种DB9 DB25 RJ45,上面三种插口插件都可以用作串口插口插件,也可以通过线缆进行插口之间的转换。下面我们就三种插口的针脚定义分别说明,三个插口之间的转换也只要按照插口定义的线缆跳接即可。
图2 * DB9(9脚插口插座),如图2。9针串口功能如表1。
* DB25(25脚插口插座
[嵌入式]
STM32+ESP8266+MQTT协议连接阿里云物联网平台
一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 硬件连接功能:ESP8266接在STM32的串口3上。通过AT指令与ESP8266进行通信。 注意:本篇文章没有贴ESP8266的底层编程代码,如果不会ESP8266底层编程,请看这里: https://blog.csdn.net/xiaolong1126626497/article/details/107379554 想了解STM32+ESP8266使用MQTT协议连接OneNET 中国移动服务器的看这里: https
[单片机]
STM32的小开发板的设计
分析一个STM32的小开发板的设计: 先看2D的预览 底面 多个电容来滤波 一个晶振提供时基 就是长这样 这个是提供一个复位电平 原理图里面都是使用的网络标签,在原理图里面只要一个引脚的名字一样,它就是连在一起的。 选择一个便宜的LDO 最小的原理图 俩脚控制IO,LED 围着三组引脚,名字一样就可以 原理图是简单的,接下来看PCB版图的设计,我感觉PCB最难的地方是这个。 先看看这个布局 设计好的样子是这样的,让我一层一层的往回推,学习它的设计 这里是为了好走线,旋转了一下U,45° 这里就可以旋转了 把文档和顶层丝印层都关了 现在的样子就是这样的 在这里看
[单片机]
基于STM32单片机和EM310的无线终端设计
0引言 在监测监控及数据采集系统(SCADA)系统中,采集数据的实时性和准确性对系统有很大的影响,合适的通信网络可以有效提高SCADA系统的效益,本文设计的GPRS无线终端在SCADA系统中的应用解决了上述问题,除满足数据实时性和准确性外,还具有建设成本低.结构简单.传输容量大.可远程控制等优势. 1 终端简介 1.1终端结构 无线终端由EM310GSM模块和STM32F103单片机构成,以STM32F103单片机为核心,STM32F103单片机有丰富的通信接口,用于连接EM310和现场仪表;还有丰富的I/O资源,可以扩展较大容量的RAM,一方面存储指令集,用于解读指令并作出相应的动作;另一方面用于暂时
[单片机]