iot-fan

联系: iotfan123#163.com
注意:
1,本博客之内容来源于网上收集以及相关技术人员提供,如果有侵犯到您的权益,请电邮我沟通;
2,本博客之内容乃分享,交流,学习,研究之目的,作者不对内容的真实性,有效性,及时性负责,也不对因本博客的任何内容导致的任何后果负责;
3,本博客之内容禁止转发到CSDN网站,转到别的网站请保留出处.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文目的

  • 本文将记录如何在沁恒的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工具进行烧录即可

注意事项

  • wchisptool 对于hex文件处理方式:不连续的hex 填充0x00,而不是0xff,如果涉及到不连续的固件在自己实现的bootloader里进行校验,可能需要烧录时候用户自己进行hex转成bin文件烧录.

工程源码

https://gitee.com/iot-fan/iot-fan_at_cnblogs/tree/master/CH577_CH578_CH579/AN/CH577_578_579_user_bootloader_and_app

扩展资料

实现自定义的BLE OTA

根据blog:CH579/CH578/CH577/CH57x应用与协议栈分离方式实现,在本bootloader中启动蓝牙协议栈,实现蓝牙传输,即可实现蓝牙的DFU.

posted on 2021-07-09 11:13  iot-fan  阅读(975)  评论(0编辑  收藏  举报