由于BNO080片上的程序是由Hillcrest Labs提供,而且代码不开源,我们只能通过他们提供的demo进行BNO080升级程序的编写。

从本质上来说,BNO的升级程序其实就是通过STM32的SPI或者IIC对另外一款MCU进行固件程序的更改。既然BNO是“另外一款MCU”,他就和普通的MCU一样,要升级就需要bootloader程序和用户存储区,不过这些Hillcrest Labs都提供好了,我们需要做的只是遵循BNO080内置的bootloader程序里面的通讯协议,通过STM32的SPI或者IIC,把他们提供的最新固件送入到BNO080的芯片内。至于BNO080如何写入到他自己的用户存储区,这我们就不用管了。这种方式既有好处也有坏处,最直观的好处就是我们少写了一份代码(即BNO的片内bootloader程序),Hillcrest Labs也做到了技术的保密。但是坏处就是,通过STM32对BNO080升级的过程中一旦出现了什么问题,是很难定位到问题产生的原因的(因为我们看不到BNO080的bootloader程序,更别说对其逻辑仿真),只能通过联系原厂FAE,一起协同定位问题原因,费时费力。

不要把BNO080当成一种传感器,其实它就是一个自带MCU的IMU,他里面有自己的固件程序、运行逻辑和数字运算处理单元,他做的工作就是通过自身的敏感元件上获取到的陀螺仪数据通过IIC或者SPI发送给我们的单片机,来被我们利用。我们对它所进行的固件升级也不过是通过BNO080的IAP功能,把APP程序(最新固件)写入到存储区。BNO080上电的时候运行在BOOT区,如果有外部改写程序的条件满足,则对存储区的程序进行改写操作。如果外部改写程序的条件不满足,程序指针跳到存储区,开始执行放在存储区的程序,这样便实现了IAP功能。

STEP 1.进入DFU模式

既然我们要对BNO080进行固件升级,我们要把BNO080模式置为DFU状态,他们提供的demo里面sh2_hal_reset就实现里此功能。

前两行代码Cookie这个参数这里没用,可以不加。OnRX是注册的回调函数,有sensor事件时给应用层。

spiReset(dfuMode);这个函数必须要有,里面更改了SPI的配置。后面再进行spiReset函数的解释。

然后把RSTN引脚拉低,再把BOOT引脚拉低,延迟10ms,再把RSTN引脚拉高。再延迟200MS,BNO080进入DFU状态,时序逻辑图如下。

IntnAsserted是中断标志,这里初始化成false;

点开spiReset函数,里面可以看到正常SPI和升级模式的SPI是不一样的

DFU模式SPI是

hspi->Init.CLKPolarity = SPI_POLARITY_LOW;

//串行同步时钟的空闲状态为低电平

hspi->Init.CLKPhase = SPI_PHASE_1EDGE;

//串行同步时钟的第一个跳变沿数据被采样

hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;

//定义波特率预分频的值:波特率预分频值为64

正常模式SPI则是

hspi->Init.CLKPolarity = SPI_POLARITY_HIGH;

//串行同步时钟的空闲状态为高电平

hspi->Init.CLKPhase = SPI_PHASE_2EDGE;

//串行同步时钟的第二个跳变沿数据被采样

hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;

//定义波特率预分频的值:波特率预分频值为32

这块SPI的配置可以看出BNO080里面升级模式与普通模式SPI配置是不一样的,我们必须要把STM32也配置成相应模式才能完成数据通讯。

改完SPI配置后,我们再向BNO080发一个dummy byte,来保证reset前SPI clock的相位已经拉低。

STEP 2.发送固件包大小和发送帧数据长度

进入升级状态后,获取到固件包大小,把当前固件包的大小塞进一个Buffer里面,再调用appendCrc函数在buffer末尾加入校验位,供BNO080进行数据校验,保证数据可靠性。再然后通过dfuSend函数,把Buffer发送给BNO080.

当ACK获取得到字符“n”(0x6E)代表写入未成功,得到字符“s”(0x73)时代表操作成功,即可进行下个操作。

设置发送帧数据长度(我设置的是24字节),把发送帧数据长度塞进一个Buffer里面,再调用appendCrc函数在buffer末尾加入校验位。再然后通过dfuSend函数,把Buffer发送给BNO080. 得到字符“s”(0x73)时代表操作成功。

STEP 3.发送固件

根据所设置发送帧数据长度获取固定个数的固件包数据,把固件包数据(我设置的是24字节,所以先塞24字节数据)依次塞进一个Buffer里面,再调用appendCrc函数在buffer末尾加入校验位。再然后通过dfuSend函数,把Buffer发送给BNO080. 得到字符“s”(0x73)时代表操作成功,然后固件包再偏移帧数据长度个数据(我偏移24字节),再发送下一包数据,直到数据全部写入。

