本文目的
- 本文将记录如何在沁恒的cortex-m0平台的蓝牙芯片上实现用户bootloader引导用户app方式,并且变相解决中断向量表重映射的问题
- 用户app包括一般的工程,和蓝牙工程
- 本bootloader跟wch芯片内置的bootloader不同,并不烧录到芯片自带的bootloader区域.
- 在本例程的基础上经过简单的修改,既可以实现各种方式的DFU功能,诸如串口/BLE/USB/ETH方式等,只要实现传输,校验,跳转即可
适用芯片
- CH577/CH578/CH579
实现过程
存储配置
flash地址 | 备注 | |
---|---|---|
中断二次跳转固件 | 0 - 0x1FF | 此部分已经包含在user_bootloader中的vector_remap.c 文件中 |
user_bootloader | 0x200 - 0x3FFF | |
user_app | 0x4000 - |
中断重映射
CH577/578/579 是arm cortex-m0内核的芯片,该内核并不提供原生的中断重映射功能,一般各厂商都是自行实现(如STM32 系列的可以放在RAM的起始地址). WCH的"解决方法"是芯片提供了叫RB_ROM_CODE_OFS的寄存器标志位,使能该位后,flash控制器读整体向后偏移32K(比如实际0x8000的地址,会变为0地址),此方法不在本文范畴内.
本文实现的方法是:在flash的0地址放入一段固定代码,接管所有的中断,然后根据标志位,再次跳转到user_bootloader还是user_app的实际的中断服务程序里. 该标志位对应关系:
//R8_GLOB_RESET_KEEP bit7=1 for this bootloader interrupt
//R8_GLOB_RESET_KEEP bit7=0 for user app interrupt
烧录
使用hex合并工具把hex合并后然后用WCH 的isp工具进行烧录即可
- 合并工具 https://gitee.com/iot-fan/iot-fan_at_cnblogs/tree/master/Tools/hex_tools
- 烧录参考 https://www.cnblogs.com/iot-fan/p/13498088.html
注意事项
- wchisptool 对于hex文件处理方式:不连续的hex 填充0x00,而不是0xff,如果涉及到不连续的固件在自己实现的bootloader里进行校验,可能需要烧录时候用户自己进行hex转成bin文件烧录.
工程源码
扩展资料
实现自定义的BLE OTA
根据blog:CH579/CH578/CH577/CH57x应用与协议栈分离方式实现,在本bootloader中启动蓝牙协议栈,实现蓝牙传输,即可实现蓝牙的DFU.