基于STM32的无线通信模块设计

发布者:创意驿站最新更新时间:2016-09-02 来源: eefocus关键字:STM32  无线通信 手机看文章 扫描二维码
随时随地手机看文章
随着网络和现代通信技术的不断发展,远程无线通信技术经过多年的研究与实际应用,现如今在工业控制领域有了非常重要的地位,并且发挥着越来越大的作用。文中根据厂家的要求,设计的无线通信模块,主要实现了短信与数据收发功能,并且做到了模块的稳定,掉线之后能够自动重连。


1 无线通信模块整体设计方案
模块主要有电源部分、主控部分、通信部分、数据传输部分4个部分组成。通信模块采用SIM900A进行无线通信。主控模块采用STM32作为主控芯片,来控制短信的收发与数据传输的顺利进行。远程终端可以是手机或者上位机的数据中心软件,经过处理之后,储存下来,方便日后的查询。本模块具有低功耗,方便灵活,操作简单并且稳定,掉线之后可以自动连接,运行过程十分稳定,并且成本较低。


2 无线通信模块硬件设计
2.1 功能需求
本文设计的无线通信模块,要求单12V电源输入,模块上电运行后有相应的指示灯来指示模块的运行状态。另外要求模块能够实现短信以及数据透传两大主要功能,在手机发送短信给模块之后,模块能够动作,并给出回应。最后要求在建立TCP链接时,仍然能够收发短信。


1

图1 无线通信模块结构图


2.2 电源部分
在主电路中,主控芯片STM32的工作电压为2.0~3.6 V,通信芯片SIM900A的工作电压为3.1~4.6 V,为使模块各个部分正常工作,必须对两者进行分别供电,电源供电电路如下:
图中V12外接12 V电源,经过电容滤波后输入到LM2576,实现12 V到4 V的转换,R1、R2在线路中起到分压作用,D2灯亮起时,表示模块已经正常供电。LM2576是美国国家半导体公司生产的3 A电流输出降压开关型集成稳压电路,具有完善的保护电路,比较稳定。


2

