基于STM8S207C6T6以及ESP-12F实现WIFI控制继电器开关

一、项目背景

客户需要一个能联网控制开关的硬件产品。鉴于开发周期短,购买了市面上的智能插座,使用现成的硬件进行逆向开发。

硬件组成:STM8S207C6T6主控芯片+ESP-12F WIFI模块+若干继电器+若干插座
需要实现的功能:上位机软件和WIFI模块通讯,主控芯片根据命令对继电器写高/低电平,从而控制插座的开关。

这是笔者的第一个实际的项目,项目本身并不复杂,但是笔者之前只用过51系列的单片机,没接触过STM8系列的芯片,在开发过程中确实踩了很多坑,故记录分享。

二、硬件逆向

拿到一个现成的单板,知道其要实现的功能后,就可以根据板上走线和万用表蜂鸣档测量引脚的对应关系了。

通信部分:STM8S芯片使用UART3与ESP-12F进行串口通信。

驱动部分:STM8S芯片的IO口与ULN2003的IN口相连,ULN2003对应的OUT口与继电器的控制口相连。

烧录部分:板上预留了一个SWIM口,这也是STM8系列芯片最常用的烧录方法。

三、开发工具

硬件:ST-Link

开发环境:IAR for STM8(不能用IAR for ARM)或 STVP

软件具体的下载网上有详细的教程。

四、烧录测试

1、开发环境

STM8系列可以使用库函数开发,不用对着芯片手册配置寄存器了。官方库函数可以在网上下载,IAR配置环境也有很多教程,注意要把库函数文件包含到项目文件夹中。这里展示一些关键配置。

上图,APP是自己的工程文件,下面是官方库。库中的文件并不是全都要的,根据自己使用的STM8系列具体的型号进行删减,否则build时会出错。

上图,在项目配置里(注意是项目的配置)需要添加上述路径,选择芯片型号。

上图,在调试器中选择ST-LINK。

2、烧录测试

编写完测试程序后进行烧录测试,以确认是否能正常下载。笔者在这里遇到了最大的困难。

电路板上保留的SWIM口正好对应ST-Link的SWIM口的4根下载线:VCC、数据线、GND、复位线。

连接后尝试下载,却发现IAR报错,多次重试错误还不一样:无法识别芯片/通信超时/对flash读取失败。

 查阅资料后,依次对可能的问题进行排查:
①芯片被锁了,必须使用STVP把ROP读出保护关闭,但是并没有解决问题。

②芯片的SWIM口被源程序或者电路复用拉高,导致无法下载。拆下后换了个新的芯片,依旧无法通讯。

笔者此时已黔驴技穷,最后是硬件工程师来测试了下载电路,发现只连接SWIM给电路板供电会导致电压不足,SWIM口的VCC达不到3.3V的工作电压。在后续开发过程中使用开发板也出现了类似的问题,必须要用USB转串口和SWIM同时给开发板供电才能正常烧录。

在提供了外部供电后可以正常进行烧录了。

五、开发方案

为了验证通信过程,方便调试,购买了开发板和ESP-12F模块进行开发,验证无误后只需要修改对应的IO口就可以烧录到产品里。

1、ESP-12F通信测试

ESP-12F规格书:esp-12f_product_specification_zh.pdf (ai-thinker.com)

购买到的模块需要自己搭建好外围电路才能正常工作,官方应用电路:

对模块的操作是通过AT指令进行的,官方文档:AT 命令集 — ESP-AT 用户指南 文档 (readthedocs-hosted.com)

可以使用USB转串口直接在电脑上用串口助手写AT指令给模块,进行测试。
或者可以使用STM8S207开发板作为中转:

串口助手发送AT指令:电脑串口助手 -> USART3接收 -> USART1发送 -> ESP-12F
ESP-12F返回消息:ESP-12F -> USART1接收 -> USART3发送 -> 电脑串口助手

2、ESP-12F工作模式选择

ESP-12F可以工作在3种模式,通过AT指令设置:

AP(Access Point):模块作为无线接入点,产生一个网络,其他的设备可以连接至该网络。

STA(Station):模块作为站点,可以接入指定的网络,如用户自己的WIFI。

AP+STA:模块既可以产生一个网络,又可以加入指定的网络。

在模块建立网络或接入网络后,如果要和网络内的设备进行通信,需要建立TCP或UDP传输协议,同样使用AT指令设置。笔者对通信协议没有深入研究,这里采用TCP协议。从应用层面来说,通信是服务端与客户端的通信,客户端需要知道服务端的IP地址和port端口号。

如果模块工作在AP模式,需要用AT指令设置IP和端口号,ESP-12F在AP模式有默认的IP地址:192.168.4.1。

如果模块工作在STA模式,在连接至指定WIFI后会被分配一个IP地址,可以使用AT指令查询被分配的IP,端口号可以自己设置。

TCP的调试过程可以在手机上下载一个网络调试精灵的APP,就可以用手机建立服务端或者客户端了。(但是这种免费APP有很多广告)

根据需求选择对应的模式,这里记录笔者的方案选择与改进过程。

3、方案选择与改进

首先需要明确:对用户来说产品的使用越简单越好。

①若选择STA模式,产品作为客户端,需要用AT指令操作它连接到用户自己的WIFI,不可能让用户自己写AT指令,所以PASS。

