本帖最后由 刘洋讲单片机 于 2017-1-11 14:51 编辑
众拳【剑齿虎STM8】开发板学习笔记分享 第24讲 RS485串口接收数据控制LED
目 录
24.1 RS485概述 (1). RS-485的电气特性:采用差分信号负逻辑,逻辑"0”以两线间的电压差为+(2~6)V表示;逻辑"1"以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。 (2). RS-485的数据最高传输速率为10Mbps。 (3). RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。 (4). RS-485最大的通信距离约为1219m,最大传输速率为10Mbps,传输速率与传输距离成反比,在100KbpS的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
图24.1 RS485原理图 从原理图中可以看出,RS485有一点发送/接收置态控制端,如果CPU想发送数据,要把RS485置态控制端(PG6/485_DIR)拉高,如果想接收数据,要把RS485置态控制端(PG6/485_DIR)拉低。 24.2实验目的 通过RS485通讯功能接收数据控制3个发光二极管的点亮和熄灭。计算机侧通过“蓝精灵多功能监控软件”串口调试窗口输入我们设计好的数字,发光二极管就会受我们发送的数据控制。 24.3程序文件设计24.3.1 lib文件中内容分析我们在“Lib”文件夹,把需要引用系统本身定义好的库函数添加在其中,我们使用到哪个外设功能,直接引用到此文件夹中即可。 图24.2 “Lib”文件夹更改内容 本节实验及以后的实验我们都是用到库文件,其中 stm8s_conf.h头文件包含了所有外设的声明头文件,在本试验中我们使用到时钟外设和GPIO端口外设。所以#include "stm8s_clk.h"、#include "stm8s_uart3.h"和#include "stm8s_gpio.h"需要“打开”(就是把语句前面的双斜线注释符号删除即可,参考图17.1)。Stm8s_gpio.c库函数包含了所有管脚初始化功能和具体的执行操作;Stm8s_clk.c库函数主要包含了内部时钟和外部时钟设置,在主函数中规定了具体的执行方法,在这个函数中就有具体相关的执行步骤;Stm8s_uart3.c库函数主要包含了串口3相关寄存器设置和uart3库函数具体执行过程。 24.3.2 main.c文件中的程序主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。 /*********************************************************************** * 说 明: RS485通讯控制LED发光或者熄灭 * 开发平台: 剑齿虎STM8开发板
* 关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。 * STM8技术交流QQ群【335123291】 * 哈尔滨卓恩科技开发有限公司 * * 作 者: 刘洋 张殿东 * 版 本: V1.0 * 日 期: 2016-05-03 * * IAR开发环境 版本 V2.20.1 * ST库函数 版本 V2.2.0 ***********************************************************************/ #include "pbdata.h"//引入自定义公共头文件 void BSP_Configuration(void);//硬件初始化函数声明 /*********************************************************************** * 函 数 名: main * 功能说明: c程序入口 * 形 参:无 * 返 回 值: 错误代码(无需处理) ***********************************************************************/ int main(void) { BSP_Configuration();//硬件驱动初始化函数
while(1)//主程序循环,反复执行循环体里的语句 { UART3_Control_LED();//RS485接收数据控制LED灯 } } /*********************************************************************** * 函 数 名: BSP_Configuration * 功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。 * 形 参:无 * 返 回 值: 无 ***********************************************************************/ void BSP_Configuration(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频, UART3_Congfiguration(); LED_Init();//调用LED初始化函数 rim();//打开总中断 } /*断言函数:它的作用是在编程的过程中为程序提供参数检查*/ #ifdef USE_FULL_ASSERT void assert_failed(u8* file,u32 line) { while(1) { } } #endif 24.3.3 uart3.c文件中的程序#include "pbdata.h" u8 uart3_gs=0;// UART3接收数据指针 u8 uart3_try[20];// UART3接收数据存放的数组 /*************************************************************************** * 函 数 名: UART3_Congfiguration * 功能说明: UART3 配置函数 * 形 参:无 * 返 回 值: 无 ***************************************************************************/ void UART3_Congfiguration(void) { //配置串口参数为:波特率9600,8位数据位,1位停止位,无校验,允许接收发送 UART3_Init((u32)9600,UART3_WORDLENGTH_8D,UART3_STOPBITS_1,UART3_PARITY_NO,UART3_MODE_TXRX_ENABLE); UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);//使能接收中断 UART3_Cmd(ENABLE);//使能UART3 GPIO_Init(RS485_PORT, RS485_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);//初始化485控制端 低电平接收数据 高电平发送数据 } /*************************************************************************** * 函 数 名: UART3_Send_Byte * 功能说明: UART3发送数据函数 * 形 参:u8 byte 一次发送一个字节 * 返 回 值: 无 ***************************************************************************/ void UART3_Send_Byte(u8 byte) { UART3_SendData8(byte);//UART1发送8位数据 while(UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET);//等待发送完成 } /*************************************************************************** * 函 数 名: UART3_Send_Str * 功能说明: RS485串口转发函数 * 形 参:无 * 返 回 值: 无 ***************************************************************************/ void UART3_Send_Str(void) { u8 i=0; if(uart3_gs>0)//如果大于 0 证明串口接收到数据了 { delay_ms(20);//延时等待接收后面的字节 RS485_DIR_H;//485准备发送数据 delay_ms(2);//等待485控制端稳定 for(i=0;i<uart3_gs;i++)//发送所有接收到的数据 { UART3_Send_Byte(uart3_try); } delay_ms(2);//等待数据发送完成 RS485_DIR_L;//切换至接收状态 uart3_gs=0;//接收指针清零,指向数组的第0个位置。下次再有数据接收时从第0个位置装入。 } } /************************************************************************** * 函 数 名: UART3_Control_LED * 功能说明: RS485接收数据控制LED灯 * 形 参:无 * 返 回 值: 无 **************************************************************************/ void UART3_Control_LED(void) { if(uart3_gs>0)//如果大于 0 证明串口接收到数据了 { delay_ms(10);//延时等待接收后面的字节 if(uart3_gs==3) { if(uart3_try[0]==0x01) LED1_L;//发光 if(uart3_try[0]==0x02) LED1_H;//熄灭 if(uart3_try[0]==0x03) LED1_R;//状态取反
if(uart3_try[1]==0x01) LED2_L;//发光 if(uart3_try[1]==0x02) LED2_H;//熄灭 if(uart3_try[1]==0x03) LED2_R;//状态取反
if(uart3_try[2]==0x01) LED3_L;//发光 if(uart3_try[2]==0x02) LED3_H;//熄灭 if(uart3_try[2]==0x03) LED3_R;//状态取反 } uart3_gs=0;//指针复位 } } 24.3.4 uart3.h文件中的程序/*********************************************************************** * 剑齿虎STM8开发板硬件连接 * PD6/UART3_RXD * PD5/UART3_TXD ************************************************************************/ #ifndef _UART3_H //宏定义,定义文件名称 #define _UART3_H /*--------------------------头文件引用------------------------------------*/ #include "stm8s.h" /*--------------------------宏定义声明------------------------------------*/ #define RS485_PIN GPIO_PIN_6 //定义GPIO_PIN_6引脚为RS485_PIN,相当于重新命名。 #define RS485_PORT GPIOG //定义GPIOG端口为RS485_PORT,相当于重新命名。 #define RS485_DIR_L GPIO_WriteLow(RS485_PORT,RS485_PIN); //定义RS485_DIR_L,调用RS485_DIR_L命令,PG6引脚输出低电平 #define RS485_DIR_H GPIO_WriteHigh(RS485_PORT,RS485_PIN);//定义RS485_DIR_H,调用RS485_DIR_H命令,PG6引脚输出低高平 /*--------------------------变量声明-------------------------------------*/ extern u8 uart3_gs;// UART3接收数据指针 extern u8 uart3_try[20];// UART3接收数据存放的数组 /*--------------------------函数声明-------------------------------------*/ void UART3_Congfiguration(void);//UART3 配置函数 void UART3_Send_Byte(u8 byte);//UART3发送数据函数 void UART3_Send_Str(void);//RS485串口转发函数 void UART3_Control_LED(void);//RS485接收数据控制LED灯 #endif//定义文件名称结束 24.3.5 stm8s_it.c文件中的程序中断和中断处理子程序建立关系必须在stm8s_it.c文件中对应位置中建立。关于串口1的中断处理子程序要写在事先定义好的入口之内。“INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)”,所以中断处理子程序入口地址必须放在uart3中断处理中,请看下面程序语句。 INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21) { if(uart3_gs<20) { uart3_try[uart3_gs++]=UART3_ReceiveData8(); } else { uart3_gs=0; } } 24.3.6 补充说明我们自定义的最简单的一个通讯协议,实际在项目中我们设计的通讯协议通讯协议比这复杂的多,比如在工业控制中使用的modbus协议。 串口3没有同步模式,配置是请注意。 我们采用RS485转USB通讯模块与开发板进行通讯,开发板一侧使用双绞线连接在接线端子上。在开发板上有清晰的485A、485B标识。详细接线方式请参考视频资料。
|