STM32的485最简单例程

合集下载

(完整word版)STM32的485最简单例程

(完整word版)STM32的485最简单例程

485最基本的半双工通信配置采用STM32F103ZET6串口3连接485芯片通信口,485芯片的A,B通过485转串口模块与电脑相连,完成在串口软件上输入输出功能。

串口3,配置函数:void USART3_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);// USART3_TX —> PB10 , USART3_RX —> PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure。

GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure。

GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure。

GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_ART_BaudRate = 115200; // 1200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No; //USART_Parity_Even;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure。

rt_thread 下485组件的接收范例

rt_thread 下485组件的接收范例

rt_thread 下485组件的接收范例一、概述本范例介绍如何在RT-Thread实时操作系统下使用485组件接收数据。

RT-Thread是一个开源的实时操作系统,广泛应用于嵌入式系统开发。

本范例将通过示例代码,展示如何配置和使用485组件接收数据。

二、准备工作1.确保已安装RT-Thread实时操作系统,并配置好开发环境。

2.准备用于测试的485设备,并确保其已连接到目标硬件。

三、代码示例以下是一个简单的代码示例,展示了如何在RT-Thread中使用485组件接收数据:```c#include<rtthread.h>#include<rtdevice.h>intmain(){//初始化485设备rt_device_t*dev=rt_device_find(0,"48500");//假设设备编号为0,设备名称为"48500"if(!dev){rt_kprintf("Failedtofind485device.\n");return-1;//配置485设备参数rt_device_open(dev,0);//打开设备rt_device_write(dev,0,"mode=rs485,rts_level_for_tx=1",21) ;//设置485模式为RS485,rts线在发送数据时保持高电平//进入接收模式rt_device_set_rx_threshold(dev,1024);//设置接收阈值为1024字节rt_device_enable_rx(dev);//开启接收模式//循环接收数据while(1){rt_uint8_tdata[1024];//用于存储接收到的数据rt_size_tsize=rt_device_rx(dev,data,sizeof(data));//接收数据,返回实际接收到的字节数if(size>0){//处理接收到的数据...//这里可以根据实际需求对接收到的数据进行解析、存储或发送给其他设备等操作}}return0;}上述代码中,我们首先通过`rt_device_find`函数找到对应的485设备,并使用`rt_device_open`函数打开设备。

STM32F407VGT6的485通信程序【SP34

STM32F407VGT6的485通信程序【SP34

【SP3485芯片&xx接收】本例程为STM32F4XX(M4内核)的485通信程序,采用串口1发送和接收数据,中断接收,将接收到的数据重新发送出去。

主函数文件如下:#include ""/**********************************************************\**文件名:****************************************库版本:***********工作环境:RealView MDK-ARM ***********************作者:曾有根***************************************生成日期:2012-08-03 ************************************功能:RS485通过串口1发送,中断接收!将接收到*****的数据通过再次发送出去*********************\************************************************ **********/extern void uart_init(void);extern void USART1_SendByte(u8 Data);extern unsigned char UART1_GetByte(u8 GetData);extern void delay(unsigned int dl);void delay(unsigned int dl){unsigned int i,y;for(i = 0; i < 5000; i++){for(y = 0; y < dl; y++);}}static void led_init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable the GPIO_LED Clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Configure the GPIO_LED pin */= GPIO_Pin_7 | GPIO_Pin_8 ;= GPIO_Mode_OUT;= GPIO_OType_PP;= GPIO_PuPd_UP;= GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);}int main(void){uart_init();led_init();while (1){USART1_SendByte(0x12);GPIO_SetBits(GPIOE, GPIO_Pin_7 ); //LED1灯闪烁,表示数据发送完成delay(1000);GPIO_ResetBits(GPIOE, GPIO_Pin_7 );delay(1000);}}串口配置程序,文件如下:#include ""extern void delay(unsigned int dl);#define TX_485 GPIO_SetBits(GPIOA,GPIO_Pin_8);#define RX_485 GPIO_ResetBits(GPIOA,GPIO_Pin_8);void USART1_SendByte(u8 SendData){TX_485;//打开发送控制端delay(10);//延时,这个必须加上,不加会导致数据出错USART_SendData(USART1,SendData);//发送数据while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待数据发送完成delay(10);RX_485;//关闭发送控制端}unsigned char UART1_GetByte(u8 MidData){RX_485;//打开接收控制端delay(10);//延时,同样必须加上MidData = USART_ReceiveData(USART1);//接收数据delay(10);TX_485;//关闭接收控制端return MidData;}void USART1_IRQHandler(u8 GetData){u8 BackData;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//中断产生{GetData = UART1_GetByte(BackData);//直接读取寄存器的数据也行GetData = USART1->DR;USART1_SendByte(GetData);//发送数据GPIO_SetBits(GPIOE, GPIO_Pin_8 );//LED2灯闪烁,表示数据接收成功且发送完成delay(1000);GPIO_ResetBits(GPIOE, GPIO_Pin_8 );}}void uart_init(void){USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIO clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* Enable USART clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/* Connect USART pins to A9\10 */GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_USART1);/* Configure USART Tx and Rx as alternate function push-pull */= GPIO_Pin_9;//输出TX= GPIO_Speed_50MHz;= GPIO_Mode_AF;//必须为AF,OUT不行= GPIO_OType_PP;= GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);= GPIO_Pin_10;//输入RX= GPIO_Mode_AF;//必须为AF,与M3不同GPIO_Init(GPIOA, &GPIO_InitStructure);= GPIO_Pin_8 ;//485使能端配置= GPIO_Mode_OUT;= GPIO_OType_PP;= GPIO_PuPd_UP;= GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);= 115200;= USART_WordLength_8b;= USART_StopBits_1;= USART_Parity_No;= USART_HardwareFlowControl_None;= USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); = USART1_IRQn;= 1;= 0;= ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable USART */USART_Cmd(USART1, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_ClearFlag(USART1, USART_FLAG_TC);}说明:已经经本人下载至STM32F4的开发板上成功调试,并且能够正确的收发数据!可供广大奋斗在前线的机油们参考!。

发个STM32的MODBUS主节点程序

发个STM32的MODBUS主节点程序

发个STM32的MODBUS主节点程序由于课题的原因被强迫用了STM32(本来打算2440的),因此认识阿莫电子,看到了版上一众高手,并学了不少知识。

在课题中很多芯片资料的细节都是来源于阿莫电子,快毕业了,潜水了太久,就分享一点STM32的程序,反正很多都是从坛子里学的,我只是整理下拿来用了,献丑了。

处理器STM32F103ZET6是买论坛上一摄像头大师的(感谢免费帮我修了次3232),软件用的KEIL3.5。

我的MODBUS是驱动变频器的,做主节点用,主要实现03功能号和06功能号。

#define RS485Read (GPIO_WriteBit(GPIOG, GPIO_Pin_13,Bit_RESET))#define RS485Write (GPIO_WriteBit(GPIOG, GPIO_Pin_13,Bit_SET))//MODBUS的06功能号,读多个寄存器void ReadInverter(UINT16 Addr,UINT8 N,UINT16 *Values){UINT8 i,l;UINT16 tmp;UINT16 *p;//在发送缓冲里面填数据Inverter.SendBuf[0]=InverterAddr;Inverter.SendBuf[1]=ReadID;Inverter.SendBuf[2]=Addr>>8;Inverter.SendBuf[3]=Addr&0XFF;Inverter.SendBuf[4]=0;Inverter.SendBuf[5]=N;//计算CRC16,填入发送缓冲尾CalCRC(Inverter.SendBuf,6,Inverter.SendBuf+6);//置RS485发送状态RS485Write();//发送数据缓冲Uart_Send(InverterUart,Inverter.SendBuf,8);//清发送缓冲PurgeRecvBuf();m=LISTENING;//关定时器TIM5TIM_Cmd(TIM5, DISABLE);USART_ITConfig(InverterUart,USART_IT_RXNE,ENABLE);RS485Read();Delay(200,m);//既定延时400ms,若m的值变化则退出ResetInverterComm();m=TIME_OUT;//接收缓冲中数据长度为0,则表示超时无应答if(Inverter.Length==0){Inverter.Error=TIME_OUT; //("变频器应答超时");return ;}m=FINISHED;//长度校验if(Inverter.RecvBuf[2]!=Inverter.Length-5){Inverter.Error=FrameErr;return ;//("变频器数据长度错误");}CalCRC(Inverter.RecvBuf,Inverter.Length-2,CRC16);//CRC校验if(*(UINT16 *)(CRC16)!=*(UINT16 *)(Inverter.RecvBuf+Inverter.Length-2)) {Inverter.Error=CheckErr;return ;//("变频器校验错误");}else if(Inverter.RecvBuf[1]==ReadID+0X80){//("变频器读错误,错误号在第三个字节");switch(Inverter.RecvBuf[2]){case Invalid_Func:i =Invalid_Func; break;case Invalid_Addr:i =Invalid_Addr; break;case Invalid_Data:i =Invalid_Data; break;case InverterErr :i =InverterErr ; break;case InverterBusy:i =InverterBusy; break;case CheckErr :i =CheckErr ; break;default :i =UnknowErr ; break;}Inverter.Error=i;return ;}//校验一切正常,变频器操作成功else if(Inverter.RecvBuf[1]==ReadID){l=Inverter.RecvBuf[2]+3;p=(UINT16 *)Values;//接收数据for(i=3;i<l;i+=2){tmp=Inverter.RecvBuf[i];tmp=tmp<<8;tmp=tmp+Inverter.RecvBuf[i+1];*p=tmp;p++;}Inverter.Error=MODBUS_OK;//("读入参数成功:");return ;}//校验一切正常,变频器操作失败else if(Inverter.RecvBuf[1]!=ReadID&&Inverter.RecvBuf[1]!=ReadID+0X80) {Inverter.Error=UnknowErr;//("变频器应答错误");return ;}return ;}void TIM5_IRQHandler(void){if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET){TIM_ClearITPendingBit(TIM5, TIM_IT_Update);TIM_ClearFlag(TIM5, TIM_IT_Update);m=FINISHED;TIM_Cmd(TIM5, DISABLE);USART_ITConfig(InverterUart,USART_IT_RXNE,DISABLE);}}void USART3_IRQHandler(void){if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);if(Inverter.Length<=17){Inverter.RecvBuf[Inverter.Length]=USART_ReceiveData(USART3);Inverter.Length++;}TIM_Cmd(TIM5, ENABLE);TIM_SetCounter(TIM5,0x0000);}}。

基于STM32的485通讯实验(f103)

基于STM32的485通讯实验(f103)

基于STM32的485通讯实验(f103)1.前⾔-单⽚机的通讯在单⽚机通讯⽅式多种多样的今天,基本可以划分为两类,即同步和异步通信。

单⽚机要正常交流(即交换数据和读写命令)离不开通讯,单⽚机之间或者单⽚机与及外设之间的通讯都离不开这两类通讯。

通讯⽅式的分类同步和异步通信怎么区别?带时钟同步信号传输的是同步传输,不带时钟同步信号的是异步传输(此时要求通讯双⽅同波特率)。

下⾯我将通过基于stm32f103芯⽚以及MDK5软件进⾏开发485通讯实验(其实485通讯就是利⽤uart串⼝实现的),需要准备:⼀台装着MDK5软件的电脑ST-LInk烧录器,STM32正点原⼦精英开发板2套(包含TFTLCD显⽰屏)两根杜邦线2.485通讯简介要开展485通讯实验之前,485得对⾃⼰进⾏⼀次⾃我介绍。

485通讯本质上是通过串⼝经过485芯⽚改变电压与及阻抗,内在的信息没有改变,之后通过电压电流等信号传给另⼀个单⽚机的485芯⽚,该芯⽚接⾄该单⽚进的串⼝。

485(⼀般称作RS485/EIA-485)是⾪属于OSI模型物理层的电⽓特性规定为2线,半双⼯,多点通信的标准。

它的电⽓特性和RS-232⼤不⼀样。

⽤缆线两端的电压差值来表⽰传递信号。

RS485仅仅规定了接受端和发送端的电⽓特性。

它没有规定或推荐任何数据协议。

RS485的特点包括:1)接⼝电平低,不易损坏芯⽚。

RS485的电⽓特性:逻辑“1”以两线间的电压差为+(2~6)V表⽰;逻辑“0”以两线间的电压差为-(2~6)V表⽰。

接⼝信号电平⽐RS232降低了,不易损坏接⼝电路的芯⽚,且该电平与TTL电平兼容,可⽅便与TTL 电路连接。

2)传输速率⾼。

10⽶时,RS485的数据最⾼传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。

3)抗⼲扰能⼒强。

RS485接⼝是采⽤平衡驱动器和差分接收器的组合,抗共模⼲扰能⼒增强,即抗噪声⼲扰性好。

4)传输距离远,⽀持节点多。

stm32 485 信号协议格式

stm32 485 信号协议格式

stm32 485 信号协议格式STM32是意法半导体公司推出的一款32位微控制器,广泛应用于工业自动化领域。

其中,STM32 485实现了RS-485通信协议,是一种常用的串行通信协议,适用于长距离通信和多节点通信。

RS-485是电气特性协议,它定义了通信设备之间的电信号行为。

在RS-485协议中,通信设备可以同时工作在主动(发送数据)和被动(接收数据)模式下,适用于两个或多个设备之间的全双工通信。

RS-485支持多达32个设备,每个设备都有一个唯一的地址。

RS-485采用差分信号传输,即发送方将数据以高电平和低电平的形式发送,接收方通过比较两个信号的电平差异来判断接收到的数据。

这样的传输方式使得RS-485具有很强的抗干扰能力,适用于在噪声环境下进行可靠的通信。

对于STM32 485而言,它是集成了RS-485通信功能的STM32微控制器。

具体的信号协议格式如下:1.物理层连接:使用双绞线进行通信,其中A和B线为信号线,D线为数据线,G线为地线。

2.数据帧格式:数据帧由起始位、数据位、奇偶校验位和停止位组成。

起始位和停止位的作用是标识数据帧的开始和结束,数据位是实际传输的数据,奇偶校验位用于检测数据传输过程中的错误。

3.传输速率:RS-485支持多种传输速率,常用的有9600、19200、38400、57600、115200等。

通过STM32的串口配置可以设置传输速率。

4.数据格式:RS-485支持8位数据字节的传输,其中1位为起始位,8位为数据位,1至2位为停止位。

5.控制信号:RS-485中还定义了一些控制信号,包括RTS(请求发送)、CTS(清除发送)、DTR(数据终端就绪)、DSR(数据设备就绪)等。

这些信号可以用于控制数据的发送和接收。

6.通信寻址:RS-485支持多节点通信,每个节点都有一个唯一的地址。

在通信过程中,发送方需要将目标节点的地址包含在数据帧中,接收方根据地址来判断该数据帧是否为自己所需的。

【STM32H7教程】第31章STM32H7的USART应用之RS485

【STM32H7教程】第31章STM32H7的USART应用之RS485

【STM32H7教程】第31章STM32H7的USART应⽤之RS485第31章 STM32H7的USART应⽤之RS485本章教程为⼤家讲解USART应⽤之485总线。

虽然这⼏年⽆线⽹络的使⽤率有所上升,有线的串⾏⽹络仍然提供最有⼒、最可靠的通信,特别是在恶劣的环境中。

在需要抗噪、抗静电、抗电压故障的⼯业,建筑⾃动化领域仍然是有线通信的天下。

31.1 初学者重要提⽰31.2 RS485基础知识31.3 RS485硬件设计31.4 RS485驱动设计31.5 RS485板级⽀持包(bsp_uart_fifo.c)31.6 RS485驱动移植和使⽤31.7 使⽤例程设计框架31.8 实验例程说明(MDK)31.9 实验例程说明(IAR)31.10 总结31.1 初学者重要提⽰1. 学习本章节前,务必优先学习第30章,RS485⽤到的串⼝FIFO也是建⽴在30章的基础上。

2. 了解了本章31.2和31.3⼩节的基础知识后,强烈推荐看此贴的两个⽂档,对RS485讲解的⽐较透彻,中⽂版:。

3. STM32H7⽀持RS485的硬件流控制,即有⼀个专门的引脚来控制485 PHY的收发状态切换。

V7开发板⽤的USART3,需要⽤PD12来控制,⽽这个引脚要⽤于FMC,所以⽤的是⼀个通⽤IO。

4. 经常会有⽹友咨询为什么程序⾥⾯收发切换没有做延迟处理,这⾥就涉及到⼀个关键的知识点TXE发送空中断和TC发送完成中断的区别,详细看教程中说明即可。

31.2 RS485的基础知识背景知识(了解即可)智能仪表是随着80年代初单⽚机技术的成熟⽽发展起来的,现在世界仪表市场基本被智能仪表所垄断。

究其原因就是企业信息化的需要,企业在仪表选型时其中的⼀个必要条件就是要具有联⽹通讯接⼝。

最初是数据模拟信号输出简单过程量,后来仪表接⼝是RS232接⼝,这种接⼝可以实现点对点的通信⽅式,但这种⽅式不能实现联⽹功能。

随后出现的RS485解决了这个问题。

基于STM32F050的RS485数据转发器设计

基于STM32F050的RS485数据转发器设计

1 引言
在 电 能 信 息 采 集 系 统 中 ,通 过 R S 4 8 5总 线 将 电表 直 接 和
3 . 1 硬 件 实 现
R S 4 8 5数 据 转 发 器 的 原 理 如 图 1所 示 .主 要 由 2片 R S 4 8 5 电平 转 换 芯 片 MA X 3 4 5和 C P U S T M3 2 F O 5 0组 成 。R S 4 8 5总 线 上 的电 平转 换 为 的 r I T r L电平 后 ,和 C P U 的普 通 1 0端 口相 连 接 。
的负 载 也 只有 接 口 自身 的 负 载 。
( 2 ) 数据传输方 向控制
当没 有 数据 传 输 时 ,驱 动 D i r l 、D i r 2 位 低 电平 , 由于 上 拉
般超过 1 0 0块 电表 就 很 难 保 证 R S 4 8 5总线 的 正 常 通 信 。设
计 了一 种 R S 4 8 5数 据 转 发 器 .能 够 很 好 地 解 决 连 接 多 块 电 表
的问题。
3 . 2 数据收发口 】 为 了实 现 数 据 从 A、B 1到 A 2 、B 2的 透 明 传 输 。主 要 从
以 下方 面考 虑 : ( 1 ) 数 据 线 电平 控 制 通过 C P U监控 端 口 R x d l和 R x d 2 ,当 R x d l 为高 电平时 , 驱动 T x d 2为 高 电 平 ,为 低 电 平 时 ,驱 动 T x d 2为 低 电 平 ;相 应 地 ,当 R x d 2为 高 电平 时 ,驱 动 T x d l为 高 电 平 ,为 低 电 平 时 。驱 动 T x d 1 为低电平。
集 中 器 或 者 采 集 器 连 接 .可 以 实 现 与 电 表 的 可 靠 通 信 。随 着
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

485最基本的半双工通信配置采用STM32F103ZET6串口3连接485芯片通信口,485芯片的A,B通过485转串口模块与电脑相连,完成在串口软件上输入输出功能。

串口3,配置函数:void USART3_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);// USART3_TX -> PB10 , USART3_RX ->PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_ART_BaudRate = 115200; // 1200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No; //USART_Parity_Even;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART3, &USART_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);#ifdef PDU_USART3_DMAUSART_ITConfig(USART3, USART_IT_IDLE, ENABLE);#else// Enable the USART Receive interrupt: this interrupt is generated when the//USART3 receive data register is not empty//USART_ClearITPendingBit(USART3, USART_IT_TC);USART_ClearFlag(USART3,USART_FLAG_TC);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_ITConfig(USART3, USART_IT_TC, ENABLE);//USART_ITConfig(USART3, USART_IT_TXE, ENABLE);USART_ClearFlag(USART3,USART_FLAG_TC);#endifUSART_Cmd(USART3, ENABLE);USART_ClearFlag(USART3,USART_FLAG_TC);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);RS_485_TX_ENABLE();}PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART */USART_SendData(USART3, (uint8_t) ch);//USART_SendData(USART1,(uint8_t)ch);/* Loop until the end of transmission *///while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET){}return ch;}中断函数:void USART3_IRQHandler(void){if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) {USART_ClearITPendingBit(USART3, USART_IT_IDLE);}if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)!=RESET) {USART_ClearFlag(USART3,USART_FLAG_RXNE);TIM3_Init(1000, 7200);BLUE_ON();if(cnt>=32){cnt=0;}else{data[cnt]=USART_ReceiveData(USART3);cnt++;}}if ((USART_GetITStatus(USART3, USART_IT_TC) != RESET) ||(USART_GetITStatus(USART3, USART_IT_TXE) != RESET) ){USART_ClearITPendingBit(USART3, USART_IT_TC);USART_ClearITPendingBit(USART3, USART_IT_TXE);// USART_SendData(USART3, 0XFFFF);}}void TIM3_IRQHandler(void){if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM3, TIM_IT_Update);TIM3_DeInit();BLUE_OFF();// printf("\r\n %x",cnt);cnt=0;}}static void NVIC_TIM3Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Set the Vector Table base address at 0x08000000 *///NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);/* Enable the TIM3 gloabal Interrupt */NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}定时器:void TIM3_Init(uint16_t tcon, uint16_t psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// TIM3 clock enableRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// reset timerTIM_DeInit(TIM3);// Time base configuration// value to reloadTIM_TimeBaseStructure.TIM_Period = (tcon - 1);// pre-scaler value against system clockTIM_TimeBaseStructure.TIM_Prescaler = (psc - 1);// scaler value against system clockTIM_TimeBaseStructure.TIM_ClockDivision = 0;// counting modeTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// init timerTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// Clear TIM3 update pending flagTIM_ClearITPendingBit(TIM3, TIM_IT_Update);// TIM IT enable of over-countingTIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);// config timer's interruption functionNVIC_TIM3Configuration();// Enable TIM3 counterTIM_Cmd(TIM3, ENABLE);}void TIM3_DeInit(void){// Disable TIM3 counterTIM_Cmd(TIM3, DISABLE);// Reset timerTIM_DeInit(TIM3);// Disable TIM3 clockRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);//tim3_stat = 0x00;}主函数:#ifdef __GNF__#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ */#endif /* __GNF__ */void Delay(uint32_t tick){while(tick--);}/* Private function prototypes -----------------------------------------------*/extern unsigned char data[size];extern volatile unsigned char cnt;/************************************************************************** ****** Function Name : main* Description : Main program* Input : None* Output : None* Return : None* Attention : None*************************************************************************** ****/int main(void){/*USART configuration*/USART3_Config();RED_ON();BLUE_ON();GREEN_ON();Delay(100000);BLUE_OFF();RED_OFF();GREEN_OFF();/* Infinite loop */while (1){uint8_t i=0;RS_485_TX_ENABLE();printf("\r\n up up day! ");for(i=0;i<50;i++){GREEN_ON();Delay(500000);GREEN_OFF();Delay(500000);}RS_485_RX_ENABLE();while(data[0]==0x00){RED_ON();Delay(500000);RED_OFF();Delay(500000);}memset(data,0,size);}}。

相关文档
最新文档