stm32实验485实验

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "tpad.h"
#include "oled.h"
#include "lcd.h"
#include "usmart.h"
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dac.h"
#include "dma.h"
#include "24cxx.h"
#include "flash.h"
#include "rs485.h"
int main(void)
{
u8 key;
u8 i=0,t=0;
u8 cnt=0;
u8 rs485buf[5];
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
usmart_dev.init(72); //初始化USMART
KEY_Init(); //按键初始化
RS485_Init(36,9600); //初始化RS485
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"WarShip STM32");
LCD_ShowString(60,70,200,16,16,"RS485 TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/9");
LCD_ShowString(60,130,200,16,16,"KEY0:Send"); //显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,"Count:"); //显示当前计数值
LCD_ShowString(60,170,200,16,16,"Send Data:"); //提示发送的数据
LCD_ShowString(60,210,200,16,16,"Receive Data:"); //提示接收到的数据
while(1)
{
key=KEY_Scan(0);
if(key==KEY_RIGHT)//KEY0按下,发送一次数据
{
for(i=0;i<5;i++)
{
rs485buf[i]=cnt+i;//填充发送缓冲区
LCD_ShowxNum(60+i*32,190,rs485buf[i],3,16,0X80); //显示数据
}
RS485_Send_Data(rs485buf,5);//发送5个字节
}
RS485_Receive_Data(rs485buf,&key);
if(key)//接收到有数据
{
if(key>5)key=5;//最大是5个数据.
for(i=0;i<key;i++)LCD_ShowxNum(60+i*32,230,rs485buf[i],3,16,0X80); //显示数据
}
t++;
delay_ms(10);
if(t==20)
{
LED0=!LED0;//提示系统正在运行
t=0;
cnt++;
LCD_ShowxNum(60+48,150,cnt,3,16,0X80); //显示数据
}
}
}。

合集下载

stm32驱动RS485

stm32驱动RS485

