支持app2sd功能(蓝牙实现OTA固件升级的原理)
支持app2sd功能文章列表:
- 1、蓝牙实现OTA固件升级的原理
- 2、全球首发骁龙870:motorola edge s全面测评
- 3、驾驶证补换领、机动车选号,这些都可以网上办
- 4、马斯克宣布向特斯拉推出全自动驾驶测试版10.8软件
- 5、我在高职教STM32——02一览STM32的重要功能
蓝牙实现OTA固件升级的原理
蓝牙在现实生活中的应用非常广泛,各种嵌入式、物联网设备随处可见。
下面就来讲讲如何实现BLE OTA?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?等等内容。
1、概述
所谓DFU(Device Firmware Update),就是设备固件升级的意思,而OTA(Over The Air)是实现DFU的一种方式而已,准确说,OTA的全称应该是OTA DFU,即通过空中无线方式实现设备固件升级。只不过大家为了方便起见,直接用OTA来指代固件空中升级(有时候大家也将OTA称为FOTA,即Firmware OTA,这种称呼意思更明了一些)。只要是通过无线通信方式实现DFU的,都可以叫OTA,比如2G/3G/4G/WiFi/蓝牙/NFC/Zigbee,他们都支持OTA。DFU除了可以通过无线方式(OTA)进行升级,也可以通过有线方式进行升级,比如通过UART,USB或者SPI通信接口来升级设备固件。
不管采用OTA方式还是有线通信方式,DFU包括后台式(background)和非后台式两种模式。后台式DFU,又称静默式DFU(Silent DFU),在升级的时候,新固件在后台悄悄下载,即新固件下载属于应用程序功能的一部分,在新固件下载过程中,应用可以正常使用,也就是说整个下载过程对用户来说是无感的,下载完成后,系统再跳到Bootloader模式,由BootLoader完成新固件覆盖老固件的操作,至此整个升级过程结束。比如智能手机升级Android或者iOS系统都是采用后台式DFU方式,新系统下载过程中,手机可以正常使用哦。
非后台式DFU,在升级的时候,系统需要先从应用模式跳入到BootLoader模式,由BootLoader进行新固件下载工作,下载完成后BootLoader继续完成新固件覆盖老固件的操作,至此升级结束。早先的功能机就是采用非后台式 DFU来升级操作系统的,即用户需要先长按某些按键进入bootloader模式,然后再进行升级,整个升级过程中手机正常功能都无法使用。
下面再讲双区DFU(dual bank)和单区DFU(single bank),双区或者单区DFU是新固件和老固件覆盖的两种方式。后台式DFU必须采用双区模式进行升级,即老系统(老固件)和新系统(新固件)各占一块bank(存储区),假设老固件放在bank0中,新固件放在bank1中,升级的时候,应用程序先把新固件下载到bank1中,只有当新固件下载完成并校验成功后,系统才会跳入BootLoader模式,然后擦除老固件所在的bank0区,并把新固件拷贝到bank0中。非后台式DFU可以采用双区也可以采用单区模式,与后台式DFU相似,双区模式下新老固件各占一块bank(老固件为bank0,新固件为bank1),升级时,系统先跳入BootLoader模式,然后BootLoader程序把新固件下载到bank1中,只有新固件下载完成并校验成功后,才会去擦除老固件所在的bank0区,并把新固件拷贝到bank0区。
单区模式的非后台式DFU只有一个bank0,老固件和新固件分享这一个bank0,升级的时候,进入bootloader模式后立马擦除老固件,然后直接把新固件下载到同一个bank中,下载完成后校验新固件的有效性,新固件有效升级完成,否则要求重来。跟非后台式DFU双区模式相比,单区模式节省了一个bank的Flash空间,在系统资源比较紧张的时候,单区模式是一个不错的选择。不管是双区模式还是单区模式,升级过程出现问题后,都可以进行二次升级,都不会出现“变砖”情况。
不过双区模式有一个好处,如果升级过程中出现问题或者新固件有问题,它还可以选择之前的老固件老系统继续执行而不受其影响。而单区模式碰到这种情况就只能一直待在bootloader中,然后等待二次或者多次升级尝试,此时设备的正常功能已无法使用,从用户使用这个角度来说,你的确可以说此时设备已经“变砖”了。所以说,虽然双区模式牺牲了很多存储空间,但是换来了更好的升级体验。
可参考下面三个图来理解上述过程。
如果你是第一次接触Nordic nRF5 SDK,那么建议你先看一下这篇文章:开发你的第一个BLE应用程序—Blinky,或者看一下这一篇文章:手把手教你开发BLE数据透传应用程序,以建立Nordic nRF5 SDK的一些基本知识,然后再往下看以下章节。
2、Nordic nRF5 SDK DFU工作原理
如文章“nRF5 SDK软件架构及softdevice工作原理”所述,Nordic nRF5 SDK软件架构跟其他家有点不一样,程序存储区最开始部分放得不是Bootloader,而是蓝牙协议栈Softdevice,应用程序则紧挨着Softdevice,Bootloader则被nRF5 SDK放在程序存储区的最上面,整个存储区结构图如下所示。如果用户还有Flash数据需要存放,那么这些数据紧挨着BootLoader下面。
目前Nordic SDK默认只提供非后台式DFU开箱即用的例子(SDK16.0开始也支持后台式DFU框架),即系统必须先跳到BootLoader中,然后才能通过BLE/UART/USB去接收新的固件。如上所示,如果采用双区模式DFU,那么Bank0放的是应用程序,即老固件,Bank1放的是新固件。平时,Bank1为空或者忽略,系统只跑Bank0里面的应用程序;升级的时候,先跳到BootLoader,然后接收新固件并把它放在Bank1中,最后把Bank1里面的固件拷贝到Bank0中。如果采用单区模式,则没有Bank1这个区。平时,系统只跑Bank0里面的代码;升级的时候,跳到BootLoader,先擦除Bank0里面的老程序,并把新固件直接放在Bank0中。
根据升级时如何跳转到Bootloader,Nordic SDK又将DFU分为按键式DFU和非按键式(Buttonless)DFU,所谓按键式DFU,就是上电时长按某个按键以进入bootloader模式,而非按键式DFU,就是整个DFU过程中设备端无任何人工干预,通过BLE/UART/USB接口给应用程序发送一条指令,应用程序收到指令后再自动跳入bootloader模式。不管是按键式DFU还是非按键式DFU,两者只是进入BootLoader的方式不一样,其余基本一样,尤其是BootLoader工作过程基本上是一模一样的。后面只会阐述非按键式DFU的过程,按键式DFU以此类似,就不再赘述。
程序跳到BootLoader后,根据BootLoader需不需要对新固件进行验签,Nordic SDK又把DFU分为开放式DFU和安全式DFU(又称签名DFU)。开放式DFU,BootLoader不做任何验证,直接把新固件接收下来。安全式DFU,BootLoader存有一把公钥,BootLoader会先用这把公钥验证新固件的签名,只有验签通过,才允许后续的工作:比如把新固件接收下来;如果验签失败,BootLoader将拒绝升级,重新跳回应用程序。
BootLoader可以通过不同的通信接口来接收新的固件,目前Nordic SDK支持BLE,UART和USB三种接口,所以大家可以在Nordic SDK中看到如下三种工程目录:
其中pca0056表示nRF52840对应的开发板编号,S140对应Softdevice的型号,然后ble有两个目录:无debug和有debug,uart和usb也包含同样的两个目录。有debug和无debug两者功能是一样的,两者的区别是:debug版本BootLoader支持日志打印(大家可以通过打印出的日志去理解BootLoader的工作过程),并可以忽略各种校验,debug版本占据的代码空间要大很多;无debug版本 BootLoader不支持日志打印功能并且版本和有效性校验是强制的。正式量产的时候推荐使用无debug版本以节省代码空间。这里要强调一下,不管是debug版本还是无debug版本,两者都可以用Keil进行单步和断点调试。
BLE,UART和USB只是通信方式不一样,他们遵守的DFU流程是一模一样的,这里会以BLE通信接口为例,详细阐述DFU过程,UART和USB与之类似,就不再赘述。
讲述DFU升级之前,先讲一下nRF52的启动流程,上电后,系统先执行softdevice,softdevice通过读取UICR一个寄存器的值,来判断目前系统是否有BootLoader,如果没有BootLoader,系统直接跳到application;如果有BootLoader,系统先跳到BootLoader,BootLoader再根据目前的情况来决定是进入升级模式还是跳往application,BootLoader主要判断如下几种情况:
按键是否按下
保持寄存器GPREGRET1是否为0xB1
上次DFU过程是否还在进行中
应用程序校验是否通过
如果按键没有按下,GPREGRET1不为0xB1,本次复位不是上次DFU的继续,并且应用程序校验通过,那么BootLoader就会直接跳到application,去执行application应用程序。那怎么去校验应用程序的有效性呢?为此BootLoader引入了一个放在Flash的结构体参数:m_dfu_settings_buffer(数据类型:nrf_dfu_settings_t),这个结构体参数虽然只有896字节,但由于Flash只能按页擦除,所以这个参数实际占用了一个Flash page,这个page称为settings page,settings page放在Flash的最后一个页面,settings page目前有2个版本:版本1(SDK15.2及以前版本)和版本2(SDK15.3及以后版本),版本2可以兼容版本1,前面所述的896字节是指settings page版本2的大小。Settings page包含的信息比较多,大家用得比较多的是:
各种版本信息
DFU升级过程信息
Application image的CRC值和大小
应用程序的bonding信息
Init command内容
application/softdevice的启动校验信息(版本2才有)
版本1的settings page只校验application image的CRC值,如果CRC匹配,则认为application有效。版本2的settings page不仅可以校验application image的CRC值,还可以校验application/softdevice的CRC值或者hash值或者签名,你可以选择你自己想要的校验方式,只有CRC值或者hash值或者签名校验通过(三选其一),应用程序才算有效,这时BootLoader才会跳到application去执行。为了保证settings page在发生意外时,比如写settings page过程中发生了复位或者掉电,系统也能正确恢复,SDK15及以后版本引入了一个backup page,backup page也占用一个Flash page,内容和settings page一模一样。
上面是没有触发升级的情况下nRF52的正常启动流程,那如果要执行DFU升级,流程又是怎么样的呢?下面详细讲一下无按键式BLE OTA的工作流程。
1) 正常启动后,系统运行在应用程序中,此时手机通过app发送一条开始DFU的指令给设备,设备收到指令后,将GPREGRET1赋值0xB1,并触发软复位
2) 复位后,系统再次进入BootLoader,因为GPREGRET1等于0xB1,BootLoader进入DFU模式,等待新固件接收
3) 手机先将init packet发送给设备,设备先做前期检验prevalidation,主要是各种版本校验以及签名验签,校验通过后,更新settings page并准备开始数据接收
4) 接收新固件。每接收4kB数据,回复一次CRC校验值,直至整个新固件image接收完毕,如果新固件校验通过(版本1校验CRC值,版本2校验hash值),就会去invalidate(无效化) bank0里面的老固件,更新settings page,并再次触发软复位
5) BootLoader启动后发现有新固件需要activate(激活),此时会去擦掉bank0里面的固件,并把bank1里面的固件拷贝到bank0,然后更新settings page,并再次触发软复位。注:上面讲的是dual bank的流程,single bank与之相似,只不过在第3)步的时候就会去擦除老固件
6) BootLoader再次启动后,检查新image的有效性,校验通过后,跳到新的application去执行代码
从上面流程可以看出,DFU过程中,系统需要跑两段完全独立的代码:Application和BootLoader,Application和BootLoader都支持蓝牙功能,也就是说,两者都有自己的蓝牙广播和蓝牙连接。
这里面有一个问题:当系统从Application跳到BootLoader后,手机怎么辨别两者为同一个设备?很多人会说,可以让BootLoader和Application两者的广播名字一样,根据广播名字的一致性,来判断二者来自同一个设备。
这种方法存在两个问题:一大部分手机都支持GATT cache(缓存)功能,当application跟手机相连后,手机会把application的GATT数据缓存下来以加快下次连接的速度(这个现象在苹果手机最明显),之后如果系统跳到BootLoader,然后再跟手机相连,如果两者的蓝牙设备地址一样,手机会认为是同一个设备,从而跳过服务发现的过程而直接使用之前缓存下来的GATT数据,这样会导致BootLoader的服务无法被手机发现,从而出现升级失败。二如果多个设备同时在升级,而我们仅仅依靠广播名字来决定两者属不属于同一个设备,这会导致设备A application有可能跟设备B的BootLoader进行错配。为了解决这个问题,Nordic提出了两套方案。
方案一,假设application的蓝牙设备地址为x,跳到BootLoader后蓝牙设备地址会变成x 1,这样手机就可以通过这种地址 1的方式来辨别两者属不属于同一个设备,由于application和BootLoader使用不同的蓝牙设备地址,前面的GATT缓存问题也就不存在。关于方案一,有一个问题需要特别注意:如果你想修改例子默认的蓝牙设备地址(比如使用IEEE的public蓝牙MAC地址),此时一定要记得同时更改application和BootLoader的蓝牙设备地址,使他们满足 1的条件,否则Nordic手机DFU库无法辨别两者是否属于同一个设备,以致于无法完成OTA过程。
方案二,application和BootLoader的蓝牙设备地址一模一样,但设备跟手机执行配对和bonding操作,设备跟手机bonding后,就可以支持service changed indicate操作,这样跳到BootLoader后可以让手机主动再执行一次服务发现过程,从而解决GATT缓存问题。
很多人对签名验签不是很理解,这里详细说一下它的工作原理。首先,你需要一对公私钥,其中私钥用来生成新固件的签名,公钥用来验证签名的有效性,大家可以用nrfutil来生成自己需要的公私钥对,公私钥制作成功后,私钥一定要妥善保管(一般放在云端),千万不能丢,否则你自己也无法升级自己的设备;也不能被第三方知道,否则升级的安全性就不能保证了。公钥可以变成一个.c文件,并覆盖DFU工程下的同名文件:dfu_public_key.c 。
其次,BootLoader要支持签名验签密码算法,这个DFU代码已经有了,并且有四种后端可选:micro-ecc,cc310_bl,Oberon和mbedtls,四选其一即可(这4种后端,只有cc310是硬件实现,其余都是软件实现),nRF52840推荐选择cc310作为算法后端,其他nRF52芯片推荐选择micro-ecc作为算法后端。micro-ecc效率高,占用的代码空间最小,但它的版权是CPOL,只要你能接受CPOL,那么推荐使用micro-ecc;反之,如果接受不了CPOL版权,而且硬件又不支持cc310,那么推荐使用Oberon,不过Oberon占用的代码空间比micro-ecc要大一些,这个大家注意一下。再次,手机端要生成新固件的签名,并把新固件的签名传给设备端。
大家还是可以用nrfutil去生成新固件的签名。最后,BootLoader接收到新固件hash值和签名,并使用自己的公钥对该签名进行验签。这里说一下,由于nrfutil是PC端应用程序,所以它可以集成各种加密算法库,并完成上面提及的公私钥对,hash和签名的生成工作。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
长按链接搜索 https://s.pdb2.com/l/CMIsoKcnATFIF4M
3、DFU升级步骤详解
3.1 安全式蓝牙空中升级步骤
如前所述,Nordic SDK已经提供了DFU例子,下面我们一步一步给大家讲解如何通过Nordic SDK来实现无按键式蓝牙空中升级。欲实现空中升级,设备需要同时下载softdevice,应用程序,BootLoader程序,以及BootLoader settings page。其中BootLoader代码位于目录:SDK根目录examplesdfusecure_bootloader,然后在该目录下选择你对应的板子和工程。Application对应的目录:SDK根目录examplesble_peripheralble_app_buttonless_dfu,而softdevice所在目录:SDK根目录componentssoftdevice。
下面我们以nRF52832/PCA10040和S132/SDK16为例阐述无按键式蓝牙空中升级实现步骤,其他芯片/softdevice/SDK原理与之类似,这里就不再赘述。当然,不同芯片不同softdevice不同SDK,他们的实现脚本还是会有一些细微差别,所以强烈建议大家去百度网盘下载跟大家相匹配的脚本,百度网盘里面各个脚本的命名规则请参考3.2节。
1) 安装PC版nrfutil。nrfutil安装有两种方式,一种是直接下载exe文件,一种是以Python的方式进行安装。nrfutil.exe直接下载链接为:https://github.com/NordicSemiconductor/pc-nrfutil/releases,记得把nrfutil.exe所在目录放在Windows环境变量中。Python方式安装nrfutil步骤如下所示:
安装Python2.7或者Python3.7,下载地址:https://www.python.org/downloads/,安装成功后请确保Windows环境变量包含Python目录
通过pip安装最新版的nrfutil,即打开Windows命令行工具CMD(管理员权限),输入如下命令:pip install nrfutil,即可以完成nrfutil的安装。
安装完成后,在Windows命令行工具输入:nrfutil version,如果可以正确显示版本信息,说明安装已经成功
对于Windows用户,nrfutil运行需要几个特殊的DLL库,而这几个库有些Windows机器是没有的,如此,可往:https://www.microsoft.com/en-us/download/details.aspx?id=40784下载
2) 通过nrfutil生成公私钥对。
私钥生成命令:nrfutil keys generate priv.pem (priv.pem就是私钥)
公钥生成命令:nrfutil keys display --key pk --format code priv.pem --out_file dfu_public_key.c (dfu_public_key.c就是公钥)
大家务必要保存好私钥priv.pem,以后每次升级新固件时,都会通过这个私钥对它进行签名,一旦priv.pem丢失或者被暴露,DFU将无法进行或者变得不安全
3) 请确保已按照“Nordic nRF51/nRF52开发环境搭建”把Nordic nRF5 SDK开发环境搭建成功
4) 生成micro-ecc算法库。由于micro-ecc是第三方算法库,需要用户自己去安装(这个是版权的要求,没办法直接编译放在SDK中)。请先确保电脑已安装了git和GCC编译器,然后直接点击SDK如下目录的build_all脚本,就可以自动完成micro-ecc算法库的安装。
为了方便一些开发者评估,我这里在自己电脑上生成了micro-ecc算法库,micro-ecc目录编排结构有两种:SDK14及以后版本是一种目录结构(百度云盘压缩包名称:micro_ecc_new.rar),SDK13和SDK12又是一种目录结构(百度云盘压缩包名称:micro_ecc_old.rar),这两个压缩包只是目录不一样,里面的算法库内容其实是一样的,这两个压缩包大家都可以在前面的百度云盘中找到,以供大家评估使用。大家下载下来后,直接覆盖同名目录即可。注意:百度云盘里面的micro-ecc库仅供大家评估使用,如要商用,请大家按照上面步骤去生成。
5) 编译bootloader代码。将刚才的dfu_public_key.c取代SDK根目录examplesdfu下的同名文件,然后使用Keil编译如下目录中的工程:
SDK根目录examplesdfusecure_bootloaderpca10040_blearm5_no_packs,或者nRF5SDK160098a08e2examplesdfusecure_bootloaderpca10040_s132_blearm5_no_packs
,将生成的hex文件改名为:bootloader.hex(注:本文所有项目都会采用Keil工程来讲解,如果你使用其他IDE,请选择其对应的工程文件进行编译,不管是Keil还是其他IDE,除了编译时候选择的工程文件不一样,其余都大同小异,大家可以举一反三完成其他IDE的相应工作)
6) 编译application代码。请编译工程:
SDK根目录 examplesble_peripheralble_app_buttonless_dfupca10040s132arm5_no_packs,将生成的hex文件改名为:app.hex
7) 生成BootLoader settings page。Bootloader settings page存储在Flash最后一个page,如前所述,BootLoader settings page有2个版本,他们的生成脚本命令如下所示:
版本2生成命令:
nrfutil settings generate --family NRF52 --application app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 2 settings.hex
版本1生成命令:
nrfutil settings generate --family NRF52 --application app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex
8) 烧写固件。将上文生成的3个hex文件和softdevice hex文件merge成一个文件,然后通过nrfjprog或者nRF Connect桌面版进行烧写,相关命令如下所示:
合并hex文件命令:
mergehex --merge bootloader.hex settings.hex --output bl_temp.hex
mergehex --merge bl_temp.hex app.hex s132_nrf52_7.0.1_softdevice.hex --output whole.hex
烧写hex文件命令(以nrfjprog为例):
nrfjprog --eraseall -f NRF52
nrfjprog --program whole.hex --verify -f NRF52
nrfjprog --reset -f NRF52
9) 通过nrfutil生成新固件对应的zip包:new_app.zip。zip包包含新固件(新固件广播名改为:Nordic_New,其余跟老固件一模一样)和init包,zip包一般通过云端下发到手机app,手机app再通过蓝牙下载到设备中。生成zip包的命令如下所示:
nrfutil pkg generate --application app_new.hex --application-version 2 --hw-version 52 --sd-req 0xCB --key-file priv.pem SDK160_app_s132.zip
其中,--application表示新固件hex文件。--hw-version表示板子版本,只要BootLoader里面的hw version和这里的hw version对应起来,大家可以改成任何自己想要的值。--key-file 表示签名用的私钥文件。--sd-req表示老固件运行在哪个版本softdevice上,这个值一定要跟自己的softdevice相匹配,否则无法升级,各个softdevice版本ID信息可以通过命令“nrfutil pkg generate --help”获得,如下为当前所有softdevice ID列表:
10) 将“new_app.zip”拷贝到手机上。安卓和苹果手机都可以通过微信的‘文件传输助手’拷过去,非常方便。请注意,手机nRF Connect和nRF Toolbox都支持DFU功能,苹果手机拷贝的时候可以随便选择其中一个app。
11) 通过手机版nRF Connect或者nRF Toolbox进行蓝牙空中升级,这里以nRF Connect为例阐述升级详细步骤,nRF Toolbox与此类似,就不再赘述
第8)步完成后,开发板就可以正常跑起来,并广播为Nordic_Buttonless
连接该设备,使能CCCD(这一步可选),然后选择“DFU”,如下所示:
选择“DFU”后,将跳出一个对话框,让你选择新固件对应的zip包。由于zip包放在了微信下面的download目录下,我们需要通过文件浏览器找到这个zip包,大家可以先用系统自带的文件浏览器打开这个zip包(如果打开失败,那么大家就要去下载一些第三方的文件浏览器了,比如es explorer),相关操作界面如下所示:
一旦zip包打开成功,升级过程开始,界面如下所示:
升级成功后,设备将运行新固件,即广播名字将变成:Nordic_New,如下所示:
如上以nRF52832/S132为例阐述了Nordic SDK实现无按键式签名式蓝牙空中升级的详细步骤,Nordic SDK有多个版本,从SDK13.0.0到现在SDK16.0.0,他们的升级步骤基本上一模一样,大家完全可以参考上述步骤来做。SDK12升级步骤也与上述步骤基本一样,唯一如下地方需要注意一下:
编译application代码的时候,把如下语句注掉,否则会造成BootLoader和application两者的hex文件相冲突
3.2节会按照上述步骤,对一些经典的安全式BLE OTA例子进行测试,并生成可直接运行的脚本,以供大家参考。
3.2 各种安全式蓝牙空中升级例子
3.1节是以升级nRF52832 application为例,详细阐述了安全式BLE OTA步骤。除了升级application,有的人还需要升级softdevice和BootLoader;除了52832,有的人还会用52840/52833/52811/52810/51822等;除了SDK16.0.0,有的人还会用SDK15.3/15.2/14.2/12.3等。为此我选了一些经典组合,将他们DFU用得的所有脚本都做好了,并进行了实际测试,有需要的可以去百度网盘下载。这些脚本在百度网盘的命名规则为:安全模式_固件传输接口_升级哪一部分固件_SDK版本号_芯片型号.rar,比如secure_ble_S132_app_SDK160_nRF52832.rar表示采用安全签名,固件通过BLE传输,BLE使用S132协议栈,升级的时候只升级application而不升级BootLoader和SoftDevice,基于SDK16.0.0和nRF52832。
目前百度网盘上传了如下安全式BLE OTA示例脚本(注:这些脚本都经过我的测试,全都可以直接运行):
secure_ble_S132_app_SDK160_nRF52832.rar
secure_ble_S140_app_sd_bl_SDK160_nRF52840.rar
secure_ble_S132_app_SDK153_nRF52832.rar
secure_ble_S132_app_SDK152_nRF52832.rar
secure_ble_S132_app_SDK150_nRF52832.rar
secure_ble_S140_app_SDK150_nRF52840.rar
secure_ble_S132_app_SDK142_nRF52832.rar
secure_ble_S132_app_SDK123_nRF52832.rar
secure_ble_S130_app_SDK123_nRF51.rar
3.3 通过UART口进行安全式固件升级示例脚本
我们以nRF52810为例来阐述如何通过UART进行安全式固件升级步骤:
1) 请参考3.1节第1)到第4)步,完成nrfutil安装,mico-ecc算法库生成,以及公私钥生成
2) 编译bootloader代码。将刚才的dfu_public_key.c取代SDK根目录examplesdfu下的同名文件,确保sdk_config.h中的NRF_BL_DFU_ENTER_METHOD_BUTTON为1,然后使用Keil编译如下目录中的工程:
SDK根目录 examplesdfusecure_bootloaderpca10040e_uartarm5_no_packs
,将生成的hex文件改名为:bootloader.hex
3) 编译application代码。3.1节讲述OTA的时候,我们选择的例子是ble_app_buttonless_dfu,因为我们是通过蓝牙给设备发送一条命令,从而让设备进入DFU模式。通过串口升级固件,如何进入DFU模式,取决于你的应用设计,你可以采用通过发送蓝牙命令让其进入DFU模式,也可以通过上电检测按键是否按下以决定是否进入DFU模式。如果想采用ble_app_buttonless_dfu作为application,那么你需要把该工程中的main函数如下语句删掉(这些语句是为蓝牙版BootLoader设计的,我们现在是UART版BootLoader,不支持这些语句):
err_code = ble_dfu_buttonless_async_svci_init();APP_ERROR_CHECK(err_code);
这里我们选择以上电检测按键的方式来决定是否进入DFU模式,并以ble_app_blinky作为应用例子,请直接编译如下工程:
SDK根目录examplesble_peripheralble_app_blinkypca10040es112arm5_no_packs,将生成的hex文件改名为:app.hex
4) 生成BootLoader settings page并同时烧写老固件,双击“program.bat”即可完成,这个脚本是使用nrfjprog来完成固件烧写的。
5) 生成新固件zip包并进行UART DFU,双击“dfu.bat”即可完成,这个脚本是使用nrfutil作为UART主机,并将新固件通过电脑COM口传给设备的。请记得一定要修改脚本中的UART对应的电脑COM口,否则升级无法完成。
注:所有bat脚本都可通过右键选择Notepad 打开,然后查看里面包含的具体命令,并按照自己的需求进行修改。如需进一步理解脚本中的命令,请参考3.1节的说明。
上述所有操作步骤已打包并上传到百度网盘,请去网盘下载文件:secure_uart_app_SDK160_nRF52810.rar,这个文件已经过我的测试,大家可以直接使用。
3.4 通过USB口进行安全式固件升级示例脚本
我们以nRF52840为例来讲述如何通过USB进行安全式固件升级,其实通过USB口升级固件步骤与3.3节的操作几乎一模一样,唯一不同的是,选择如下目录的BootLoader工程进行编译:
SDK根目录 examplesdfusecure_bootloaderpca10056_usbarm5_no_packs
通过USB口进行安全式固件升级示例脚本已打包并上传到百度网盘,请去网盘下载文件:
secure_usb_app_SDK160_nRF52840.rar,这个文件已经过我的测试,大家可以直接使用。
3.5 通过USB口进行开放式固件升级示例脚本
我们还是以nRF52840为例来讲述如何通过USB进行开放式固件升级,其升级步骤与3.3节的操作几乎一模一样,唯一不同的是,选择如下目录的BootLoader工程进行编译:
SDK根目录 examplesdfuopen_bootloaderpca10056_usbarm5_no_packs
相关脚本已上传百度网盘,请下载:
open_usb_app_SDK160_nRF52840.rar,这个文件已经过我的测试,大家可以直接使用。
3.6 开放式蓝牙空中升级(Legacy DFU)步骤
所谓开放式OTA,是指OTA过程中,不需要检验新固件的签名,也就是说BootLoader代码里面不包含公钥及相关密码算法库,升级的时候,只校验版本信息,版本校验通过,就可以开始升级流程。Nordic SDK目前支持两套开放式OTA方案,一套是SDK15和SDK16提供的,一套是SDK9/SDK10/SDK11提供的。SDK15/16提供的开放式OTA工作原理和流程,与安全式OTA基本上一样,只不过删掉了签名验签部分。SDK9/SDK10/SDK11提供的开放式OTA也叫legacy OTA DFU,它的工作流程与SDK15/16略有不同,下面将以nRF52832/S132为例,阐述如何在SDK11中实现无按键式开放式蓝牙空中升级,详细步骤如下所示:
1) 编译bootloader代码,请使用Keil编译目录“nRF5_SDK_11.0.0_89a8197examplesdfubootloaderpca10040dual_bank_ble_s132arm5_no_packs”中的工程,将生成的hex文件改名为bootloader.hex
2) 编译application代码,请编译目录“nRF5_SDK_11.0.0_89a8197examplesble_peripheralble_app_hrspca10040s132_with_dfuarm5_no_packs”中的工程,将生成的hex文件改名为app.hex
3) 将softdevice,bootloader和app三个hex文件合成一个文件,命令如下所示:
mergehex --merge s132_nrf52_2.0.1_softdevice.hex app.hex bootloader.hex –output whole.hex
4) 烧写固件到设备中,大家可以用nRF Connect桌面版烧写,也可以通过nrfjprog烧写,nrfjprog烧写命令如下所示:
nrfjprog.exe --eraseall -f NRF52nrfjprog --program whole.hex --verify -f NRF52
5) 另外我们还需要在Flash中写一个application有效标志位,从而上电后程序直接跑到application中去执行,而不是停留在bootloader中不出来,其对应的命令如下所示:
nrfjprog --memwr 0x0007F000 --val 0x01 --verify -f NRF52
6) 用老版本的nrfutil生成新固件对应的zip包。该zip包除了包含新固件image,还包含一些配置信息。升级时,zip包会通过云端下发到手机端app,手机端app再把zip包传给蓝牙设备以进行固件升级。请使用老版本nrfutil(版本号0.3.0)来生成该zip包,老版本nrfutil跟随nRFgo studio一起安装的,只要你安装了nRFgo studio,老版本nrfutil就会自动安装好,并放在目录“C:Program Files (x86)Nordic SemiconductornRFgo Studio”中。生成zip包对应的命令如下所示:
nrfutil dfu genpkg --application app_new.hex --application-version 1 SDK110_app_s132.zip
7) 把上述的‘SDK110_app_s132.zip’拷到手机中,安卓和苹果手机都可以通过微信的‘文件传输助手’拷过去,非常方便。注:手机nRF Connect和nRF Toolbox都支持DFU功能,苹果手机拷贝的时候可以随便选择其中一个app。
8) 使用nRF Connect或者nRF Toolbox来完成DFU过程。这里以nRF Connect为例来阐述整个升级过程。
成功执行完第5)步后,如果开发板运行正常,那么它将进行广播,广播名字为:Nordic_HRM
连接该设备,并使能CCCD,然后选择“DFU”
选择“DFU”后,将跳出一个对话框,让你选择新固件对应的zip包。由于zip包放在了微信下面的download目录下,我们需要通过文件浏览器找到这个zip包,大家可以先用系统自带的文件浏览器打开这个zip包(如果打开失败,那么大家就要去下载一些第三方的文件浏览器了,比如es explorer),相关操作界面如下所示:
一旦zip包打开成功,升级过程开始,界面如下所示:
升级成功,设备将自动启动,此时你会看到新固件已经在运行,广播名字也变成了:Nordic_HRM_new,如下所示:
目前百度网盘上传了如下开放式BLE OTA示例脚本(注:这些脚本都经过我的测试,全都可以直接运行):
open_ble_S132_app_SDK110_nRF52832.rar
open_ble_S130_app_SDK110_nRF51.rar
如果你的应用是基于SDK11开发的,并且需要集成DFU功能,请参考上述例子ble_app_hrs来移植DFU功能,主要工作包括两部分:一把BLE_DFU_APP_SUPPORT这个宏包括的所有代码拷到你的工程中,二如果你的设备支持bonding的话,还需把Device manager相关代码也拷到你的工程中,如此即可完成DFU功能的移植。
详解如何移植DFU功能到ble_app_uart
为了让SDK14及以后版本的ble_app_uart具有DFU功能,有2种做法,一是把NUS服务移植到ble_app_buttonless_dfu中,这种方法相对来说更简单,大家可以自己去实践一下;二是把DFU服务移植到ble_app_uart中,这种移植方式挑战更大,但更有利于我们理解DFU的工作原理,我们现在就来阐述如何给ble_app_uart加上OTA功能。如前所述,OTA过程中,手机跟设备可以进行配对和bonding,也可以用明文进行蓝牙通信。配对bonding的时候,我们可以让BootLoader和application共享bonding信息,也可以只让application进行配对bonding,而BootLoader还是以明文方式进行蓝牙通信。
Nordic已经把DFU服务做成了一个模块,大家只要把这个模块加到自己的应用中,然后完成一些必须的配置,初始化以及回调函数的撰写,再加上把SVCI模块(SVCI模块主要用来修改BootLoader的一些配置参数)加入到应用中移植即可大功告成。在SDK中,DFU服务的名字是:BLE_DFU_SERVICE,这个服务放在文件ble_dfu.c中,而ble_dfu.c又有两个后端实现:ble_dfu_unbonded.c和ble_dfu_bonded.c,分别对应无bonding明文蓝牙连接和有bonding的蓝牙连接,下面也将分这两种情况详细阐述移植过程。
4.1 明文正常连接OTA(无bonding)
1) 用Keil打开如下工程:SDK根目录examplesble_peripheralble_app_uartpca10040s132arm5_no_packs
2) 添加DFU服务有关的文件,目录和宏定义。首先添加如下DFU目录及相关文件:
在define中添加这些宏:DEBUG DFU_SUPPORT BL_SETTINGS_ACCESS_ONLY NRF_DFU_SVCI_ENABLED NRF_DFU_TRANSPORT_BLE=1,其中DEBUG宏只是为了调试方便而设置的,跟DFU本身无关。DFU_SUPPORT是我用来控制我添加的DFU代码的,删掉DFU_SUPPORT,将不编译所有DFU有关代码。其余的宏都是系统自带的,如果要支持DFU,就必须要添加。
然后包含如下目录:
3) 修改sdk_config.h文件。首先我们需要使能BLE_DFU模块,及选择OTA蓝牙连接方式,如下为使用明文进行蓝牙通信的配置:
#define BLE_DFU_ENABLED 1#define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0
同时我们还需要修改softdevice配置。现在整个应用包括2个供应商自定义UUID:NUS和DFU(其实这两个UUID可以合成一个,但由于历史原因,DFU和NUS分别使用了两个不同的vs UUID),相应地ATT table size也要变大,然后应用程序RAM起始地址也需要跟着变,如下(注:这里的NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 设置得稍稍偏大):
#define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1600#define NRF_SDH_BLE_VS_UUID_COUNT 2
修改应用程序RAM起始地址,如下:
4) 修改main.c文件。首先添加如下头文件:
#include "ble_dfu.h"#include "nrf_bootloader_info.h"#include "nrf_power.h"
然后在main函数的开始处,添加修改BootLoader广播名字的代码,由于iOS DFU的时候默认就会去改广播名字,为了兼容iOS,这一行代码是必须的:
err_code = ble_dfu_buttonless_async_svci_init();APP_ERROR_CHECK(err_code);
然后在services_init()中添加ble dfu服务
dfus_init.evt_handler = ble_dfu_evt_handler;err_code = ble_dfu_buttonless_init(&dfus_init);APP_ERROR_CHECK(err_code);
ble_dfu_evt_handler回调函数的撰写,大家只要按照要求来,就没问题,如果应用只支持一个连接,那么ble_dfu_evt_handler可以直接为空。如果应用支持多个连接,可以参考ble_app_buttonless_dfu做法,这里就不贴代码了。
5) 在跳转到bootloader之前,如果你想做一些专门的代码处理,比如完成pending的Flash操作,比如关闭某些模块,那么你可以注册一个app_shutdown_handler来做这些工作。(注:这一步不是必须的,是可选的!)
NRF_PWR_MGMT_HANDLER_REGISTER(app_shutdown_handler, 0);
6) (这一步可选)之前的ble_app_uart是没有BootLoader的,所以启动起来非常快。现在加了BootLoader代码,为了加快system off唤醒的速度,可以定义如下语句,
nrf_power_gpregret2_set(BOOTLOADER_DFU_SKIP_CRC);
然后先disable softdevice,然后再进入system off模式。这一步本身跟DFU没有什么关系,主要是为了加快程序启动速度而另加的。
7) 编译工程,并将生成的hex文件改名为“app.hex”
8) 然后按照3.1节的步骤一步一步完成后续的DFU过程。
4.2 bonding连接OTA
4.1节的工程已经移植了DFU功能,现在我们再把bonding功能移植到4.1节工程上,就可以让我们的应用同时支持DFU和bonding。Bonding功能是通过peer_manager模块来实现的,大家只要把peer_manager有关的文件添加进来,就可以实现bonding的目标。
1) 打开4.1节的工程
2) 添加如下文件:
3) 修改sdk_config.h文件,需要修改多个地方,如下:
#define PEER_MANAGER_ENABLED 1#define FDS_ENABLED 1#define NRF_SDH_BLE_SERVICE_CHANGED 1#define NRF_FSTORAGE_ENABLED 1#define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 1
当NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS设为1时,表示application将与主机进行bonding,同时该bonding信息将共享给BootLoader,也就是说,进入bootloader模式后,主机将使用以前的bonding信息与设备进行加密连接。
4) 在main.c文件开头,包含如下头文件:
#include "peer_manager.h"
5) 在main函数中添加peer_manager_init(),其定义如下所示:
static void peer_manager_init(){ ble_gap_sec_params_t sec_param; ret_code_t err_code; err_code = pm_init(); APP_ERROR_CHECK(err_code); memset(&sec_param, 0, sizeof(ble_gap_sec_params_t)); // Security parameters to be used for all security procedures. sec_param.bond = SEC_PARAM_BOND; sec_param.mitm = SEC_PARAM_MITM; sec_param.lesc = SEC_PARAM_LESC; sec_param.keypress = SEC_PARAM_KEYPRESS; sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES; sec_param.oob = SEC_PARAM_OOB; sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE; sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE; sec_param.kdist_own.enc = 1; sec_param.kdist_own.id = 1; sec_param.kdist_peer.enc = 1; sec_param.kdist_peer.id = 1; err_code = pm_sec_params_set(&sec_param); APP_ERROR_CHECK(err_code); err_code = pm_register(pm_evt_handler); APP_ERROR_CHECK(err_code);}
添加pm_evt_handler定义,代码如下所示:
static void pm_evt_handler(pm_evt_t const * p_evt){ pm_handler_on_pm_evt(p_evt); pm_handler_flash_clean(p_evt);}
尤其要检查如下代码有没有添加,由于iOS DFU的时候默认就会去改广播名字,为了兼容iOS,这一行代码是必须的
err_code = ble_dfu_buttonless_async_svci_init();APP_ERROR_CHECK(err_code);
6) 在ble_evt_handler中删除BLE_GAP_EVT_SEC_PARAMS_REQUEST分支,因为这个分支在peer_manager模块中已经进行处理了,这里再处理一次,会产生异常:
// case BLE_GAP_EVT_SEC_PARAMS_REQUEST:// // Pairing not supported// err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);// APP_ERROR_CHECK(err_code);// break;
7) 修改advertising_start定义,增加删除bonding信息功能(如果你不需要这个功能,也可以不改)
8) (此步可选)一般来说,如果用户在手机端把配对信息删掉了,为了安全起见,设备端也需要把相关配对信息清掉,然后才可以允许手机和设备再次进行配对和bonding。如何触发设备端bonding信息的删除操作?可以通过按键检测的方式来做,比如目前我们这个例子的做法。但是有很多设备没有按键,而且很多人希望这种二次配对的操作对用户来说无感,即哪怕用户删掉了手机端配对信息,如果用户想发起第二次配对请求,设备也能接受,而且操作过程跟用户第一次发起配对请求的过程一模一样。Nordic SDK其实是兼容这种操作的,用户只需在pm_evt_handler()中添加如下代码即可:
if (p_evt->evt_id == PM_EVT_CONN_SEC_CONFIG_REQ) { pm_conn_sec_config_t cfg; cfg.allow_repairing = true; pm_conn_sec_config_reply(p_evt->conn_handle, &cfg); }
9) 上述所有代码都包括在“BONDING_SUPPORT”宏中。
10) 编译工程,将生成的hex文件改名为app.hex
11) 然后按照3.1节步骤来执行OTA过程,不过如下几点需要注意:
如果你在应用中把NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS设为1,那么bootloader代码就不能采用默认配置,请修改bootloader工程中的sdk_config.h文件中的如下宏定义,然后重新编译生成新的bootloader.hex。
#define NRF_DFU_BLE_REQUIRES_BONDS 1 #define NRF_SDH_BLE_SERVICE_CHANGED 1
在nRF Connect中勾选“keep bond information”选项,如下:
手机连接设备成功后,请手动使能CCCD,以让手机自动发起bonding请求
DFU升级成功后,设备将会与手机自动重连,此时需点击“Refresh services”,以获得设备最新服务列表,如下:
上述代码工程我已打包成:ble_app_uart_ota_SDK16_0_0.rar,并上传到百度网盘,大家下载下来解压缩到:SDK根目录examplesble_peripheral这个目录下,就可以直接编译和运行。DFU过程中用到的所有脚本我也帮大家做好了,大家可以直接下载下来使用,其中secure_ble_S132_uart_SDK160_nRF52832_Nobonding.rar对应明文蓝牙传输,secure_ble_S132_uart_SDK160_nRF52832_bonding.rar对应bonding蓝牙传输。
5、 手机端DFU参考代码
Nordic不仅提供DFU设备端的参考代码,同时提供手机端的参考代码。Nordic分别开发了Android版和iOS版的DFU库,大家可以直接拿过来使用,集成到自己的移动端app中,这两个库都放在github上,链接如下所示:
Android版DFU库:https://github.com/NordicSemiconductor/Android-DFU-Library
iOS版DFU库:https://github.com/NordicSemiconductor/IOS-Pods-DFU-Library
Nordic还提供了一个移动端app:nRF Toolbox,nRF Toolbox是代码开源的,里面也集成了上面提到的DFU库,大家可以参考nRF Toolbox来开发自己的移动端app。nRF Toolbox源码也可以在github上找到:
Android版nRF Toolbox源代码及开发说明请参考:https://github.com/NordicSemiconductor/Android-nRF-Toolbox
iOS版nRF Toolbox源代码及开发说明请参考:https://github.com/NordicSemiconductor/IOS-nRF-Toolbox
nRF Toolbox软件界面如下所示:
原文转载于:https://www.cnblogs.com/iini/p/9314246.html
转载自:嵌入式专栏
文章来源:博客园
文章链接:https://mp.weixin.qq.com/s/7IbQbBi6Osludz6VnKd2Jw
版权申明:本文来源于网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
全球首发骁龙870:motorola edge s全面测评
摩托罗拉此前面向中高端市场推出了全新的edge系列,凭借其均衡的配置及合理的价格引起了广泛关注,但遗憾的是该系列中的两款机型并没有在国内上市。不过喜爱摩托罗拉移动产品的朋友们也无需伤心,因为摩托罗拉在2021年开年就为我们带来一颗“重磅炸弹”:全球首发骁龙870芯片的motorola edge s将成为摩托罗拉在中国发布的首款edge系列机型,售价仅为1999元起。
从型号来看,motorola edge s应当属于一部面向新锐商务人群而研发的机型,这就意味着edge s需要兼顾用户日常工作和生活娱乐两种应用场景的平衡,对于设备的性能和续航都有着较为严苛的要求。那么motorola edge s能否完美解决当下年轻人对于日常办公及生活娱乐方面的需求呢?下面我们就来看一下全新motorola edge s的具体表现吧。
01 旗舰性能,外观同样出彩
一款面向Z时代年轻商务群体的手机,除了能够轻松应对平日工作中的办公需求,其外观则必须能够凸显出年轻人“潮酷”的特点。motorola edge s提供了两款潮色:“翡色琉光”及“雪霁初晴”,两款配色光影效果出众,仿佛艺术佳品一般。
我们拿到的是一台翡色琉光配色的motorola edge s,其背部犹如霓虹灯一般绚丽夺目,极具艺术气息,位于左上角的后摄模组突起程度较小。同时得益于motorola edge s采用的3D曲面设计,后盖与中框间的过渡平滑自然,在便于握持的前提下还使得整机厚度得以减少:整机厚9.59mm,重约210g。作为一款拥有5000mAh电池的5G手机,motorola edge s机身重量和厚度控制到位,握持舒适。
motorola edge s采用一块6.7英寸21:9超宽影院屏,屏幕分辨率为2520×1080。值得注意的是这块屏幕还支持90Hz刷新率、DCI-P3广色域以及HDR10格式,能够带来更为细腻的视觉观感及顺滑的使用体验,对于喜欢在地铁上追剧的当代年轻人而言无疑是不可多得的利器。
motorola edge s正面采用了双微孔直屏设计,采用直屏设计的手机好处自然不必多说:避免误触、贴膜无白边不易碎,再结合90Hz的屏幕刷新率,对于喜欢在紧张工作之余通过游戏放松自己的年轻人群而言十分实用。
motorola edge s采用了电源按键和指纹识别二合一的指纹解锁方案,与人脸识别解锁方案搭配使用更为方便。尤其是在当前的大环境下,人们出行往往会佩戴口罩,多了一项侧面指纹识别方案可以更快速且便捷地解锁手机,无需摘下口罩。
总体来看,motorola edge s的外观非常符合适合年轻人群体对“潮酷”的追求,多项细节设计也能够很好地照顾到日常娱乐休闲等场景。不过,作为一款工作/娱乐兼修的设备,motorola edge s不仅仅只有亮丽出众的外观,其内在实力也是值得期待的。
02 首发骁龙870,性能强悍续航同样给力
作为摩托罗拉在中国发布的首款edge系列机型,motorola edge s此次全球首发了高通最新的旗舰级5G芯片骁龙870:7nm工艺制作工艺,CPU采用Kryo 585八核架构打造,主频最高提升至3.2GHz;GPU采用Adreno 650;支持Wi-Fi6及蓝牙5.1音频技术。此外骁龙870芯片还采用了第五代AI引擎,支持15 TOPS算力的同时使得整体功耗降低。
光有新芯片加持当然不够,内存读写速度等也要跟得上。此次motorola edge s还采用了LPDDR5内存 增强版UFS 3.1高速闪存,支持高速读写TurboWrite 和HPB技术,高速读写提升至700MB/s,同时motorola edge s还支持最高1TB高速SD卡拓展,对于平时需要在手机里存储大量办公资料/离线剧集的年轻人群而言是相当方便的。
诸多强力配置加入,那么motorola edge s的性能究竟如何?用数据说话!我们跑了安兔兔、3DMark、GeekBench:
从最终测试结果可以看出,motorola edge s安兔兔跑分超66万,3DMark(Wild Life)成绩远超骁龙865机型,在GeekBench 4.2.3中获得4352的单核成绩以及11117的多核成绩。
介绍完motorola edge s的核心配置后大家或许仍对这部手机的实际性能充满疑问,别急!接下来我们在游戏里实测一下搭载骁龙870芯片的motorola edge s性能究竟如何。
我们挑选了《王者荣耀》、《和平精英》、《原神》三款游戏进行测试,在《王者荣耀》中我们开启高画质;在《和平精英》中开启“HDR高清”、“极限”帧率和抗锯齿;在《原神》中同样使用高画质。我们分别取了三款游戏10分钟左右的帧数数据。
王者荣耀平均61.5帧
和平精英平均59.7帧
原神平均29.9帧(满帧30帧)
从实际结果来看,即使是在较高画质的条件下,motorola edge s仍能做到《王者荣耀》和《和平精英》全局满帧运行。而在有着“硬件杀手”称号的游戏《原神》中,骁龙870虽然不能保证全极限画质下流畅运行,但稍微降低画质要求后,motorola edge s依然能够带来令人满意的游戏体验,这对于一款需要兼顾娱乐/办公的移动设备而言足矣。
值得注意的是,motorola edge s内置有游戏模式,这一模式在玩家打开游戏时会自动启动并以悬浮窗的形式存在,当玩家开启相关功能后可主动阻止系统通知并拦截来电,为玩家带来更为沉浸式的游戏体验。同时其还支持一键录屏截屏功能,方便玩家记录自己的超神时刻。
逐渐完善的5G网络建设除了对设备性能有了更高的要求外,对于其续航能力也是个不小的考验。尤其是对于当下的新锐商务群体而言,平日里出差/上下班时手机没电可就太尴尬了,随身携带笨重的充电宝也不是一个好的选择。
motorola edge s的续航自然不用多说:其拥有一块5000mAh的超大电池并支持摩托罗拉智能省电技术,同时得益于骁龙870自身的低功耗表现,软/硬件双管齐下的motorola edge s拥有了5G状态下可持续待机最高两天的续航,一步到位解决年轻人的“电量焦虑症”。
我们对motorola edge s进行了包括半小时视频录制、半小时音乐聆听、一小时B站高清视频观看在内的5小时重度使用测试。实测下来,motorola edge s的续航/充电表现均在意料之中:满电情况下,edge s在经过5小时的重度使用后仍然剩余41%的电量,续航能力满分。
总体来看,motorola edge s在骁龙870 LPDDR5内存 增强版UFS 3.1闪存这套硬件组合拳的帮助下完全可以满足5G环境下用户日常工作、生活、娱乐三大场景的使用需求。同时得益于其采用的5000mAh大电池,玩游戏、投屏办公、追剧也无需过分担心电量不足。
03 AI前后六摄,配置齐全玩法多样
作为Z时代新新人群,当下年轻人往往会热衷于用手机拍摄工作资料或者记录生活点滴。同时近年来随着Vlog的兴起,对于视频录制的需求大幅度提升,因而一款拥有强大影像力的设备自然是不可或缺的。
此次motorola edge s采用了由6400万主镜头 200万人像景深镜头 1600万超广角微距镜头 TOF立体深感镜头组成的全场景AI四摄方案,拥有f/1.7大光圈的同时还支持夜景、专色模式、微动摄影等多种趣味拍照模式,整体软硬件配置可覆盖多数拍照场景。同时motorola edge s还支持ToF PDAF多重对焦及六轴EIS防抖,拍视频,拍照片再也不怕抖。
从参数来看,motorola edge s的后摄模组功能齐全,那么实际拍摄效果如何呢?下面就一起来看一下实测样张:
主摄样张
超广角样张
主摄强逆光样张
室内光线下微距样张
从motorola edge s拍摄的白天样张来看,6400万像素后摄在色彩还原、曝光控制、细节表现上均有良好表现,其背景虚化效果也更加自然。值得注意的是,motorola edge s所采用的1600万超广角微距镜头拥有121°超广角,可实现2.8cm超微距拍摄。再辅以特色的微距灯环,即使是摄影小白也可以拍出满意的微距照片。
超广角夜景
主摄夜景
室内光线实拍
夜景拍摄环节motorola edge s表现同样可圈可点,其在色彩表现、曝光等方面实力不俗,不过小遗憾就是噪点略多。
此外motorola edge s还支持心率检测功能,该技术通过光谱捕捉即可实现0辐射探测识别生物体征,用户只需面对手机15秒即可准确测得心率,方便随时自查健康状况。对于在外打拼的年轻人尤为适用,快捷且高效。
视频方面,motorola edge s支持4K 60帧视频录制,拥有Vlogger模式、水光美颜人像视频等多种拍摄模式,还支持视频或摄像双广角/双专色/双微距/双人像模式。
从实拍视频中不难发现,motorola edge s所支持的水光美颜人像视频功能能够精准对面部进行图像分析处理。在骁龙870的高算力支持下,motorola edge s可利用AI技术结合拍摄主体周围环境光和肌肤的关系并进行自适应调节,最终呈现出更为自然的效果。
Vlogger模式(忽略我的大脸~)
值得注意的是Vlogger模式下motorola edge s还支持前后拍摄同框的视频玩法,拍摄的趣味性大幅上升,喜欢录制Vlog的用户也可以通过单部手机实现多机位拍摄,呈现更多影像可能性。
04 My UI携诸多新功能全面升级,办公多了位好帮手
硬件强悍,软件及功能体验方面motorola edge s同样不虚。此次摩托罗拉为edge s的My UI加入了新的视觉效果:基于安卓原生系统打造的UI融入了更多本土化元素,更加契合用户日常使用习惯,在实现零卡顿、响应快的同时还很好地控制了整体功耗。
在设置中有一项被称为“滑动分屏”的功能颇为实用,用户在开启该功能后可以在App界面上通过手指在屏幕中央区域左右滑动唤醒功能并调取出所需要的第二款App,实现在同一屏幕上运行两款App,实际效果如下:
实测来看,“滑动分屏”功能可以让用户实现“一心二用”,比如同时观看两部电视剧,边开会边记录笔记、网购时多平台比价等。在骁龙870的加持下,motorola edge s皆可流畅完成这些任务。此外motorola edge s还设有翻转勿扰、三指截屏、秒开相机等多种便捷手势功能,进一步满足用户的日常需求。
日常使用需求得到满足后,办公体验的提升也是motorola edge s所看重的。摩托罗拉在edge s中加入了许多应用功能方面的创新:包括Ready For AI 智能办公、AI 会议模式、一键触达等功能。
以Ready For AI 智能办公为例,该功能让用户实现仅需一根type-c线即可完成由手机到显示器/电视/投影仪等显示设备的跨设备4K高清投屏。得益于摩托罗拉的专属适配及优化,用户可获得经过全面适配的桌面操作系统,在这一系统下,常用的多媒体中心及办公/视频会议/游戏应用将获得统一归类,用户可通过大屏实现文件处理、邮件收发、图片/视频编辑等工作,最大程度方便年轻办公人群的商务、多任务处理需求,获得更为完善的跨设备拓展体验。
手机操控界面
实际体验
对于商务人士而言,安全也是其所重点考虑的一项。motorola edge s内置有ThinkShield安全保护方案,端到端连接无需连接网络,进一步保证文档安全性。同时Ready For AI 智能办公用户未来还有望获得仅靠手机扫码即可与PC连接的便捷体验。
除了投屏更加方便外,motorola edge s还加入了对Moto AI丽音、3麦克风多维收音等技术,配合AI 会议模式及特色分屏等功能,相信motorola edge s将帮助年轻商务人群更好、更快、更方便地处理日常办公任务。
05 最后说一下
最终测试下来,骁龙870加持下的motorola edge s能够很好地解决用户日常的娱乐、游戏、办公需求。同时得益于其所采用的5000mAh大电池及My UI软件优化,motorola edge s的续航表现同样可圈可点。
在5G网络建设日趋完善的今天,一部性能给力,续航同样也要跟得上的5G机型无疑才是当下乃至于未来的新锐消费者所真正需要的。所以如果读者朋友们需要一部拥有旗舰性能且续航能够满足日常办公/生活需求的设备,motorola edge s一定是你的首选机型。
(7612115)
驾驶证补换领、机动车选号,这些都可以网上办
车驾管业务
怎么办?到哪办?
对于很多小伙伴来说
搜指南、查攻略、线下办
往往要费一大番功夫
其实,通过 在线渠道
无论是 办理 还是咨询 业务
都能够足不出户,轻松搞定
1
在线办理
大家可以通过登录
交管12123或交通安全综合服务平台
进行在线办理!
交管12123手机App
www.sd.122.gov.cn
业务类型
驾驶证业务15项
序号 | 业务类型 | 电脑 | 手机 |
1 | 考试预约 | √ | √ |
2 | 取消考试预约 | √ | √ |
3 | 考试信息公布 | √ | √ |
4 | 考试费缴纳 | - | √ |
5 | 初学增驾工本费缴纳 | √ | √ |
6 | 电子学习驾驶证明 | - | √ |
7 | 驾驶证补换领 | √ | √ |
8 | 延期换领驾驶证 | √ | √ |
9 | 延期提交身体证明 | √ | √ |
10 | 延期驾驶证审验 | √ | √ |
11 | 变更驾驶证联系方式 | √ | √ |
12 | 企业聘用关系管理 | - | √ |
13 | 驾驶证审验业务申请 | - | √ |
14 | 驾驶证电子版 | - | √ |
15 | 打印学习驾驶证证明 | √ | - |
业务类型
机动车业务17项
序号 | 业务类型 | 电脑 | 手机 |
1 | 新车选号 | √ | √ |
2 | 在用车选号 | √ | √ |
3 | 新能源车换牌选号 | √ | √ |
4 | 号牌号段公布 | √ | √ |
5 | 备案非本人机动车 | - | √ |
6 | 机动车检验预约 | √ | √ |
7 | 新能源车换牌预约 | √ | √ |
8 | 补换领机动车号牌 | √ | √ |
9 | 补换领行驶证 | √ | √ |
10 | 补领检验合格标志 | √ | √ |
11 | 变更机动车联系方式 | √ | √ |
12 | 免检车申领检验标志 | √ | √ |
13 | 机动车转籍申请 | √ | √ |
14 | 异常选号资料修改 | - | √ |
15 | 申请新车临时号牌 | - | √ |
16 | 申请转出车临时号牌 | - | √ |
17 | 城市货车通行码申领 | - | √ |
业务类型
学习教育业务10项
序号 | 业务类型 | 电脑 | 手机 |
1 | 学法减分 | - | √ |
2 | 公益活动 | - | √ |
3 | 审验教育申请 | - | √ |
4 | 审验教育暂停申请 | - | √ |
5 | 审验教育暂停后预约 | - | √ |
6 | 审验教育网络学习 | - | √ |
7 | 满分教育申请 | √ | √ |
8 | 满分教育暂停后预约 | - | √ |
9 | 满分教育网络学习 | - | √ |
10 | 满分教育暂停申请 | - | √ |
业务类型
便民服务3项
序号 | 业务类型 | 电脑 | 手机 |
1 | 一键挪车 | - | √ |
2 | 业务委托申请 | - | √ |
3 | 老年人业务代办 | - | √ |
遇到业务难题也别着急
多种在线咨询渠道
为您解疑答惑
2
在线咨询
车管热线:
0631-12123
官方平台私信留言:
交管12123APP【服务中心】→【意见反馈】
车管微信公众号:威海车管在线
业务在线办,疑问在线答
无需前往现场
就能解决车驾管业务办理难题
方便、高效,就选在线渠道!
喜欢就星标我吧
来源 | 威海车管在线
编辑 | 张大伟
审核 | 周天恩
安全驾驶,文明出行
威海高速交警祝您一路平安!
4月1日起 公安交管改革69项措施实施
关于荣乌高速公路威海至烟台段停止收取车辆通行费的通告
烟威高速停止收费第一天 车流量有增长 威海高速交警这样提醒您
违法曝光:高速公路上不停车换驾驶员 男子被依法处罚!
这辆鲁K车,威青高速倒车,记12分!
上一秒低头调导航 下一秒追尾前车!丨平安春运
男孩大腿骨折车抛锚 威海高速交警火速救援!
枪王争霸 威海高速交警斩获团体个人佳绩!
最新威海高速路况、违法案例、安全驾驶常识......都在这里
马斯克宣布向特斯拉推出全自动驾驶测试版10.8软件
美国当地时间周二,埃隆·马斯克宣布正在向特斯拉推送完整的全自动驾驶(FSD)测试版10.7软件,此前他曾说他们将跳过10.7版本直接进入10.8版本。然而就在今天(当地时间12月23日),马斯克出人意料地在Twitter上发文称,10.8版本会在今天推出。
马斯克之前曾表示,特斯拉将向安全评分在97分左右的人推出FSD Beta 10.8,但当时没有绝对确认这一点。
不过,他还确认了新的软件栈将支持FSD导航的航点--这被认为包括在假日套餐更新中,该更新也应该会在今日推出。
马斯克还表示,特斯拉将推出一个调整哨兵模式(Sentry Mode)灵敏度的选项,但他没有给出一个时间尺度。
我在高职教STM32——02一览STM32的重要功能
大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学设计分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞 关注,各位的支持是本人持续输出的动力,多谢多谢!#我要上微头条##STM32##高职高专#
PS:本人给学生上课选用的洋桃工作室的“洋桃1号”STM32开发板,因此本文所使用的很多图片资料来自厂家,本人只是做了整理和编辑工作,供学习交流之用,无广告之意,特此声明。
一、STM32的命名——探探芯片型号代表的含义
STM32芯片命名规范
STM32命名解读
公司与产品系列(STM)
意法半导体是一家国际性的半导体生产商,总部位于瑞士日内瓦。ST算是家大公司了,他们不仅生产微控制器,还生产二极管、放大器、无线模块之类的电子元器件,STM只表示ST公司微控制器这一品类的命名。
STM系列官网一览
微控制器类型(F)
微控制器的类型,大概说就是芯片的主要应用方向,如用于简单功能开发的S系列、用于低功耗的L系列、用于高性能的H系列、用于没什么特殊需求的通用F系列。
F类型的微控制器在性能、功能、功耗、价格方面比较平衡,哪项也不突出,哪项也不缺少,尽量满足所有需要微控制器的场合。
STM32系列应用定位
子系列(103)
STM32系列资源一览
引脚数、存储量与封装(C8T)
需要注意:只要是STM32F103子系列,不管引脚数量多少,都具有完全一致的性能和功能。初学者会误以为引脚多的芯片功能多,其实功能多少并不和引脚数量有关,只能说引脚少的芯片可能某些你需要的功能接口没有引出来。在满足功能的前提下,使用引脚最少的芯片是最佳选择。
STM32系列存储资源与封装一览
工作温度(6)
商业用范围:0~75℃
工业级范围:-40~85℃
汽车工业级范围:-40~125℃
军工级范围:-55~150℃
目前工业级范围的单片机是最常见的,一般的民用、商用、工业用电子产品都采用这个温度范围。
二、内核与存储器——反映的是处理器最重要的性能
Cortex-M3处理器内部架构
Cortex-M3内核功能模块
标准化的微控制器核心
ARM公司作为顶层的架构设计者,需要最大程度的整合各家芯片制造商对微控制器的解决方案。因此,Cortex-M3在CPU的基础上又提供了整个微控制器的核心部分,包括系统节拍时钟、并行总线结构、嵌套中断向量控制单元(NVIC)、调试系统以及存储区映射等。
STM32F1系列是Cortex-M3架构的杰出代表
STM32F1是ST公司第一个基于Cortex-M3内核的微控制器系列,它的出现将微控制器的性价比水平提升到了新高度,同时它在低功耗场合和实时控制场合中亦能游刃有余。
STM32F1的核心功能
内核:ARM 32位的Cortex-M3 CPU
① 最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone 2.1)。
② 单周期乘法和硬件除法
存储器
① 64K或128K字节的闪存程序存储器
② 高达20K字节的SRAM
说说SRAM与FLASH
CPU访问SRAM和FLASH
SRAM和FLASH特性对比
三、时钟、复位和电源管理——时钟是灵魂、复位是刚需、电源是必备
时钟的重要性
时钟是指处理器工作的基准频率的来源
由一个电路(芯片内部或外部都可)产生类似脉搏的脉冲信号,一下一下有规律地稳定地跳动,单片机中所有功能组件都需要将这个跳动作为其工作的标准。
处理器的运行速度取决于时钟频率
① 图中的方波由高到低再到高(图中tHSE的部分),就是一个时钟周期。
② 在一个时钟周期内,处理器能运行一条“单周期”指令;还有一些“多周期”的指令需要多个时钟周期才能执行完毕。
③ 时钟频率越高,处理器执行指令越快,所表示出的运行速度就越快。
STM32的时钟周期
STM32的时钟源
时钟源在电路实现的层面上分为振荡器和分(倍)频器,它们两个共同决定了时钟频率。这两种方式STM32都有。
振荡器是一种可以产生固定频率方波的硬件电路;分(倍)频器的工作是把振荡器的频率等分(或成倍)为其他规格的频率。
表中的RTC是“实时时钟“的英文缩写,从处理器技术层面来说是指可以记录日期时间的时钟,与常说的处理器时钟不是一回事。
STM32的时钟源
STM32的时钟树
STM32的时钟树
上图说明了STM32的时钟走向,从图左边的时钟源开始,一步步分配到右边的外设时钟。我们暂时不去详解每个走向,但这相对于51单片机的单一时钟源来说,其复杂度不可同日而语,为什么非要这么设计?
需要倍频是考虑到电磁兼容性,如果外部直接给一个高速晶振(不一定造的出来),太高的振荡频率会给电路制板带来较大难度。
分频是因为STM32既有高速外设又有低速外设,需要分开管理。
每个外设都配备了时钟开关,不用时可以关闭,这样有利于降低整体功耗。所以,当要使用某个外设时,记得一定要开启对应的外设时钟。
STM32的复位
复位的作用
复位的作用就是让单片机内部秩序化(RAM里的数据清空),都回到设计者规定好的状态,就像计算机每次重启一样。
STM32复位的情形
① STM32 单片机中,有一个供电监控器在一直工作,它能监测外部电源的电压,当电压低于2V 时,监控器会让单片机复位。当电压高于2V 时,监控器让单片机进入工作状态。
② 每次给单片机接通电源时,电压都是一次从0 升到3.3V(STM32 的工作电压)的过程,这个过程使单片机复位。因此,可以不需要再外接复位电路。
③ 通常是在单片机的复位引脚上接一个微动开关,开关另一端接地,按下开关可手动复位。
STM32复位引脚与接线
STM32的电源管理
STM32的电源
逻辑电源输入
① 这是单片机最基本的供电输入端口,用 VDD 表示。
② 给这些接口提供 2~3.6V 的直流电压,就能让内核、存储器、I/O 端口和其他纯数字电路工作了。
③ 它还能让I/O 端口输入或输出数字逻辑信号的电平。
模拟电源输入
① 模拟电源电压用 VDDA 表示,用在 ADC、RC 振荡器、PLL 等模拟电路上,因此对电源的稳定性要求较高。
② 64脚以上单片机的模拟电源与逻辑电源是分开的。
③ 引脚较少的单片机上,逻辑电源和模拟电源并联在一起使用,以减少引脚的占用。
备用电源输入
① 这是专门给实时时钟(RTC)供电的,以保证在逻辑电源断开后依然让RTC 保持走时。
② 同时它也给唤醒电路和后备寄存器供电,让它们一直处在工作状态。
③ 一般外接独立电源或者一块1.8~3.6V 的纽扣电池。
四、低功耗与ADC——煞费苦心的低功耗设计,高精度模数转换
STM32的低功耗设计
低功耗是物联网设备的普遍需求
物联网终端设备大都采用电池供电,降低功耗、让电量使用更持久便成了重要的项目需求。因此,单片机内部的低功耗设计也是每个芯片厂商不懈努力的方向。
STM32的低功耗模式
STM32 单片机可以通过关掉一些耗电大的内部功能来达到省电的目的,根据关掉的功能数量,可分为3 种低功耗模式:睡眠模式、停机模式、待机模式。
STM32的三种低功耗模式
STM32的ADC(模数转换器)
ADC的功能
读取端口上模拟量的电压值,类似于电压表。
I/O端口上的逻辑电平
I/O 端口是输入或输出逻辑电平的,也就是高电平(1)和低电平(0)
电压值的精度
① ADC 可以读出从0V 到电源电压之间的具体电压值,并把这个值变成一组数字量(8位、10 位、12 位甚至更高)。
② 位数越多,表示测得的电压值更精密。STM32 的ADC 是12 位的,其精度能够满足大部分应用了。
STM32读取的模拟电压
五、DMA与I/O口——为CPU减负的好助手DMA,几乎全能的GPIO
DMA可大大提高内核工作效率
① DMA 字面意思是“直接存储器访问“,通常用在外设与内核需要进行大量数据传输的场合。
② 如果没有DMA,想读取ADC 的值,首先要在内核向ADC 功能发出指令,然后等待ADC 读取完成,内核再从ADC 读出数据,再存放到SRAM 当中。这个过程需要内核参与,占用了内核的时间,内核就不能去做别的工作了。
③ DMA 可以在这种数据读取、存放的任务上完全解放内核。它能按预先设定好的设置从ADC 读出数据,然后自动存放到SRAM 中指定的位置,不需要内核的参与。当内核需要ADC 的数据时,只要读SRAM 指定的位置这一步操作就行了。
STM32的DMA工作示意
STM32的DMA通道
① DMA 不仅能读ADC,它还能在Flash、SRAM、SPI、USART、定时器、I2C 等功能之间相互传递数据。
② STM32F103 的DMA 有7 个通道,可以设置7 组数据传递任务。
STM32的DMA通道示意
STM32的I/O数量与分组
① 近乎全能的I/O口
学习单片机最先接触的往往就是I/O端口,它是内部功能当中最重要的一块。因为I/O端口也可以代替除ADC之外所有的逻辑电平的通信接口,所以在STM32里叫GPIO(通用输入/输出端口)。
② STM32F103最多有80个I/O端口,被分成5组,每组16个。STM32F103C8T6只有37个I/O 端口,其中PA和PB的16个端口都引出了,PC组只引出3个,PD组只引出2个。
48脚封装的STM32F1芯片的引脚
GPIO的工作模式
每一个I/O 口都有8 种工作模式,也就是I/O 口的状态是输出还是输入?是输入的话,是模拟量输入还是逻辑电平输入?编程时,我们需要在启动I/O 口之前先把它设置成正确的状态。
STM32 I/O口的8种工作模式
四种输入模式:
* 模拟输入是在作ADC 输入接口时使用的
* 浮空输入是内部不接电阻
* 下拉和上拉输入是在I/O 内部接一个10kΩ 的下拉或上拉电阻,根据外部连接的电路可以设置它们。
四种输出模式
* 推挽是指I/O 端口有很强的电流推动能力,可以输出一定量的电流,用于推动一些元器件(如LED)工作。
* 开漏则是弱电流的输出,用于逻辑电平的数据信号通信
* 复用的推挽和开漏是用在复用状态下的。
六、调试模式与定时器——仿真调试除BUG,定时资源多又强
ARM的仿真调试接口
什么是仿真
所谓仿真,就是不把程序下载到Flash 里,而是在计算机端直接控制单片机内核,使单片机能达到和运行下载到Flash 里的程序一样的工作效果。因为不是真的运行程序,而是在计算机上模拟的,所以叫仿真。
JTAG调试接口
不仅是STM32,所有的ARM 内核的单片机都有一组用于仿真调试的接口,它叫JTAG(Joint Test Action Group,联合测试工作组,是一种国际标准测试协议,主要用于芯片内部测试)。
STM32的JTAG与SWD调试接口
JTAG的简化接口——SWD
JTAG 是内核的一部分,并不是一个独立的功能。连接上,可以用5 线的标准JATG,也可以用简化为2 线的SWD,它们的功能是一样的,只是连接方式不同。
ST-LINK仿真器与连接线
强大的定时器资源
定时器的本质
定时器的本质是计时,当达到设置的时间后去做某个事情。
定时器如何知道时长
① 主要是通过系统时钟,时钟产生机器周期,内核以机器周期为单位工作,定时器也以此计数,所以定时器也被说成计数器。
② 当定时器到达了设置的数值时,就会产生一个中断或事件。
多达7个定时器
STM32F103xxx 增强型系列包含:3个普通定时器、1个高级定时器、2个看门狗定时器、1个系统滴答定时器。
STM32的定时器资源
普通定时器和高级定时器不仅能计数和定时,还能做很多复杂的工作,待讲到定时器编程的时候再展开。看门狗定时器的作用是在定时时间到了之后让单片机复位。嘀嗒定时器,用于实时操作系统中的任务切换的。如果没有跑操作系统,那么嘀嗒定时器可以作为普通定时器来使用。
七、看门狗与滴答定时器——保护内核的忠实伙伴与操作系统的心跳
保护内核的忠实伙伴 —— 看门狗
看门狗的本质和作用
看门狗是一种形象的名称,其本质是一种特殊的定时器。看门狗定时器的作用是在定时时间到了之后让单片机复位。
单片机正常工作时
为了保证单片机程序不会跑飞,我们会加入一段“喂狗”程序,即不断把看门狗定时器的计数值清0。因此,单片机程序正常时,看门狗是不会让单片机复位的。
单片机程序异常时
如果单片机不正常工作了,比如程序有错或外部干扰导致死机,这种情况看门狗定时器的计数值无法清0,一段时间后(编程设置)单片机就会被复位,看门狗定时器就把单片机从死机状态中解救出来了。
操作系统的“心跳” —— 滴答定时器
滴答定时器对操作系统尤为重要
操作系统需要一个“时基”,从而可以为多个任务分配不同数目的时间片,或者将某个时间范围赋予特定的任务等。这个“时基”就由这个滴答定时器来提供。
滴答定时器属于CM3内核部件
所有采用CM3 内核的芯片都带有这个定时器,使软件在不同芯片厂商的CM3器件间的移植工作得以简化。
滴答定时器也能当做普通定时器
当STM32 单片机没有跑操作系统,那么嘀嗒定时器可以作为普通定时器来使用。几乎每个实验都要用到的延时函数就是通过滴答定时器实现的。
八、I2C与USART接口——一主多从的低速通信协议I2C,最简单最常用的有线通信之串口
STM32支持的通信协议
通信的硬件层面
在硬件上的是通信接口,即通信需要几条连接线、单片机与芯片之间怎样连接。像串口下载、外部Flash存储器、TF卡、OLED显示屏、传感器这些模块/芯片与单片机之间需要交换的数据太多,那么通过GPIO端口简单的高低电平来表示是不够的。
通信的软件层面
在软件上的是协议规范,也就是以什么样的逻辑电平方式通信。比如发送高电平代表什么、连发3 个高电平代表什么,只有收发双方使用相同的规范,通信才能进行。
这时就需要用到专门的通信接口,虽然通信接口也是输入/输出逻辑电平,但是它们都按照一个固定的格式规范来通信。这种通信的格式规范叫作“通信协议”。
I2C总线
I2C总线(读作“I 方C”或“I2C”)是飞利浦公司发布的一款通信总线标准。所谓总线,是指在一条数据线上同时并联多个设备(芯片或模块)。
主设备和从设备
① 每一组I2C总线上只能有1个主设备,主设备是主导通信的,它能主动读取各个从设备上的数据。
② 从设备只能等待主设备对自己读写,如果主设备无操作,从设备自己不能操作总线。
从设备的数量和识别
① I2C总线理论上可挂接几百个从设备,每个从设备都有一个固定的7位或10位从设备地址,相当于身份证号码。
② 主机想读写哪个从设备,就向所有从设备发送一个从设备地址,只有号码一致的从设备才会回应主设备。
通信速度
低速模式可达100kHz,快速模式可达400kHz,高速模式可达3.4MHz。后两者不太稳定,常用低速模式。
STM32的I2C通信示意
I2C的优点是协议简单易学,相关的芯片模块成本低,在只占用2个I/O端口的情况下可挂接上百个从设备。目前有很多EEPROM 存储器、温度传感器、RTC时钟、气压传感器等都使用I2C总线作通信接口。
STM32F103单片机内部有2个I2C总线控制器,都支持DMA功能,在硬件上完成了I2C的通信协议,用户只需要在指定的I2C寄存器中写入从设备的地址和要读写的数据就行了,余下的工作会自动完成。
USART串口
STM32的串口通信
TTL电平直连多用于单片机与带有USART串口的模块通信,比如Wi-Fi模块、GPS模块、蓝牙模块都支持USART串口。另外它还常用于单片机与计算机的通信,今后我们用计算机给单片机下载程序,就是通过USART串口完成。
RS232接口常见于计算机和工控设备之间的通信。该接口并没有改变USART串口的协议规范,而是通过专用的RS232转换芯片,把TTL电平转换成了±12V电平,使通信的距离和稳定性都有所提高。
RS485的传输速度和距离比RS232还要大很多,而且可用于多个设备的通信,如高层住宅和商场里的电梯就是用RS485连接各楼层,控制叫梯和显示楼层信息。
开发板上的RS232与RS485接口
九、SPI、CAN、USB接口——高速串行通信方式几乎通杀
SPI总线
SPI与I2C对比
SPI和I2C一样是一种总线。SPI总线也有主设备和从设备之分,单片机是主设备,各种周边芯片是从设备。SPI和I2C一样是板级总线,也就是只能在PCB上近距离通信,而不能引出导线到较远的距离。SPI最大的优势是有很高的通信速度,而且在高速下还能稳定工作,这是I2C所不能的。
SPI总线连接示意
SPI高速通信的原因
① SPI之所以有这样的速度优势,正是因为它没有采用地址的概念,不在通信数据里放入地址信息,而是使用硬件来选择总线上的设备。每个SPI从设备都有一条开关控制线与主设备(单片机)独立连接(图中的CS线)。当主设备想与哪个从设备通信时,只要开启那个从设备的开关控制线,总线上就只有这个设备是开启的,总线变成了一对一通信。正是用硬件选择从设备,才让SPI总线协议简单、速度飞快
② SPI速度快的另一个原因是全双工。全双工的意思是总线在通信时能同时收发数据。而I2C总线是半双工的,不能同时收发。如果把总线通信比喻成两个人对话,半双工状态就是我说你听,或者你听我说,同一时间只有一人在说;全双工状态就是两个人同时说话,又同时听对方讲话。这样对话效率要高得多,只可惜人脑没有这么快的反应速度,生活中也看不到这样的对话。但是单片机能全双工通信,所以全双工的SPI在速度上很难被其他总线超越。
STM32的SPI还有哪些特点
STM32F103单片机上有2个SPI总线,最大速度可达18MB/s,而且还支持DMA功能和SD卡读写功能。我们常见的SD卡(或TF卡)都支持SPI模式,可以用SPI总线直接读写卡上的数据。SPI总线在高速通信上有非常大的优势,只可惜受到控制从设备的I/O端口数量的限制,总线上不能挂接太多从设备。
CAN总线
CAN总线是高级智能总线
CAN总线是一种工业控制、汽车电子上常用的高级总线,之所以说它高级,是因为CAN总线的功能复杂且智能。以下CAN总线的电路连接示意图,CAN总线只需要两条导线,理论上可以连接无限多的设备,每一个设备即可作主设备,也可作从设备。CAN总线的通信距离可达10km,速度可达1MB/s。听上去好像速度比SPI的18MB/s 差得很远,但CAN是远程通信,1MB/s的速度已经很优秀了。
CAN总线连接示意
CAN总线强大且稳定
另外,CAN总线的功能也很强大,当总线上的某个设备损坏时,总线可以把这个设备从总线上断开。在我看来,CAN总线算是RS485总线的升级版,RS485是开放的、原始的底层协议,虽然简单,但功能太少。CAN总线加入了区分总线上设备的标识符概念,也加入了更复杂的协议规范。这让用户在使用CAN时更方便了,不用自己设计总线地址之类。CAN总线的工作很稳定,在汽车行业中被用于车内各电子设备的通信。
USB接口
STM32只能是USB从设备
USB 接口是大家再熟悉不过的了,所有计算机上都会有至少1个USB接口,因为USB 接口正是为计算机与周边设备(如U盘、鼠标、打印机)通信而设计的。而STM32F103单片机上有1个USB 2.0接口,它被定义为USB从设备,也就是说,它只能用来与计算机连接来作计算机周边设备,比如用STM32制作鼠标或打印机。USB虽然不是总线,但它和CAN总线一样都有底层非常复杂的通信协议,但在用户使用层面上又变得比较简单。
STM32与电脑USB的连接
下图是USB接口的电路连接示意图,从中可以看出USB有2条数据线,另外还有2条电源线,可以由计算机端给USB设备(单片机)供电。USB接口与之前讲到的USART串口都能与计算机通信,可是USB接口有明确的主从关系,单片机只能作为计算机的从设备。而USART串口的通信没有主从关系,计算机与单片机的通信是平等的,任何一方都能主动发出数据。
USB接口电路连接示意
十、内部功能小结——梳理各模块的主要用途和彼此联系
通过以上内容,我们大致了解了STM32内部每个功能的特性和用途,初学者有些概念不理解也不要紧,脑子里有个大概印象即可,等系统学习各功能编程的时候再回过头来看看,也许就会多一分领悟。最后,我们把STM32数据手册中的内部功能关系框图摘出来标注一下,仔细研究这张框图,彻底了解所有内部功能之间的关系,可以帮助我们清晰地认识这款单片机,再学习某些知识时会有更深刻的理解和记忆。
STM32内部功能关系框图