您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 4.8-STM32-RS485串口通讯及程序设计
(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第1页共14页官方网站:开发板库函数教程--实战篇官方网站:官方店铺:官方论坛:刘洋课堂:(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第2页共14页官方网站:接口具有良好的抗噪声干扰性、长的传输距离和多站能力等。上述优点就使其成为首选的串行接口。因为工业RS485通讯接口组成的半双工网络,一般只需二根连线,所以工业RS485通讯接口均采用屏蔽双绞线传输。4.8.1.2EIA-485标准简介为扩展应用范围,EIA于1983年在EIA-422基础上制定了EIA-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上。同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于EIA-485是从EIA-422基础上发展而来的,所以EIA-485许多电气规定与EIA-422相仿,如都采用平衡传输方式、都需要在传输线上接终接电阻、最大传输距离约为1219米、最大传输速率为10Mbps等。但是,EIA-485可以采用二线与四线方式,采用二线制时可实现真正的多点双向通信,而采用四线连接时,与EIA-422一样只能实现点对多点通信,但它比EIA-422有改进,无论四线还是二线连接方式总线上可接多达32个设备。EIA-232、EIA-422与EIA-485标准的优点4.8.2RS485通讯实验目的(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第3页共14页官方网站:通过下传编写好的串口通讯程序,验证串口通讯的正确性,掌握串口通讯软件的设计方法。4.8.3硬件设计在这里使用的串口通讯芯片是常规芯片MXA485,RS485串口通讯电路是一个很成熟的电路,电路大家都熟悉了(参考原理图纸)。从图中可以看出芯片1#管脚是数据接收端,4#管脚是数据发送端;2#、3#管脚是发送/接收状态转换控制端。图一RS485通讯电路4.8.4软件设计RS485通讯程序中我们用到中断、端口复用功能等函数。我们采用PA端口进行串口通讯;PA2端口接TX,PA3端口接RX,状态转换控制线连接PE5端口。在这里我们也是全部使用库函数编写程序。4.8.4.1STM32库函数文件(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第4页共14页官方网站:中断控制字(优先级设置)库函数stm32f10x_exti.c//外部中断库处理函数stm32f10x_usart.c//串口通讯函数都是串口通讯,引用的库函数和RS232都是一样的。其中stm32f10x_gpio.h头文件包含了GPIO端口的定义。stm32f10x_rcc.h头文件包含了系统时钟配置函数以及相关的外设时钟使能函数,所以我们要把这两个头文件对应的stm32f10x_gpio.c和stm32f10x_rcc.c加到工程中;Misc.c库函数主要包含了中断优先级的设置,stm32f10x_exti.c库函数主要包含了外部中断设置参数,tm32f10x_usart.c库函数主要包含串行通讯设置,这些函数也要添加到函数库中。4.8.4.2自定义头文件pbdata.hpbdata.c同时我们自己也创建了两个公共的文件,这两个文件主要存放我们自定义的公共函数和全局变量,以方便以后每个功能模块之间传递参数。4.8.4.3pbdata.h文件里的内容是#ifndef_pbdata_H#define_pbdata_H#includestm32f10x.h#includemisc.h#includestm32f10x_exti.h#includestm32f10x_tim.h#includestm32f10x_usart.hvoidRCC_HSE_Configuration(void);//定义函数voiddelay(u32nCount);voiddelay_us(u32nus);voiddelay_ms(u16nms);#endif(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第5页共14页官方网站:语句#ifndef、#endif是为了防止pbdata.h文件被多个文件调用时出现错误提示。如果不加这两条语句,当两个文件同时调用pbdata文件时,会提示重复调用错误。4.8.4.4pbdata.c文件里的内容是#includepbdata.h//很重要,引用这个头文件voidRCC_HSE_Configuration(void)//HSE作为PLL时钟,PLL作为SYSCLK{RCC_DeInit();/*将外设RCC寄存器重设为缺省值*/RCC_HSEConfig(RCC_HSE_ON);/*设置外部高速晶振(HSE)HSE晶振打开(ON)*/if(RCC_WaitForHSEStartUp()==SUCCESS){/*等待HSE起振,SUCCESS:HSE晶振稳定且就绪*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK)RCC_SYSCLK_Div1——AHB时钟=系统时*/RCC_PCLK2Config(RCC_HCLK_Div1);/*设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟=HCLK/2*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*设置PLL时钟源及倍频系数*/RCC_PLLCmd(ENABLE);/*使能PLL*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*设置系统时钟(SYSCLK)*/while(RCC_GetSYSCLKSource()!=0x08);/*0x08:PLL作为系统时钟*/}}/************************************************************************名称:delay_us(u32nus)*功能:微秒延时函数*入口参数:u32nus*出口参数:无*说明:*调用方法:无***********************************************************************/voiddelay_us(u32nus)(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第6页共14页官方网站:{u32temp;SysTick-LOAD=9*nus;SysTick-VAL=0X00;//清空计数器SysTick-CTRL=0X01;//使能,减到零是无动作,采用外部时钟源do{temp=SysTick-CTRL;//读取当前倒计数值}while((temp&0x01)&&(!(temp&(116))));//等待时间到达SysTick-CTRL=0x00;//关闭计数器SysTick-VAL=0X00;//清空计数器}/************************************************************************名称:delay_ms(u16nms)*功能:毫秒延时函数*入口参数:u16nms*出口参数:无*说明:*调用方法:无***********************************************************************/voiddelay_ms(u16nms){u32temp;SysTick-LOAD=9000*nms;SysTick-VAL=0X00;//清空计数器SysTick-CTRL=0X01;//使能,减到零是无动作,采用外部时钟源do{temp=SysTick-CTRL;//读取当前倒计数值}while((temp&0x01)&&(!(temp&(116))));//等待时间到达SysTick-CTRL=0x00;//关闭计数器SysTick-VAL=0X00;//清空计数器}4.8.5STM32系统时钟配置SystemInit()每个工程都必须在开始时配置并启动STM32系统时钟。4.8.6GPIO引脚时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);(众想)哈尔滨卓恩科技开发有限公司STM32开发板用户使用手册版本号:V2.2第7页共14页官方网站:(RCC_APB1Periph_USART2,ENABLE);//设置串口2时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用IO时钟使能无论编写任何程序都要打开相关的时钟设置,在这个实验中用到使能AHB外设时钟有3各部分,分别是使能端口时钟、使能串口2时钟、使能端口复用时钟。所有的外设时钟全部挂接在AHB后的两个预分频器上,初学者一般都感觉在设置外设时钟时不知道怎样填写使能或使能外设时钟函数中的“参数1”,下表我列出了一些“参数1”的固定书写格式,方便大家查询。同理当大家熟练使用C语言后,通过别的途径也可以查询到下表中“参数1”的固定书写格式。这些都存在于stm32f10x_rcc.c库函数中。表1预分频器APB1、APB2控制的功能模块(部分)序号函数参数1长度1RCC_APB1Periph_TIM2((uint32_t)0x00000001)2RCC_APB1Periph_TIM3((uint32_t)0x00000002)3RCC_APB1Periph_TIM4((uint32_t)0x00000004)4RCC_APB1Periph_TIM5((uint32_t)0x00000008)5RCC_APB1Periph_TIM6((uint32_t)0x00000010)6RCC_APB1Periph_TIM7((uint32_t)0x00000020)7RCC_APB1Periph_TIM12((uint32_t)0x00000040)8RCC_APB1Periph_TIM13((uint32_t)0x00000080)9RCC_APB1Periph_TIM14((uint32_t)0x00000100)10RCC_APB1Periph_WWDG((uint32_t)0x00000800)11RCC_APB1Periph_SPI2((uint32_t)0x00004000)12RCC_APB1Periph_SPI3((uint32_t)0x0
本文标题:4.8-STM32-RS485串口通讯及程序设计
链接地址:https://www.777doc.com/doc-5315719 .html