图2 电源模块


       
2.3 主控芯片
主控模块采用STM32单片机作为微控制器,该芯片能工作于-40~105℃的温度范围,MAX3232芯片用于串行口的电平变换,实现控制器与通信接口之间的通信。串口1与电源电平转换芯片Max3223相连,USART1_TX(输出,所以在配置GPIO时,定义该口的模式为推拉输出,USART1_ RX为输入,定义为悬浮输入模式。串口2与SN65LBC184D通信,实现数据的收发,USART2_RTS、USART2_RX为输入端口,模式定义为悬浮输入模式,USART2_CTS、USART2_TX为输出端口,模式定义为推拉输出。串口3用来控制SIM900A芯片,USART3_RTS、USART3_RX为输入端口,模式定义为悬浮输入,USART3_CTS、USART3_TX为输出端口,模式定义为推拉输出。

3


图3 主控芯片STM32


2.4 通信芯片
通信芯片采用SIMCom公司的新型紧凑型产品SIM900A,它属于双频GSM/GPRS模块,完全采用SMT封装形式,性能稳定,外观精巧,性价比高,并且能够满足用户的多种需求。在实现断线自动重连功能时,涉及到DCD、RI两个引脚的使用。DCD引脚用来实现模数转换,当模块掉线时,会给DCD引脚一个高电平,当这个电平被DCD引脚检测到之后,模块就是采取相应的动作,来重新连接上线。RI引脚在模块上线之后,就一直保持高电平,在有电话和短信进来的时候,RI管脚就会有一个低电平出现,当RI引脚检测到这个低电平的时候,模块就会采取相应动作,进入到短信或者电话模式。

4


图4 SIM900A通信芯片

      
3 无线通信模块软件设计
3.1 STM32的底层配置
为了实现STM32单片机与SIM900A模块之间的数据通信,实现短信收发与数据传输两大功能。首先要搭建开发平台,在工程中加入需要用到的库函数以及配置文件,然后配置系统时钟、中断控制器、输入输出的GPIO以及相应的串口。在配置这些参数的时候,首先需要对照原理图进行编写,然后查看芯片用到哪些端口和这些端口的作用,这样才能保证无误。接下来就要对各个部分进行配置,以保证模块能够正常运行。
3.1.1 串口配置
开发环境搭建好之后,就可以配置端口参数了。对于本模块,设置USART传输的比特率为9 600 b/s,字长为8 bit,1bit停止位,无检验模式。在对串口1、2、3初始化之后,打开串口的中断响应函数:USART_ITConfig(USART1,USART_IT_RXNE,ENABLE)(以串口1为例),使能相应的串口:USART_Cmd(USART1,ENABLE),这样串口的配置就基本完成了。
3.1.2 中断控制器的配置
首先配置优先级分组,设置先占优先级1位,从优先级3位。本模块定义了5个全局中断,分别为:两个RTC全局中断、USART1全局中断、USART2全局中断、USART3全局中断,分别对每一个中断配置优先级,使能串口再初始化即可。需要注意的是,PC15管脚作为EXTI15的外部中断输入管脚,当该管脚的电平为低电平的时候触发,模块进入短信模式,因此给这个中断一个比较高的优先级,所以定义该中断先占优先级1位,从优先级0位。在设置优先级的时候,必须根据模块的运行情况,选择最优的中断分组和优先级,才能保证程序运行时,能够快速的响应中断。
3.2 无线通信模块短信功能的实现
1)短信收发具体过程
短信功能的实现主要涉及到两个关键部分,一个是AT命令,另一个是串口的读写。AT命令是主控芯片STM32和SIM900A之间的通信协议,完成对SIM900A的控制。短信的收发主要有两种模式,一种是文本模式,该模式只支持英文内容,另一种是PDU模式。本模块在完成初始化之后,首先通过USART向SIM900A发送“AT+回车”命令来检查AT命令是否正常工作,如果返回OK,则表示能够进行接下来的短信功能。
SIM900A的短信功能主要分为两个部分,第一:读取短消息。读取短消息的设置命令为:AT+CMGR,该命令生效后有两个返回值:index和mode,index就是接收到的短信的编号,我们将接收到的index内容放在一个长度为30的buf中,再将buf写入到串口3中,然后再读取串口3中的内容,这样,短信的编号就获取完毕。获取了短信的编号之后,就能去获取短信的具体内容,而短信的内容则存放在alpha中,它处于响应的第三个位置,通过get_fw(at_string,phnum,19,2)可将短信的内容取出来,这样短信的内容就获取到了。第二:发送短消息。发送短消息的设置命令为:AT+CMGS,首先将发送短信的电话号码存入到一个buf中,将这个buf写入到串口3中,以此获取手机号码。而短信在发送的时候,短信内容之前会带一个“>”号,在程序设计时,只要检测到“>”号时,后面的内容也就是短信发送的内容,最后将短信的内容写到串口3即可。
2)相应的AT命令

5

3.3 短信命令的定义
本模块自定义了许多短消息命令来设置或者查询模块的参数,具体为:SIP:IP地址设置命令、SPT:端口号设置命令、DID:ID号设置命令、ACON:自动连接命令、PRT:打印命令、LIVE:心跳操作命令、CSQ:信号强度查询命令。这些指令通过短信的方式来实现对模块的操作。
拿SIP来举例,它的实现过程为:首先把短信中的‘=’之前的字符取出来存放在sms_cmd中,然后将sms_cmd与SIP、SIT、DID、ACON、PRT、LIVE、CSQ来比较,如果等于其中一个,则程序跳转到相应的部分来执行相应的操作。这里,strcmp(sms_cmd,“SIP”)==0,程序跳转到SIP部分来执行IP部分的操作。然后,将‘=’之后的字符取出来存放在sms_para中。通过字符串比较函数来判断它是‘?’还是数字。如果是‘?’,则表示该短信命令是一个查询命令,就只需要用输出显示IP号给用户看。如果是数字,则表示该短信命令是一个设置命令,就需要重新设置某些参数值,来改变模块的运行过程。对于SIP,如果‘=’之后是数字,就表示该短信是用户用来设置模块的IP地址的。此时,就要把当前的IP值赋给模块的IP值就可以了。最后输出显示IP地址设置成功,则SPT部分的操作就完成了。

       
4 无线通信模块数据传输的实现
4.1 数据格式的定义
数据包的具体格式如下:

