单片机复位助手
视频加载中...
一、前言
这是一个 STM32H7B0单片机。但是非常邪门,使用了多个 调试器,都无法对其进行访问。但是,通过 USB 端口是可以对他进行程序下载的。也就是按动电路板上的 BOOT0 按钮,同时按动RESET按钮。它进入 BOOTLOADER 状态,可以使用 STM32 Cube Programmer 对其进行下载程序。下面制作一个 复位助手,可以替代手工复位功能,分别设置它正常复位以及 BOOTLOADER 复位。同时提供串口通讯功能,这样便于后期的程序开发。
AD\Test\2024\February\STM32BOOT0RESET.SchDoc
二、电路设计
复位控制电路板比较简单。核心是 STM32F103单片机。它通过USB接收上位机的控制命令,以及返回下位机通过 串口2 发送上来的信息。这是它的程序下载和调试端口。两个按键控制手工发送l两种复位命令。外部8MHz 晶体提供单片机工作频率。使用低压差3.3V稳压电源。对于目标板的复位控制通过六芯接口完成。其中包括有复位和BOOT控制线,以及串口调试通讯端口。
▲ 图1.2.1 实验电路板原理图
进行手工布线。采用单面板制作测试电路板。
一分钟之后获得电路, 不过其中存在着缺陷. 这部分应该是原来电路板上覆铜面存在残缺.重新制作一块, 这次电路板制作的非常完美.焊接电路板, 进行清洗.电路板上存在的四个底层引线, 通过 0欧姆电阻进行飞线。下面开始对单片机进行软件开发。
三、软件测试
设置单片机 STM32F103的资源,编写控制程序。通过截取特定的控制命令来区分是普通的通讯串口还是RESET命令。由于功能比较简单。但凡接收到 0x00 ,就判断随后的字节,如果是 0xff 就进行 BOOTLOADER 复位,否则就进行正常复位。下面测试一下这个基本功能。
这是待测的 H7B0 单片机板,将它的 BOOT0 以及 RESET 按键通过电缆连接到复位控制板。除此之外,还包括它的 串口发送和接收线。这样总共有 5条线连接到复位控制板。使用 TypeC USB电缆将它连接到计算机。
使用这个串口程序,给复位控制板发送命令。利用 STM32 Cube Programmer 查看是否能够连接到 H7B0 开发板的 Bootloader。设置它通过USB 访问单片机,便可以查看是否能在 USB端口找到处在 BOOTLOADER状态的单片机。通过发送 00 ff,可以将 H7B0 设置在 BOOTLOADER 状态,发送 00 FE,则将 H7B0 复位在正常状态。通过这个测试,验证了制作的 单片机 BOOT 复位电路正常了。
※总 结 ※
本文记录了开发STM32单片机 BOOT 复位控制电路板。通过它可以替代手工完成对 STM32H7B0单片机开发板的两种复位方式,一种复位到 BOOTLOADER状态,一种复位到正常运行状态。后面再通过应用程序测试这个复位控制板的串口功能。
玩转单片机!基于ESP8266模块的WIFI点阵时钟制作
用ESP8266模块制作的网络授时点阵时钟
美图镇楼
楼主是一名业余的单片机爱好者,做过许多各种各样的时钟,能看过眼去的都发在了本版,还蒙版主厚爱给过精华。可是至今也没有做出一个十分满意的“作品”来。因为做的每个时钟都有这样那样的缺点, DS1302并不太准确;DS3231要好一点但还是有误差(其实也够用了);GPS授时倒是准了,但是要拖一根GPS天线到室外,不够整洁。一直想DIY一个准确、简洁的时钟治愈我的“强迫症”,苦于一直没有找到好的方案。
在一个月黑风高的晚上我偶然地发现了物联网模块ESP8266,能连接WIFI,竟然还集成了32位的单片机,关键还是白菜价,简直就是神器啊!就想着用它来做一个从网络获取时间的时钟,这样只要有网络,时间就准确无误,再也不用纠结了。
1: 认识ESP8266
ESP8266是上海乐鑫(ESPRESSIF)生产的WI-FI低功耗芯片,是业内集成度最高的 Wi-Fi 芯片,封装尺寸仅为 5mm x 5mm。 ESP8266EX 高度集成了天线开关、射频 balun、功率放大器、低噪放大器、过滤器和电源管理模块,仅需很少的外围电路,可将所占 PCB 空间降到最低。ESP8266EX 内置 Tensilica L106 32 位微型控制器 (MCU),具有超低功耗和 16 位RSIC,时钟速度最高可达 160 MHz。支持实时操作系统 (RTOS),目前 Wi-Fi 协议栈只用了 20% 的 MIPS,其他均可用于用户编程和开发。ESP8266EX 专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了最低功耗。ESP8266EX 有三种运行模式:激活模式、睡眠模式和深度睡眠模式,能够延长电池寿命。(PS:这段是抄的)
当然了,只有芯片是没法玩的,网上有和外围电路一起封装好的模块。还有基于这些模块的开发板,板载USB转串口电路,只要用MicroUSB线(安卓手机数据线)连接电脑就可以调试了。方便好用价格也不贵。
Esp8266模块
Esp8266开发板
为便于理解,我们可以把ESP8266模块看作一个可以连接WIFI的单片机。但是要玩转这片小小的板子,却没有想像中那么简单。模块的编程和51单片机有很大的区别,需要从头开始学起,没有找到系统的教程,只好从网络上多如牛毛的信息中提取所需要的知识点,用蚂蚁啃骨头的精神,一点点攻克难关,终于实现了想要的功能。在这里分享一下个人的一些不成熟经验,有兴趣的同好可以参考一下。
2:流行的几种开发方式
AT指令:模块通过串口与上位机连接,上位机发出指令,模块收到指令后做出响应。可以用PC端的串口助手调试。当然也可以用另一片单片机做上位机,不过放着模块集成的32位MCU不用,再用51之类的8位单片机驱动的话就有点小马拉大车了。
NodeMCU:运行于ESP8266模块上的一种固件,该固件提供一些封装好的模块(API),直接调用就可以了。使用LUA语言编程。
Arduino:模块可以在Arduino环境下调试,有基础的同学可以使用此方式。本菜鸟没玩过Arduino,只是按教程简单试了一下,发现编译下载好慢。
几种方法都试了试,发现最适合自己的是NodeMCU。LUA语言与C有共通之处,很快就能适应了。还有现成的API,一些复杂的功能用几行代码就能实现。
3:刷NodeMCU固件
买来模块后需要刷入NodeMCU固件,NodeMCU的源代码发布在Github网站,但是要编译成可刷入模块的bin固件,需要在陌生的Linux环境下,没有Linux基础貌似玩不转。
好在像作者这样的菜鸟可以在线订制固件,打开http://nodemcu-build.com/,留下自己的Email,根据自己的需要选择相应的模块和版本。等会就收到订制好的固件了。
刷入固件用的工具从这里下载https://github.com/nodemcu,按住Flash键不放,把模块接入USB,选好COM口和要刷入的固件,速度不要选的太高,可能会刷入失败,用哪个波特率自己多试几次就好。
固件刷好后,就可以开心的玩了。开发软件个人建议使用Esplorer,此软件需要安装JAVA。试一下第一句程序:print(“Hello NodeMCU!”),模块正常的话会显示Hello NodeMCU!
试试node.restart(),重新启动一下模块,会显示当前固件的版本、生成时间、包含模块等信息。
最新的NODEMCU固件支持可变波特率,不再局限于9600bps。比如可以在Esplorer里把波特率改为57600。如下图:
至此开发环境搭建完毕,可以试着先把模块连接到家里的WIFI,网上有例程,把SSID和密码改成自己的,运行一下就能连接了。
4:从Internet获取时间
关于从网络获取标准时间,先试了试获取百度网站返回的HTTP头,里面包含当前的日期时间等数据,提取一下就好,但是有网友说这个时间也不是十分的准确。
后来发现NodeMCU包含SNTP模块,是专门干校准时间这活的。并且操作也非常的简单,就决定了采用这种方式。
SNTP简介:
SNTP,即简单网络时间协议(Simple Network Time Protocol),主要被用来同步因特网上计算机的时间。SNTP协议采用客户端/服务器的工作方式。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。SNTP客户端通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。
上网找到国内常用的NTP服务器,用PC端的Ping命令简单的测试了一下,结果如下。
NodeMCU固件sntp模块用法很简单,本制作只使用其中的sntp.sync()函数。
语法:sntp.sync({ server1, server2, .. }, [callback], [errcallback], [autorepeat])。
各参数解释:
1. Server1,server2,..:指定要使用的一个或多个ntp服务器
2. Callback:同步成功回调,不需要在这里显式的调用rtctime.set(),该模块在内部自动执行此操作,以获得最佳的准确性。
3.Errcallback:失败回调,返回失败的原因。
1:DNS查找失败
2:内存分配失败
3:UDP发送失败
4:超时,不接收NTP响应
4. autorepeat:如果是非零值,那么每1000秒同步将发生一次,每次同步操作后都会调用回调。
找来例程试一下
sntp.sync("202.120.2.101",
function(sec, usec, server, info)
print('sync', sec, usec, server)
end,
function()
print('failed!')
end)
运行结果:sync 1497432519 920178 202.120.2.101
结果显示同步成功,并返回了1970/01/01到现在的UNIX时间戳和同步服务器。SNTP每次成功同步后会自动更新ESP8266模块的实时时钟,也就是自动调用rtctime.set()函数。所以要使用sntp授时需要rtctime模块的支持,定制固件时不要落下。需要说明的是,成功同步后会自动更新MCU内部的RTC。
当然那一大串UNIX时间戳我们人类是不太能看懂的,还要转为我们习惯使用的日期和时间,这就要用到rtctime模块中的rtctime.epoch2cal()函数,语法为rtctime.epoch2cal(timestamp)。函数成功运行后返回一个数组,数组包括:
year 1970年 ~ 2038年
mon 1 ~ 12月
day 1 ~ 31 日
hour 小时
min 分钟
sec 秒
yday 当前是一年中的第1 ~ 366天
wday 星期 (星期天是1)
例程:
tm = rtctime.epoch2cal(rtctime.get()) --获取当前日期时间并转换
print(string.format("%04d/%02d/%02d %02d:%02d:%02d",
tm["year"], tm["mon"], tm["day"],
tm["hour"], tm["min"], tm["sec"]))
运行结果:2017/07/08 09:48:04
5:显示标准时间
标准时间有了,下一步的工作就是怎样显示出来的问题,总不能开着电脑用串口助手看时间吧。家里用的话1602或12864液晶字太小,远了就看不清楚;数码管做的太多,都审美疲劳了;最后决定用点阵,但是ESP8266模块的GPIO太少,不够用来直驱点阵,为解决这个问题,特地从淘宝上淘了基于MAX7219的点阵模块,4个MAX7219驱动4片8*8点阵。使用SPI串口通讯,还可以多片级联,只要用3个GPIO就能驱动若干片8*8点阵。
MAX7219简介(来自百度百科)
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。 只有一个外部寄存器用来设置各个LED的段电流。 MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。 一个方便的四线串行接口可以联接所有通用的微处理器。 每个数据可以寻址在更新时不需要改写所有的显示。MAX7219允许用户对每一个数据选择编码或者不编码。 整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
第一次玩MAX7219,由于LUA语言用的不顺手,调试起来有点麻烦。先用熟悉的51来点亮点阵,调试通过后再一点一点地移植到ESP8266。买的点阵是32*8,即使用不美观的4*8字体,时分秒也无法全部显示,更不用说标准的5*8的字体了。最后决定只用3片点阵,使用5*8字体,只显示小时和分钟,但也不够用,折衷一下:0-19时用24小时制,20-23时用12小时制。
成功点亮后的点阵,私人订制的字体,还是很漂亮的。
6:开始制作:
硬件很简单,就是一个ESP8266模块, 5V转3.3V的电路和几个阻容。用洞洞板很快就搞定了。
用茶色亚克力做面板,可以增强点阵的可读性。插上电源,模块尝试连接WIFI,蓝色LED亮起,成功连接后该LED熄灭,稍等就会显示当前准确的时间了。如果WIFI断线,模块会尝试自动重连,LED会指示当前的WIFI连接状态。
在每次上电后自动同步时间,然后每隔一个小时与NTP服务器同步一下。这样只要有网络,本时钟显示的时间就是准确的。
功耗也不大,白天正常亮度,不到100ma。21:30后降低亮度,避免影响睡觉。
再来几张美图
7:后记
对于一个仅仅靠兴趣驱动的爱好者来说,做这么一个小玩意遇到的困难太多了,身边没有谁可以请教,只能在网上一点一点的找答案,好在还算是成功的实现了自己想要的功能。现在已经正常的运行了一个多月,时间与GPS几乎一秒不差。
不足的地方就是本时钟只能在一个WIFI环境下使用。其实NodeMCU也提供了通过浏览器设定模块的SSID和密码的功能,但试了几次发现不太稳定,再说换了WIFI只要简单的改改程序就好,也不算麻烦。决定不再折腾,能做到这样就很满意了。
-----官方NodeMCU文档,请移步http://nodemcu.readthedocs.io/en/master/en/
还有调试中的一张图,用液晶屏显示,一起发上来
谢谢观看!
浏览更多精彩内容请登录数码之家网站
技术交流请联系原作者
作者:qxgm
本文来源:数码之家
相关问答
isp必备软件?mcuispstm32是一款好用的isp下载器,可以帮助用户解决stm32f系列单片机和NXP的LPC2xxx系列的isp问题,能够下载一段代码到SRAM里面,再利用我自定的协议进行真正...
51 单片机 串口调试 助手 怎么写?可以参照以下步骤:1.确定串口通信协议:串口通信协议一般包括波特率、数据位、停止位、校验位等。在编写串口调试助手时,需要根据需要确定使用的串口通信协议...
串口调试 助手 都能实现什么功能啊?串口调试助手就是相当于PC机,也就是上位机。通过串口和其它设备(比如单片机或仪器,甚至也可以是PC机)通信。在助手上可以收发,看出结果。串口调试助手就是相...
单片机 与语音模块区别?单片机和语音模块是两种不同的电子设备。以下是它们的区别:1.功能:单片机是一种集成电路芯片,具有处理和控制电子设备的功能。它可以执行复杂的算法、逻辑和...
程序是软件配套的,已经烧进51 单片机 -ZOL问答程序是软件配套的,已经烧进51单片机举报固态硬盘创见3人讨论8346次围观关注问题写回答讨论回答(3)hugendi可能是这样的:1、PC上只有一个串口,其标号是...
单片机 发送的数据在串口调试 助手 接收正常,但是在linux下接...为使用的是同一个串口,所以串口的设置一定是相同的。这样如果都收不正确,可以确定是linux串口驱动的问题。2、详细设置linux串口的参数,包...这样...
单片机 发送的数据在串口调试 助手 接收正常,但是在linux下接...注意接收后可能需要编码转换,比如GB2312,utf8,unicode这几种编码格式的转换如果不是中文的话,可以按照下面方式进行检查1、具体检查方法,...这一步...
52 单片机 怎么和上位机通信?52单片机和上位机通信方法:第一步,将keil4安装到PC上,建个工程,编写串口程序(相信懂单片机的小伙伴都会的,这是基本知识),在串口初始化程序中,设置好波...5...
怎样才能成为 单片机 工程师?一般来说,单片机属于硬件工程师的工作范畴。毕竟单片机驱动编程和电路设计是分不开,只有明白了单片机如何驱动才能设计出更为合理的电路产品。如果想更好的从...
如何通过串口通信程序控制 单片机 的引脚工作状态?不同的单片机会有些不同,一般来说都要先打开串口功能,压入数据,发送。硬件连线比较简单,估计你的问题出在程序上,仔细检查下。还有就是用示波器去抓电平,...