/******************************************************************************** * @file USART/Interrupt/main.c* @author MCD Application Team* @version V3.3.0* @date 04/16/2010* @brief Main program body****************************************************************************** * @copy** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONL Y AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>*//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include "platform_config.h"#include "stm32_eval.h"#include "stdio.h"/** @addtogroup STM32F10x_StdPeriph_Examples* @{*//** @addtogroup USART_Interrupt* @{*/GPIO_InitTypeDef GPIO_InitStructure;/* Private typedef -----------------------------------------------------------*/typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;/* Private define ------------------------------------------------------------*/#define TxBufferSize (countof(TxBuffer) - 1)#define RxBufferSize TxBufferSize/*RS485工作模式*/#define IDLE 0#define RX_MODE 1#define TX_MODE 2/* Private macro -------------------------------------------------------------*/#define countof(a) (sizeof(a) / sizeof(*(a)))/* Private variables ---------------------------------------------------------*/USART_InitTypeDef USART_InitStructure;uint8_t TxBuffer[] = " RS485总线收发实验";uint8_t RxBuffer[RxBufferSize];__IO uint8_t TxCounter = 0x00;__IO uint8_t RxCounter = 0x00;uint8_t NbrOfDataToTransfer = TxBufferSize;uint8_t NbrOfDataToRead = RxBufferSize;__IO TestStatus TransferStatus = FAILED;u8 RS485_Mode = IDLE;/* Private function prototypes -----------------------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);void RX_Mode(void);void TX_Mode(void);void GPIO_KEY_Config(void);u8 ReadKeyDown(void);void Delay_ARMJISHU(__IO uint32_t nCount);void RS485_MODE_SET(void);void Led_Ctrl(uint16_t LEDNum, uint8_t LEDOnOff);/* Private functions ---------------------------------------------------------*/#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset 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__ *//*** @brief Main program* @param None* @retval None*/int main(void){/*!< At this stage the microcontroller clock setting is already configured,this is done through SystemInit() function which is called from startupfile (startup_stm32f10x_xx.s) before to branch to application main.To reconfigure the default setting of SystemInit() function, refer tosystem_stm32f10x.c file*/u8 i = 0;/* System Clocks Configuration */RCC_Configuration();/* NVIC configuration */NVIC_Configuration();/* Configure the GPIO ports */GPIO_Configuration();GPIO_KEY_Config(); //按键使用的GPIO初始化GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN);/*关闭所有的LED指示灯*//* USART1 and USART2 configured as follow:- BaudRate = 9600 baud- Word Length = 8 Bits- One Stop Bit- No parity- Hardware flow control disabled (RTS and CTS signals)- Receive and transmit enabled*/USART_ART_BaudRate = 115200; /*设置波特率为115200*/USART_ART_WordLength = USART_WordLength_8b;/*设置数据位为8*/ USART_ART_StopBits = USART_StopBits_1; /*设置停止位为1位*/ USART_ART_Parity = USART_Parity_No; /*无奇偶校验*/ USART_ART_HardwareFlowControl =USART_HardwareFlowControl_None;/*无硬件流控*/USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; /*发送和接收*//*配置串口1 */USART_Init(USART1, &USART_InitStructure);USART_ART_BaudRate = 9600; /*设置波特率为115200*/ USART_ART_WordLength = USART_WordLength_8b;/*设置数据位为8*/ USART_ART_StopBits = USART_StopBits_1; /*设置停止位为1位*/ USART_ART_Parity = USART_Parity_No; /*无奇偶校验*/ USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;/*无硬件流控*/USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; /*发送和接收*//*配置串口2*/USART_Init(USART2, &USART_InitStructure);/* 使能串口1 */USART_Cmd(USART1, ENABLE);Led_Ctrl(DS1_PIN,ON); //点亮所有LED灯Delay_ARMJISHU(6000000);Led_Ctrl(DS1_PIN,OFF); //熄灭所有LED灯Delay_ARMJISHU(6000000);Led_Ctrl(DS1_PIN,ON); //点亮所有LED灯printf("\n\r---------------------------------------------\n ");printf("\n\r神舟III号485总线发送实验\n");printf("\n\r--按USER2按键设置神舟III号为RS485发送端\n");printf("\n\r--按USER1按键设置神舟III号为RS485接收端\n");printf("\n\r---------------------------------------------\n ");while(RS485_Mode == IDLE){RS485_MODE_SET();}/* Check the received data with the send ones *///TransferStatus2 = Buffercmp(TxBuffer1, RxBuffer2, RxBufferSize2);/* TransferStatus2 = PASSED, if the data transmitted from USART1 andreceived by USART2 are the same *//* TransferStatus2 = FAILED, if the data transmitted from USART1 andreceived by USART2 are different */while(1){if(RS485_Mode == RX_MODE)//RX模式{USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);while(RxCounter < RxBufferSize){;}printf("\n\r接收到的数据:");printf("[%s]",RxBuffer);RxCounter = 0;}else if(RS485_Mode == TX_MODE) //TX模式{/*使能串口2的发送*/USART_ITConfig(USART2, USART_IT_TXE, ENABLE);/* Wait until end of transmission from USART1 to USART2 */while(TxCounter < TxBufferSize){;}printf("\n\r正在发送数据:");for(i = 0 ; i < NbrOfDataToTransfer; i++ ){printf("%c",TxBuffer[i]);if( i == NbrOfDataToTransfer ){printf("\n\r");}}TxCounter = 0;Delay_ARMJISHU(6000000);}else{RS485_MODE_SET();}}}void RX_Mode(void){/*设置为接收模式*/GPIO_ResetBits(GPIOF,GPIO_Pin_11);}void TX_Mode(void){/*设置为接收模式*/GPIO_SetBits(GPIOF,GPIO_Pin_11);}/*** @brief Configures the different system clocks.* @param None* @retval None*/void RCC_Configuration(void){/*使能串口1和串口2使用的GPIO时钟*/RCC_APB2PeriphClockCmd(USART1_GPIO_CLK |USART2_GPIO_CLK, ENABLE); /* Enable USART1 Clock *//*使能串口1时钟*/RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);/*使能串口2时钟*/RCC_APB1PeriphClockCmd(USART2_CLK, ENABLE);/*使能LED灯使用的GPIO时钟*/RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE);}/*** @brief Configures the different GPIO ports.* @param None* @retval None*/void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/*串口1 RX管脚配置*//* Configure USART1 Rx as input floating */GPIO_InitStructure.GPIO_Pin = USART1_RxPin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART1_GPIO, &GPIO_InitStructure);/*串口2 RX管脚配置*//* Configure USART2 Rx as input floating */GPIO_InitStructure.GPIO_Pin = USART2_RxPin;GPIO_Init(USART2_GPIO, &GPIO_InitStructure);/*串口1 TX管脚配置*//* Configure USART1 Tx as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = USART1_TxPin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(USART1_GPIO, &GPIO_InitStructure);/*串口2 TX管脚配置*//* Configure USART2 Tx as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = USART2_TxPin;GPIO_Init(USART2_GPIO, &GPIO_InitStructure);/* 配置神舟III号LED灯使用的GPIO管脚模式*/GPIO_InitStructure.GPIO_Pin = DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LED, &GPIO_InitStructure);/* 配置神舟III号RS485方向控制管脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOF, &GPIO_InitStructure);}/*** @brief Configures the nested vectored interrupt controller.* @param None* @retval None*/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;/* Configure the NVIC Preemption Priority Bits */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/* Enable the USART2 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}/*** @brief Compares two buffers.* @param pBuffer1, pBuffer2: buffers to be compared.* @param BufferLength: buffer's length* @retval PASSED: pBuffer1 identical to pBuffer2* FAILED: pBuffer1 differs from pBuffer2*/TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength){while(BufferLength--){if(*pBuffer1 != *pBuffer2){return FAILED;}pBuffer1++;pBuffer2++;}return PASSED;}/****************************************************************************** ** Function Name : GPIO_KEY_Config.* Description : Configures the Extension Button.* Input : None.* Output : None.* Return : None.******************************************************************************* /void GPIO_KEY_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure KEY1 Button */RCC_APB2PeriphClockCmd(RCC_KEY1, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_KEY1;GPIO_Init(GPIO_KEY1_PORT, &GPIO_InitStructure);/* Configure KEY2 Button */RCC_APB2PeriphClockCmd(RCC_KEY2, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_KEY2;GPIO_Init(GPIO_KEY2_PORT, &GPIO_InitStructure);/* Configure KEY3 Button */RCC_APB2PeriphClockCmd(RCC_KEY3, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_KEY3;GPIO_Init(GPIO_KEY3_PORT, &GPIO_InitStructure);/* Configure KEY4 Button */RCC_APB2PeriphClockCmd(RCC_KEY4, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_KEY4;GPIO_Init(GPIO_KEY4_PORT, &GPIO_InitStructure);}/****************************************************************************** ** Function Name : ReadKey* Description : Reads key from demoboard.* Input : None* Output : None* Return : Return RIGHT, LEFT, SEL, UP, DOWN or NOKEY******************************************************************************* /u8 ReadKeyDown(void){/* 1 key is pressed */if(!GPIO_ReadInputDataBit(GPIO_KEY1_PORT, GPIO_KEY1)){return KEY1;}/* 2 key is pressed */if(!GPIO_ReadInputDataBit(GPIO_KEY2_PORT, GPIO_KEY2)) {return KEY2;}/* 3 key is pressed */if(!GPIO_ReadInputDataBit(GPIO_KEY3_PORT, GPIO_KEY3)) {return KEY3;}/* 4 key is pressed */if(!GPIO_ReadInputDataBit(GPIO_KEY4_PORT, GPIO_KEY4)) {return KEY4;}/* No key is pressed */else{return NOKEY;}}void Led_Ctrl(uint16_t LEDNum, uint8_t LEDOnOff){if(LEDOnOff == 1){/* Turn On */GPIO_ResetBits(GPIO_LED, LEDNum);}else if(LEDOnOff == 0){/* Turn Off */GPIO_SetBits(GPIO_LED, LEDNum);}}static void Delay_ARMJISHU(__IO uint32_t nCount){for (; nCount != 0; nCount--);}void RS485_MODE_SET(void){/* 使能串口2 */USART_Cmd(USART2, ENABLE);if(ReadKeyDown() == KEY1){RS485_Mode = TX_MODE;printf("\n\rRS485 发送模式设置成功");TX_Mode();Led_Ctrl(DS2_PIN,ON);}else if(ReadKeyDown() == KEY2){RS485_Mode = RX_MODE;printf("\n\rRS485 接收模式设置成功");printf("\n\r等待接收数据");Led_Ctrl(DS3_PIN,ON);RX_Mode();}else if(ReadKeyDown() == KEY3){RS485_Mode = IDLE;printf("\n\r 退出发送接收,请重新设置工作模式");printf("\n\r USER1按键:设置RS485为接收模式");printf("\n\r USER2按键:设置RS485为发送模式");}}/*** @brief Retargets the C library printf function to the USART.* @param None* @retval None*/PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART */USART_SendData(EV AL_COM1, (uint8_t) ch); /*发送一个字符函数*//* Loop until the end of transmission */while (USART_GetFlagStatus(EV AL_COM1, USART_FLAG_TC) == RESET)/*等待发送完成*/{}return ch;}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/void assert_failed(uint8_t* file, uint32_t line){/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/*** @}*//*** @}*//******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/。

