现在我们已经完成了以下工作:建立好了云端的MQTT服务,并将连接服务器的参数适配到固件代码中;生成的新版本固件,经过格式转换后上传到百度云端的BOS服务器。
接下来我们还要对板子做一个初始化的准备工作:使用STM32CubeProgrammer烧写MCU片上flash和片外的板载QSPI Flash。先全片擦除MCU片上的flash和外部QSPI Flash,再分别将用户程序和bootloader烧写到MCU flash的APP区域(0x08010000起始位置)和bootloader区域(0x08000000起始位置)。
如果需要用到“一键恢复出厂固件”功能,就还需要烧录一个默认用户程序到QSPI Flash的默认固件区域(QSPI Flash 0x00010000起始的位置,remap到STM32的地址空间是0x90010000),并将该默认用户程序的大小和校验和的值,写到QSPI FLASH INFO区(QSPI Flash 0x0起始的位置,remap到STM32的地址空间是0x90000000)。这两个值在用户恢复出厂设置,即把默认用户程序烧写回片上MCU flash时,用来检查存储在QSPI Flash上程序的完整性。
上电复位运行程序,Bootloader程序先运行,然后自动跳转到用户程序。开发板通过wifi模块连接到热点,自动获取IP地址并开始连接百度云IoT平台,连接成功后,每10秒向云端发送一次状态。包括:LED的状态,软件版本和运行状态。
保持STM32F769DK板正常运行,并已连接到百度IOT服务器。此时,如果通过MQTT.fx向百度IoT平台发布新的固件信息(包括版本信息和下载地址)到主题: $baidu/iot/shadow/{deviceName}/update。 STM32F769DK板子收到推送的新固件信息后,便会自动下载新固件。
下载完成后,提示用户当前有新版本可用。当用户按下蓝色USER按键后,程序复位。开始执行bootloader程序。
bootloader程序会将新的固件从QSPI FLASH烧写到MCU片上的FLASH中。然后跳转执行。
在烧写固件前, 程序会检查固件的完整性。如果发现固件被损坏,则不烧写。直接跳转执行老的程序,并且会在QSPI的INFO区做相应记录,重新从云端下载好的固件来覆盖已被损坏的固件。
如果在运行例程时出现连接服务器失败的情况,请检查百度云物联网平台的根证书和当前例程使用的是否一致。可以在百度云物联网平台下载根证书,然后根据新的根证书内容,替换certs.h文件中BAIDU_CA_CRT的定义。
|