数据包头已经定义为S_PACKET_HEADER结构类型,link_id为DWORD类型,对于发送,填写目标link_id,对于接收到的数据包,则为源link_id(由服务器自动转换填写),结束标志为0x01,数据Data则根据具体的命令而各不相同。

6

4.2 登陆、退出的协议过程
后台软件根据指定的服务器地址和端口号发起TCP连接请求,连接成功后开始命令交互。工作过程描述如下:
1)后台软件首先采用CMD_LOGIN命令,登陆到通信服务器,在登陆成功之前,发送其他任何命令服务器都不处理。发送CMD_LOGIN:FORWARD给服务器,携带数据为S_TERMINAL。该命令的目标link_id设为0,表示发送给服务器,而不是给其他终端。
2)服务器在CMD_LOGIN:RESPONSE_OK中将其他在线模块的信息发送过来,从而在客户端应用程序形成在线模块列表。后台若收到CMD_LO GIN:;RESPONSE_FAILED回应,则失败。收到CMD_LOGIN:RESPONSE_OK回应,则成功,携带数据为S_TERMINAL。
3)后台软件定时发送CMD_KEEP_LIVE命令,以维持链路不被网络和服务器终止。每个在线设备必须在一定的时间间隔内向服务器发送CMD_ KEEP_LIVE信息。服务器将对此作检查,若某设备在一定的时间间隔内没有发送CMD_KEEP_LIVE信息,则认为该设备已经“死亡”,服务器将
断开其连接。
4)后台软件可对模块列表中的任意模块进行操控。
5)后台软件退出时,用户设备应首先发送CMD_LOGOFF命令到服务器,告诉服务器“我要退出”,该命令的目标link_id设为0。在发送CMD _LOGOFF:FORWARD给服务器时,不需要携带数据。

7


图5 登陆,推出的协议过程


4.3 数据传输具体过程
首先要定义建立TCP连接与关闭TCP连接的函数,涉及到的AT指令为AT+CIPSTART和AT+CIPCLOSE。建立TCP连接时,先把AT+CIPSTART指令写到串口3中,然后该指令生效后,会返回一个“CONNECT”,之后只要检测到有返回值“CONNECT”,就表示TCP连接已经建立成功。关闭TCP
连接与建立TCP连接类似,AT+CIPCLOSE指令生效后会返回一个“CLOSE OK”,只要检测到“CLOSE OK”,就表示TCP连接已经关闭。
TCP连接建立好以后,透传模式就已经被开启,此时就可以实现数据的发送与读取。
当用户要发送数据时,就必须根据数据包的结构来发送数据,首先把包头写入到串口3中,如果有数据,则把数据内容和接收对象一并写入到串口3中,这样数据的发送就完成了。
读取数据时,只要有数据过来,就一次一个字节,把数据存放到user_string中,然后i++,再次接收数据。
至于数据读取到什么时候结束,本程序定义了3种结束的情况:1)如果用户定义了数据的长度,就读取到最后一个字节才结束。2)如果用户没有定义数据的长度,就在读取到回车符的时候结束。3)如果遇到既没有已定义的数据包长度,又没有读取到回车符的情况时,就在数据存放的长度超过user_string总长度的四分之三的时候结束,或者在超过100毫秒没有数据发过来的时候结束数据的读取。
4.4 相应的AT命令

 