实验五 485实验

实验五 485实验

基于EIA-485总线的多机数据通信实验一、实验目的1.理解RS485串口通讯原理2.掌握RS485串口通讯硬件连接3.掌握基本的主从式通讯网络的搭建4.理解协议的概念5.掌握简单的协议的收发原理6.学会在ARM开发板上编写程序实现简单协议的收发二、实验设备硬件:RS485通信模块、EasyArm2200开发套件、实验连接跳线软件:ADS1.2集成开发环境三、实验原理1.RS485原理RS485采用平衡发送和差分接收,具有抑制共模干扰的能力,加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。

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

接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

RS485采用半双工工作方式,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输,数据最高传输速率为10Mbps。

任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。

RS485用于多点互连时非常方便,可以省掉许多信号线。

应用RS485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。

EasyArm2200开发套件上自带有RS232串口,所以需要使用扩展模块。

选用MAX485芯片,其引脚图如下:图1:MAX485接口引脚图其中各个引脚的功能如下:图2 EIA-485接口模块引脚说明其典型的组网连接图如下:图3 典型组网连接示意图其中电阻为120欧姆,并且将RE与DE相连,是为了更好的控制串口的收发,当ARM 的GPIO输出高电平时,处于发送状态,此时接收被禁止;反之亦然。

