实现功能

通过蓝牙无线烧写程序到芯片,实现ISP下载。

支持芯片

STC8 STC15 STC12 STC11 STC89

具体过程

一. 绑定蓝牙模块

HC-05蓝牙模块有6个引脚,在此只需其中四根线:两个为电源线(注意,电源需要是5V)、两个为串口线。

1.用USB转串口线直接连接蓝牙模块,并将USB转串口线连接到电脑上。此时蓝牙模块上面指示灯在快速闪烁,说明HC-05在寻找配对蓝牙。之后,我们按住蓝牙模块上的小按钮,不要松手,重新给HC-05模块上电后,再松手。看到指示灯缓慢闪烁,此时蓝牙模块正在等待AT指令。

2.打开串口助手,设定串口参数如下:

发送数据” AT\r\n”后,接收到”OK”,则说明蓝牙模块已经进入调试模式。

设定蓝牙名字(这一步可以跳过):

AT+NAME=HC05A9600\r\n

设置蓝牙串口波特率:9600 ,1 停止位,无校验位

AT+UART=9600,0,0\r\n

设置蓝牙密码:

AT+PSWD=1234\r\n

设置蓝牙的主从模式(0—从, 1—主,一个蓝牙设置为主模式,另一个设置为从模式):

AT+ROLE=0\r\n

指定蓝牙地址连接:

AT+CMODE=0\r\n

互相绑定对方地址时:

(1)首先查询自身的蓝牙地址:

AT+ADDR?\r\n

返回的信息为自身蓝牙地址(例如98d3,37,9e02),需要记下备用。

并用同样的方法查询另一块儿蓝牙的地址,并记下来。

(2)绑定对方地址:

AT+BIND=98d3,35,b736\r\n

注意:蓝牙地址用逗号隔开!

等两块蓝牙模块都设定好后(一个设置为主模式、一个为从模式;相互绑定对方地址),重新上电(上电前不用按小按钮),等几秒后,蓝牙模块信号灯为快速连续闪烁两次,然后熄灭两秒,则表示相互连接好。

二. 设定单片机可以通过串口触发软件复位

STC单片机ISP程序下载需要单片机复位才能实现,所以我们设定一个字符或者数字,等到单片机接收到该字符后,便会执行软件复位。从用户程序软复位到ISP的参考代码如下:

Sfr IAP_CONTR=0xC7; // STC89/STC90/STC12C54xx/STC2052系列的SFR地址为 0E7H

在单片机串口中断函数中添加:

if(SBUF==0xf1)  //0xf1为自己设定复位触发字符

IAP_CONTR = 0x60;  //软件复位

将以上代码编译后,烧写到单片机。

之后,在串口助手给单片机发送f1就能实现单片机复位。

注意:波特率设定为9600(与蓝牙模块的波特率一致)。

三. 蓝牙程序下载测试

由于STC单片机型号繁多,在此取出五款单片机进行测试:STC89(STC89C52RC)、STC11(STC11F04E)、STC12(STC12LE5204AD)、STC15(STC15W408AS)、STC8G(STC8G1K17)等五款型号进行测试。

其都是外接晶振11.0592M。

(1)测试1。设定串口波特率为9600,无校验,1停止位。蓝牙模块波特率设定也是9600,无校验,1停止位。在STC-ISP软件中设置如下:

图中自定义命令“f1”就是复位指令。此时,点击“下载/编程”按钮。发现STC89C52RC可以实现蓝牙无线下载,而其他型号的单片机则实现不了。接下来更改蓝牙模块参数,重新测试。

(2)测试2。设定串口波特率为9600,偶校验,1停止位。蓝牙模块波特率设定也是9600,偶校验,1停止位(AT指令:AT+UART=9600,0,2\r\n)。在STC-ISP软件中设置如下:

点击“下载/编程”按钮。发现除了STC89C52RC不能实现蓝牙无线下载,而其他型号的单片机都可以实现。

四. 总结

STC89C52RC内部没有RC振荡器,只能用外部晶振,其在使用ISP下载时,不需要设定串行通信校验位。而STC8、STC15、STC12、STC11内部集成了RC,而且精度不如外部晶振,其在通信时可能会发生错误。因此这些单片机(尤其是使用IRC时)进行ISP时,需要加入校验位(偶校验),那么对应的蓝牙模块也要设置为偶校验。