②若选择AP模式,产品上电后自动提供WIFI网络,用户只需要用app连接该网络即可进行通信,比较方便。产品上电后,模块工作在AP模式,在死循环里等待控制继电器开关的信息即可。笔者开始确实选择了该方案,但是后续被要求:用户必须使用自己的WIFI网络控制开关。所以该方案也被PASS。

第一次改进:

存在的困难:产品必须接入用户的WIFI,即工作在STA模式接入用户WIFI,必须用AT指令把用户的WIFI账号和密码写给模块,但用户无法操作。

改进:模块作为STA接入用户WIFI被分配了IP,虽然该IP能查到,但通讯没建立,用户无法得知。所以在TCP通信里,产品只能作为客户端,用户作为服务端,提供IP和端口供产品连接。

设计一个自动程序:上电后先让模块工作在ap模式,用户连接该热点,输入自己的WIFI名,密码,IP,端口。产品在接受到信息后提取这4个信息,当判断四个信息全部检测到后,单片机里自动写AT指令给芯片,进入STA模式,并建立TCP通信,接受用户发来的信息。如果没有成功建立连接,程序会回到开始,建立AP模式,让用户重新输入正确的信息。

潜在问题:芯片进入STA模式后,原本的AP模式热点会消失,用户的TCP服务端必须要在程序设置的延时结束之前成功工作,在手机上表现为在十秒之内要连接自己的WiFi,并且在调试助手上打开TCP服务端,否则芯片会连接失败。

后续被要求:用户可能不知道什么是IP地址和端口号,如果让上位机软件自动获取用户设备的IP地址和端口容易被当作病毒,所以产品必须工作在TCP的服务端,把IP地址发送给上位机,让上位机软件自动连接。

第二次改进:

存在的困难:产品必须连接至用户WIFI才能被分配IP,但是在用户WIFI下没建立通讯,如何把获取到的IP发送给用户。

改进:尝试使用STA+AP模式,既作为自身热点,又作为用户WiFi下的站点,获取被用户网络分配的IP后在AP模式把IP信息传输给上位机。经测试该方案是可行的,虽然可能会增大模块的功耗,笔者在网络上没有找到使用STA+AP模式进行该操作的教程,故在下文详细阐述。

六、流程与结果

为了观察程序执行流程,开发板同时连接了ESP-12F模块和电脑。在单片机的中断处理函数里把从ESP-12接收到的信息全部发送给电脑的串口助手显示。

单片机USART1发送AT指令-> ESP-12F -> 单片机USART1接收 -> 单片机USART3发送 -> 电脑串口助手。

产品上电后,STM8S207C6T6芯片进入主函数,初始化IO和串口后,写AT指令给ESP-12F模块(注意:在程序里写AT指令需要在结尾加上\r\n),使其工作在AP+STA模式,重启生效,并设置AP模式的WIFI账号,密码,开启多链接,设置端口号。具体指令流程如下图,红框为单片机写给ESP-12F的AT指令,绿色字为ESP-12F发给单片机的信息:

此时产品作为AP网络中的的TCP服务端,之后程序进入死循环,等待用户连接至产品AP。用户作为客户端,输入服务端的IP(默认192.168.4.1)和端口(避开常用的端口号,这里设置为7007),建立通信,并发送用户自己的WIFI账号,密码,供单片机提取。在程序中,定义了一个全局数组,用于保存ESP-12F发送给单片机的信息。上位机软件发送过来的账号密码带有规定好的前后缀,使用string库的strstr()对前后缀进行定位,从而获取中间的账号密码。

如果连接用户WIFI失败(通过检测WIFI GOT IP字段判断),比如输错账号密码,则芯片重启,重新接收账号秘密,此时上位机会显示与热点断开连接,表明产品连接用户WIFI失败,需要重连热点,发送账号密码。

如果连接用户WIFI成功,则产品现在成功作为用户WIFI下的接收站,但因为工作在AP+STA模式,热点并不会断开,就可以使用AT指令获取被分配的IP,通过字符串操作截取出IP内容,仍然通过刚才建立的TCP通信把IP发送给用户。(注意这里给客户端发送信息要制定好目标设备和信息长度,第一个连接的客户端设备号是0,用string操作获取IP的长度)

上位机接收到IP后可以退出热点,连接用户自己的WIFI,建立新的TCP通信,作为客户端,输入在用户WIFI下作为服务端的产品IP,端口(同AP模式),建立连接。后续可以通过发送指令控制继电器开关。规定好指令格式,通过字符串提取来判定。如此处的jd2on,代表开发板上第2个LED灯亮。

至此调试成功。最后要把程序烧录到flash,却产生问题,上位机的TCP一直无法建立连接。用开发板串口调试后发现延时函数不起作用,导致AT指令无间隔发送,WIFI模块设置失败。查阅资料后发现IAR的release模式下编译器把延时函数优化掉了,在延时函数前加上#pragma optimize = none禁止优化后产品成功工作。

七、总结

理论上,这是一个简单的项目,实际的代码量也确实只有小几百行,但是作为一个产品,需要不断更新,以满足用户需求,难点在于作为开发者,如何站在用户的角度看待产品。而嵌入式产品本身因为和硬件密切相关,开发过程中会遇到各种奇怪的问题,甚至有的只能靠经验推测,比如本次烧录时遇到的问题。故本文将此次开发的详细过程和主要困难记录下来,并分享。项目的具体代码就不提供了,本身并不复杂,笔者也是在AI的帮助下才磕磕绊绊完成的。如有错误请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值