2.通讯协议所谓通信协议是指通信双方的一种约定。

约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。

42.485通信实验

42.485通信实验

42.485通信实验⼀。

485接⼝原理RS232和RS485都是连接到MCU的串⼝,串⼝的电平是TTL电平,它们的区别在于把串⼝的信号进⾏了转换,转换之后出来的RS232接⼝,RS485接⼝对于发送出去的数据⽐如1或0的电压和阻抗是有区别的。

正是因为有了这些区别使得它们的应⽤场景不同,这是由它们⾃⾝的特点来决定的。

虽然RS232有这些缺点,但是⽬前RS232接⼝应⽤的是最多的,因为 1. 这种接⼝产⽣的时间⽐较早,很多设备都是采⽤这种接⼝。

2. 虽然通信距离只有50⽶,但在实际应⽤中⼤部分场景也够⽤。

3. ⼤部分应⽤中是传输⼀些指令数据,对速度的要求不是很⾼。

RS485接⼝是对RS232的改进:⼀般在总线的起⽌端各加⼊⼀个120欧姆的匹配电阻。

⼆。

485电路芯⽚SP3485⼀般2,3脚连在⼀起,有MCU的⼀个引脚控制,当2,3脚为低电平时,使能RO端,当2,3脚为⾼电平时,使能DI端。

接收输出RO接MCU的RX,发送数据输⼊DI接MCU的TX三。

电路采⽤UART2接⼝,PA2为USART2_TX,PA3为USART2_RXPA2接SP3485的4脚DI端PA3接SP3485的1脚RO端PG9接SP3485的控制端这⾥V2跟V3版的电路有所区别:V3版多了R19和R22两个偏置电阻。