另外,测试还发现IRC时钟在串行通信时,单个字符的发送与接收还是比较稳定;而连续大量字符发送时,可能就会发送错误。所以在做连续大规模数据传输时,建议采用外接晶振。

五. 补充

(1)我平时习惯了串口无校验位通信,而采用STC8、STC15、STC12、STC11等单片机通过蓝牙下载后,必须将串口的为工作方式3,才能跟PC正常通信(不然蓝牙模块只能当下载器用,一旦单片机开始工作后,就无法和蓝牙模块通讯)。

设定:

SCON = 0xd0;

发送串行数据时:

ACC=dat;  //dat为待发送数据,ACC为累加器

TB8=P;  //TB8存放PSW中的奇偶校验位

SBUF=dat; //串口发送数据

而接收数据时,可以进行偶验证,也可以直接读SBUF。

(2)由于串口中断函数中,增加了复位指令,所以在PC给单片机发送控制指令时,不要发送能触发复位的指令。尽量发送ASCII字符(ASCII码值只有128个,其码值小于0x80),以规避复位指令。

六. 后记

通过无线模块烧写STC程序,总共花费了我一个多星期的时间,甚是感慨。有人会问,为什么为了这么简单的东西花了这么长时间?答曰:走弯路了,而且还是大弯路。一月份的时候首次用STC15W408AS(无晶振)模块进行蓝牙模块下载,当时设定的蓝牙模块为无校验位,不管怎么重启和尝试就是不能下载,很是郁闷,折腾了一天放弃了(但也学会了如何绑定两个蓝牙模块和单片机软件复位)。现在疫情爆发,封闭到家里面,就开始再次研究这个问题。

当时想着可能是内部IRC精度不高造成,毕竟用串口线给其烧写程序时,经常失败。所以我手动焊接了一块儿带外接晶振的STC15W408AS,结果还是不能通过蓝牙模块下载程序,又吃了一个闭门羹。然后我想起来之前有一块儿STC89的最小系统板,然后就拿过来测试。结果发现一键下载,异常的丝滑,让我顿时来了精神。我觉得89系列能下载,这说明蓝牙模块做无线下载应该没有问题。紧接着我又开始捣鼓STC15,当时从网上搜索“STC15无线下载”,但是没有得到有效的信息。此时,我就愈发对ISP协议感兴趣,从网上找了ISP一些协议来研究,并用三个USB转串口模块,来窃取STC15在烧写程序时的通讯数据。结果发现这些数据不恒定,当时还觉得ISP协议还是加密的,且跟烧写次数以及烧写时间有关,很是牛(现在知道了是因为,用无校验位的串口去窃取,其本身就不稳定)。而且还发现把某些通讯数据慢慢发送给STC-ISP也能触发其“检验MCU”,但是一旦发送的快了就不行。此时觉得应该是蓝牙模块数据阻塞的原因,蓝牙发送数据不是匀速,应该一个个数据包进行的,导致上位机采集不均匀(到此时,我还是没有察觉是校验位的问题)。之后用STM32进行数据的转送,以均匀的速度将数据一个个发送出去,但是其只能完成一小步烧写流程,到“重新握手”就卡死了。此后还尝试了wifi模块、超再生模块、脱机下载器等等一些方法。直到仔细查看STC15数据手册时,在其ISP脱机下载程序(“利用主控芯片对从芯片(限STC15系列)进行ISP下载”)中有一行:

这是一语惊醒梦中人,但是其下面的TMOD=0x00;是明显的错误。尽管不能保证其一定是偶校验,但是数据手册上的利用主控芯片对从芯片(限STC15系列)进行ISP下载的程序绝对是有问题。之后将蓝牙模块加上偶校验,下载STC程序,一切正常。为了结束这么长时间的摸索,所以我又一口气焊接了STC8、STC12、STC11三款带晶振的最小系统板。并进行了测试,发现他们也得增加偶校验才能无线烧写程序,因而我觉得应该是STC公司将所有IRC芯片都设置了ISP偶校验通讯。之后,在网上搜索“STC无线下载”时,发现有用STC12成功的,其就是增加了偶校验。哎,如果当时能认真搜素且认真阅读每一个信息,就应该不会走这个大弯路了吧。