STEP 4.发送固件完成后,重新初始化

重启或者重新初始化SPI,升级完成~

BNO080固件升级流程相关推荐

  1. nRF 51822 nRF52832固件升级流程

    一般芯片启动都是先启动协议栈,然后在协议栈中判断相应的地址是否存在bootloader,一旦bootloader存在就会先运行bootloader, 在bootloader运行的过程中,判断相应存储位 ...

  2. 联发科MT33xx GNSS模块固件升级流程

    最近的一个项目中,有通过嵌入式设备对使用联发科MT33xx GNSS模块升级固件的需求.供应商只提供了一个PC端升级工具,并表示出于保密考虑,不会提供升级流程相关文档.但将已出售的嵌入式设备中的GNS ...

  3. OTA固件升级对于物联网设备的重要性

    物联网(IoT)代表着一个重要的发展趋势,逐渐将日常生活中的各个方面相互连接在一起.不同于早期的路由器等无线设备(每个房间或者办公室安装一个)在数量上的局限性,物联网将会非常深入的渗透到方方面面,并且 ...

  4. 【华为云技术分享】【我的物联网成长记16】玩转设备固件升级

    [摘要] 固件升级又称为FOTA(Firmware Over The Air),是指用户可以通过OTA的方式对支持LWM2M协议的设备进行固件升级. 固件升级流程 固件(Firmware)一般是指设备 ...

  5. 关于单片机固件升级的理论基础

    背景 单片机烧录程序的方式有三种:ISP.ICP.IAP ISP(In-System Programming) 系统编程,使用引导程序(Bootloader)加上外围的UART/USB等接口进行烧录. ...

  6. recovery 流程学习总结(二)

    1引言 1.1目的 对学习的Android Recovery模式及OTA升级过程进行总结,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾.文档主要包括两部分,第一部分为恢 ...

  7. 固态存储设备固件升级方案

    1. 前言 随着数字化时代的发展,数字数据的量越来越大,相应的数据存储的需求也越来越大,存储设备产业也是蓬勃发展.存储设备产业中,发展最为迅猛的则是固态存储(Solid State Storage,S ...

  8. 开放下载!《深入浅出玩转物联网平台》

    简介:一书详解IOT必备要点,云运维工程师不可错过的匠心之作 物联网正在迅速发展.势不可当,企业或创业者该如何面对? 本书从实际需求出发,分为上下两卷,和读者一起从多角度认识物联网.作者从复杂的IoT ...

  9. android 系统(154)----OTA制作及升级过程

    OTA制作及升级过程 1.概述 1.1   文档概要 前段时间学习了AndroidRecovery模式及OTA升级过程,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾.文 ...

最新文章

  1. 通往安全自动驾驶汽车的艰难道路
  2. C++标准库简介(转)
  3. Swift 中使用 SQLite——查询数据
  4. opencv-python图像处理之磨皮相机
  5. UIView 的布局与绘制显示相关方法调用时机
  6. ASP.NET MVC 5 入门教程 (2) 控制器Controller
  7. 简单说说Linux中valgrind进行内存检测
  8. Android通过Geth RPC接口实现接入以太坊私有链
  9. redhat6.4执行二进制程序报错:/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory...
  10. memkind版本查看_不同价位值得买轻薄本推荐~2020国庆篇
  11. 微软2月修复99个漏洞,含1个 0day
  12. 经过多次试验后第一个成功地实现 HTTPService 与 MXML 之间传递数据,ArrayCollection 与DataGrid 之间成功绑定...
  13. linux后台运行程序(secureCRT断掉或关闭后继续运行程序)
  14. android wifi列表轮询,(八十八)Android O WiFi启动流程梳理续——connectToSupplicant
  15. PyCharm学习笔记04:PyCharm 键盘映射和快捷键 - Keymap Shortcuts
  16. linux su文件删除了,UBUNTU linux 批量删除文件
  17. 【Love2d从青铜到王者】第一篇:Love2d入门以及安装教程
  18. vscode 格式化 json文件
  19. 完数什么意思_数学中质数和合数是什么意思
  20. 《南朝凶猛》 轩辕鸿鸣

热门文章

  1. 百度图片源码流出~按照颜色搜图片~提取图片主体颜色
  2. SuperMap 三维GIS应用
  3. 基于STM32单片机的温度报警器Proteus仿真
  4. 华为云GaussDB开发者认证再辟新高峰,工作级认证等你来战
  5. 计算机网络运营职业生涯规划,计算机网络专业的职业的职业生涯规划书如何写?...
  6. Visual Studio Code debug Python 代码很牛逼。
  7. vscode 怎么编辑sphinx_VSCode Snippets 食用指南
  8. php教室预约系统怎么做,预约系统怎么做?
  9. java通过URL请求实现网上图片下载
  10. twine_比较Twine和Ren'Py的互动小说