保证总线在空闲状态时,AB之间的电压差⼤于200mv。

STM32 的串⼝ 2 通过 P9 端⼝设置,连接到 SP3485,通过 STM32 的 PG9控制 SP3485 的收发,当 PG9=0 的时候,为接收模式;当 PG9=1 的时候,为发送模式。

电路中已经连接了⼀个120欧姆的匹配电阻。

四。

程序(⼀)头⽂件rs485.h#ifndef __RS485_H#define __RS485_H#include "sys.h"extern u8 RS485_RX_BUF[64]; //接收缓冲,最⼤64个字节extern u8 RS485_RX_CNT; //接收到的数据长度//模式控制#define RS485_TX_EN PGout(9) //485模式控制. 0,接收; 1,发送.//如果想串⼝中断接收,请不要注释以下宏定义#define EN_USART2_RX 1 //0,不接收;1,接收.void RS485_Init(u32 bound); //RS485的初始化函数,初始化串⼝2void RS485_Send_Data(u8 *buf,u8 len); //发送函数void RS485_Receive_Data(u8 *buf,u8 *len); //接收函数#endif(⼆)rs485.c⽂件串⼝2初始化//初始化IO 串⼝2//pclk1:PCLK1时钟频率(Mhz)//bound:波特率void RS485_Init(u32 bound){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);//使能GPIOA,G时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PG9端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复⽤推挽GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输⼊GPIO_Init(GPIOA, &GPIO_InitStructure);RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串⼝2RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停⽌复位#ifdef EN_USART2_RX //如果使能了接收USART_ART_BaudRate = bound;//⼀般设置为9600;USART_ART_WordLength = USART_WordLength_8b;//8位数据长度USART_ART_StopBits = USART_StopBits_1;//⼀个停⽌位USART_ART_Parity = USART_Parity_No;///奇偶校验位USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;//⽆硬件数据流控制USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式USART_Init(USART2, &USART_InitStructure); ; //初始化串⼝NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串⼝2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART2, ENABLE); //使能串⼝#endifRS485_TX_EN=0; //默认为接收模式}//接收缓存区u8 RS485_RX_BUF[64]; //设置接收缓冲,最⼤64个字节.//接收到的数据长度u8 RS485_RX_CNT=0;void USART2_IRQHandler(void){u8 res;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据{res =USART_ReceiveData(USART2); //读取接收到的数据if(RS485_RX_CNT<64) //如果接收到的数据⼩于64字节,存⼊缓冲区并记录数据个数。

RS485通讯实验

RS485通讯实验

RS485通讯实验与CAN 类似,RS-485 是一种工业控制环境中常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。

RS-485 通讯协议由RS-232 协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。

RS-485 协议主要是把RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性。

对比CAN 通讯网络,可发现它们的网络结构组成是类似的,每个节点都是由一个通讯控制器和一个收发器组成,在RS-485 通讯网络中,节点中的串口控制器使用RX 与TX 信号线连接到收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用TTL 信号传输,收发器与总线则使用差分信号来传输。

发送数据时,串口控制器的TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成TTL 信号通过RX引脚传输到串口控制器中。

RS-485 通讯网络的最大传输距离可达1200 米,总线上可挂载128 个通讯节点,而由于RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当AB 两线间的电压差为-6V~-2V 时表示逻辑1,当电压差为+2V~+6V 表示逻辑0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。

RS-485 与RS-232 的差异只体现在物理层上,它们的协议层是相同的,也是使用串口数据包的形式传输数据。

由于RS-485 与RS-232 的协议层没有区别,进行通讯时,我们同样是使用STM32 的USART 外设作为通讯节点中的串口控制器,再外接一个RS-485 收发器芯片把USART 外设的TTL 电平信号转化成RS-485 的差分信号即可。

RS-485—双机通讯实验本小节演示如何使用STM32 的USART 控制器与MAX485 收发器,在两个设备之间使用RS-485协议进行通讯,本实验中使用了两个实验板,无法像CAN 实验那样使用回环测试(把STM32USART 外设的TXD 引脚使用杜邦线连接到RXD 引脚可进行自收发测试,不过这样的通讯不经过RS-485 收发器,跟普通TTL 串口实验没有区别),本教程主要以“USART—485 通讯”工程进行讲解。

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 的RS485 适配器开发