8


       
5 断线重连的处理
5.1 TCP链接的关闭和建立
TCP链接的建立涉及到的AT命令是at+cipstart,该指令有两个返回值,分别是模块的IP地址和端口号。首先将at+cipstart指令返回的当前模块的IP地址和端口号存放到一个buf中,然后将这个buf写入到串口3中,如果之后能够读取到返回值“CONNECT”,就表示TCP链接已经建立好。
TCP链接的关闭涉及到的AT命令是at+cipclose,该指令没有返回值,可以直接将该指令写到串口3中,如果检测到“CLOSE OK”,就表示TCP链接已经被关闭。
5.2 DCD的检测
当TCP建立起来之后,DCD引脚的电压值便由高电平变为低电平,因此DCD引脚的电平状态可以用过来指示TCP的连接情况。在程序中,本文设置时钟在检测DCD引脚的状态值,当该引脚的电平值由高电平变为低电平时,就表示模块模块已经掉线,然后模块就重新开始登陆,直到登陆上为止。
5.3 TCP链接下的短信收发
本文定义了一个全局中断,当有短信或者电话到达模块时,RI引脚的电平便会由高电平变为低电平,此时便会触发全局中断,模块立即转而处理短信收发或者数据传输。


6 测试效果
本模块在设计完成之后,在实验室稳定运行了2周时间,没有出现什么问题。然后又进行了特殊情况的测试,在模块断电后恢复供电,数据中心断电后重新上电的情况下,都能够重新连接上线,并且能够继续稳定运行。随后模块又被送到厂方使用,在被使用了3周之后,厂方反应模块运行情况良好,没有掉线的情况。


7 结论
本文设计的无线通信模块,是利用STM32来控制SIM900A芯片,来实现短消息的收发与数据的无线传输。本设计完成了无线通信的硬件部分和软件部分的设计与实现。在多次运行试验时,本模块没有出现掉线以及发热等问题,非常稳定。本次设计成本较低,运行稳定可靠,应用范围十分广泛,利用SIM900A,降低了模块的成本,使其更加具有商业价值。

关键字:STM32  无线通信 引用地址:基于STM32的无线通信模块设计

上一篇:必看!STM32超低功耗系列之STM32L0
下一篇:基于STM32F4的四轴航拍飞行器

推荐阅读最新更新时间:2024-03-16 15:07