基于STM32 的RS485 适配器开发

Science and Technology &Innovation ┃科技与创新2019年第21期·53·文章编号:2095-6835(2019)21-0053-03基于STM32的RS485适配器开发周灵江,金杰,丁小洪,朱阳,章家会,金辰,朱鸿博(国网浙江临海市供电有限公司,浙江临海317000)摘要:STM32是一款基于ARM Cortex-M3内核的高性能、低成本、低功耗微控制器。

使用意法半导体推出图形化配置工具STM32CubeMX ,开发者快速完成工程的建立、初始化。

再利用MATLAB/Simulink 针对STM32微型控制器的STM32MAT 模型库,实现软件逻辑生成可读、可移植的C 代码MDK 工程文件,编译、下载后直接在单片机上运行。

为提高用电信息采集系统RS485通信可靠性,解决实际遇到的问题,开发RS485适配器。

基于STM32芯片及配套软件工具,使RS485适配器的设计与实现更为方便快捷,极大提高了设计开发效率,提高了适配器的可维护性及可靠性。

关键词:MATLAB ;STM32;RS485适配器;硬件系统中图分类号:TP273.5文献标识码:A DOI :10.15913/ki.kjycx.2019.21.0191引言STM32系列微控制器是一款基于ARM Cortex-M3内核的嵌入式应用产品[1]。

由于其高性能、低成本、低功耗的特性使其应用领域不断扩大,对于高效开发和利用更为重要。

STM32CubeMX 软件是意法半导体(ST )公司推出的STM32系列单片机的图形化配置工具,开发者可利用其提供的可视化引脚、外设、时钟等配置功能,快速完成工程的建立、初始化[2-3]。

基于MATLAB 和STM32CubeMX 联合开发的STM32-MAT 工具箱,它提供的MCU CONFIG 模块可以配置STM32CubeMX 软件所支持的STM32芯片,同时它还包含几乎所有STM32芯片上的资源。

基于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)传输距离远,⽀持节点多。

(完整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。

【最新文档】stm32实验指导书-实用word文档 (15页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==stm32实验指导书篇一:STM32开发平台实验指导书STM32综合开发平台实验指导书中国海洋大学自动化及测控系201X年5月序言STM32家族是意法半导体公司的基于Cortex-M3内核性价比非常高的微处理器,应用领域非常广泛。

为了初学者比较容易的学习该系列的芯片,我们设计了STM32系列的开发平台,并且编写了配套的实验指导书。

为了本平台尽可能兼容更多的芯片,本设计采用了核心板+基板的方案。

基板上有一个的MCU标准插槽,该标准插槽有一个详细定义的物理接口和引脚定义。

核心板设计了符合标准插槽定义的插针,可以查结在基板上使用。

基板可以由USB或者7V-40V直流电源两种方式供电,包含通用电路,如以太网,USB,时钟芯片,OLED,IRDA,RS232,RS485,CAN总线,音频,SD卡等20多种常用的模块电路;MCU保准插槽并且有一个扩展插槽,可以外扩设备。

核心板是单片机最小系统,包括晶振,看门狗电路等等,标准插针等。

我们的核心板采用了兼容STM32F105,STM32F107,STM32F205,STM32F207四种芯片的设计。

本设计方案在将来芯片升级的时候,可以只升级核心板,而基板还可以继续使用,有很强的灵活性,并可以节约成本。

同时,本平台还包含详细的开发范例,包括单元测试,系统自检,操作系统范例以及基于Labview的上位机软件。

在焊接篇,详细的介绍的核心板和实验班的焊接流程,注意事项和检测方法。

可以用于实习项目,也可以使实验者自己DIY使用。

在硬件篇,指导书还会详细介绍各个单元模块的电路设计和布线原则。

供实验者在自己做项目的时候参考和借鉴。

另外,硬件篇还会介绍单元模块常见的故障和排除方法,使实验者能够在硬件电路出现故障的时候,迅速查找原因和修复。

【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解决了这个问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档