STM32又添一虎将,一芯双核,性能飙升
自2007年意法半导体(ST)在北京发布首款STM32产品以来已有10年之久,在这 风雨十年里,STM32出货量高达30亿颗,成为中国第一大微控制器品牌。不止于此,随着IoT的应用趋势逐渐明显,对其中的MCU需求也日益增加。为此,在ST的战略中,最终目标是要打造一个宏伟的战略生态系统,成为产业领导者。 ST不断扩充着STM32系列,2019年7月,ST在北京召开新品发布会,推出了首款双核MCU——STM32H7。来自ST微控制事业部高级市场经理Renaud Bouzereau详细介绍了它的性能优势。 STM32H7采用Arm Cortex-M系列中性能最高的480MHz Cortex-M7内核,并增加一颗240
[嵌入式]
<font color='red'>STM32</font>又添一虎将,一芯双核,性能飙升
STM32定时器产生PWM--呼吸灯
说明:本工程代码在STM32F407ZET6上测试通过。 1、PWM定义 Pulse Width Modulation:脉冲宽度调制(PWM) 2、用途 (1)控制输出的电压和电流 (2)灯光的亮度 (3)电机控制 3、分析PWM产生与重点 (1)分析PWM产生(看图示PWM) (2)区别PWM1与PWM2模式(STM32F4xx中文参考手册 433页) (2)高低电平极性区别(STM32F4xx中文参考手册 457页) 4、PWM库函数开发流程 (1)使能定时器14和相关IO口时钟: 使能定时器14时钟:RCC_APB1PeriphClockCmd(); 使能GPIOF时钟:RCC
[单片机]
STM32单片机最小系统的电路设计
背景 学嵌入式,我们一般从单片机学起。学单片机,不能只学软件,硬件知识也要跟上。软硬件相结合的设计,才是真正优秀的设计。 谈及单片机的硬件设计,我们会先将其浓缩为最小系统,即能实现最基础的功能的最简化设计。以 STM32(F1 系列)单片机为例,最小系统无非是这几部分:电源、复位、时钟、启动模式、下载调试。 电源 STM32 的电源有以下几种类型: 主电源(VDD / VSS) 主电源指的是标记为 VDD1、VDD2... 的引脚。 每个引脚必须加一个 100nF 的滤波电容,且尽量靠近引脚放置,此外需要一个 10uF 的钽电容公用。 后备电源(VBAT) VBAT 引脚可用于电池供电。如果不用,可以与 VDD 连接
[单片机]
<font color='red'>STM32</font>单片机最小系统的电路设计
详解STM32的位带操作
正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能儿”来说,你不把它说的白一点,就是感觉理解的不够透彻,于是今天又一次,查阅了各种手册,也算是基本弄懂了,鉴于博主的个人特点,所以本人的介绍也会十分浅显易懂,希望能帮到各位! 首先,抛砖引玉,来两个问题: 1)为什么STM32里面会有位带操作? 2)STM32里面的位带操作是什么意思? 我也不想去弄什么官方定义了,来两个例子,相信各位心里即使不能给出一个确切的定义,也不会再去纠结这个问题, 答: 1)51单片机相信各位都用过,假设P
[单片机]
详解<font color='red'>STM32</font>的位带操作
STM8|STM32 看门狗使用
STM8和STM32都配备了独立看门狗,其作用之大不言而喻。以下为STM8及STM32的独立看门狗使用例: 对于STM32单片机: #define SYS_IWDG_OPEN IWDG- KR=0xCCCC; #define SYS_IWDG_FEED IWDG- KR=0xAAAA; void SystemIWDG_Config(uint32 OverTime) { RCC- CSR|=RCC_CSR_LSION; while((RCC- CSR&RCC_CSR_LSIRDY)==0); IWDG- KR=0x5555; //使能模块访问 while(IWDG- SR&IWDG_S
[单片机]
STM32 中断向量表的位置 、重定向
篇文章已经说了STM32的启动过程: http://blog.csdn .NET /lanmanck/article/details/8252560 我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢? 从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如: AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000) EXPORT __Vectors IMPORT OS_CPU_Sy
[单片机]
<font color='red'>STM32</font> 中断向量表的位置 、重定向
STM32的IIC应用详解2
IIC简单介绍 小编能力有限,写的不对处还望诸位大侠指正哈! 平时所说的IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,正真的IIC实际上是一块硬件电路,那是飞利浦公司的专利,要想用那就拿钱来买。有大牛既想用又不想花钱,就用两个端口模拟出了IIC通信协议,因为方便(51上的IIC改一下端口配置就可以在STM32F103上使用)所以被广泛使用。啰嗦了这么多,下面进入正题,嘿嘿。 首先IIC通信由两根线组成: 时钟线SCL:在通信过程起到控制作用。 数据线SDA:用来一位一位的传送数据。 其次IIC通信过程由开始、结束、发送、接收四个函数构成,接下来小编通过
[单片机]
STM32串口实验
STM32串口简介 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 STM32的串口资源相当丰富的,功能也相当强劲。ALIENTEK战舰STM32开发板所使用的STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范、具有DMA等。 5.3节对串口有过简单的介绍,大家看这个实验的时候记得翻过去看看。接下来我们将主要从库函数操作层面结合寄存器的描述,告诉你如何设置串口,以达到我们最基本的通信功能。本章,我们将
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved