基于electronbot作品bootLoader设计

文章目录

前言

一、芯片程序区规划和流程

1、flash区规划

 2、两区运行流程

3、bootLoader代码体现 

 4、electronbot代码体现:

二、bootLoader代码设计

1.下载程序步骤

2.通讯协议格式

 三、libusb开发及需要注意的事情

1、bootLoader复合设备

 2、electronbot复合设备

3、注意的事情

四、成功演示

总结


基于electronbot作品bootLoader设计_第1张图片


前言

说到electronbot,不得不提及稚晖君,本人一直以来也想做一个能动,有声音,有显示,能遥控等功能的玩具,投入成本和懒散一直搁浅,看了稚晖君electronbot后,感觉是入手不错的选择,模具和结构也不用考虑了,同时被他这种全栈式开发精神所打动!

看了该视频演示,第一个想法就是小人装配好之后,如果有新的固件更新,再打开就显得麻烦,所以借用usb通道进行固件更新显得很必要。


一、芯片程序区规划和流程

1、flash区规划

boot和electronbot两个区在flash中划分如下图所示:

基于electronbot作品bootLoader设计_第2张图片

 2、两区运行流程

基于electronbot作品bootLoader设计_第3张图片

3、bootLoader代码体现 

STM32F405RGTx_FLASH.ld 里修改:

基于electronbot作品bootLoader设计_第4张图片

跳转应用区代码判断:

startup_stm32f405xx.s里

  基于electronbot作品bootLoader设计_第5张图片 

void early_start_checks(void) {
  uint32_t _reboot_cookie;
  _reboot_cookie=*(uint32_t *)0x8008188;
  if(_reboot_cookie == 0xcafebeef) 
  {
  //   __set_MSP((uintptr_t)&_estack);  //没有ucos 不需要此行代码
    // printf("tttt begin...\r\n");
    __set_MSP(*(uint32_t *)0x8008000);
    void (*electronbotApp)(void) = (void (*)(void))(*((uint32_t *)0x8008004));
    electronbotApp();
 
  } 
} 

 4、electronbot代码体现:

 STM32F405RGTx_FLASH.ld 里修改:

基于electronbot作品bootLoader设计_第6张图片

makefile里 增加宏定义:

基于electronbot作品bootLoader设计_第7张图片

system_stm32f4xx.c里修改 VECT_TAB_OFFSET 为 0x8000

基于electronbot作品bootLoader设计_第8张图片

 应用区代码标志 startup_stm32f405xx.s里 在程序收到pc上位机通知下载程序时,改写该地址的值后,再复位,即可进入bootLoader代码主流程。

基于electronbot作品bootLoader设计_第9张图片

至此,框架方面的事宜已经完成。 

二、bootLoader代码设计

1.下载程序步骤

框图如下:

基于electronbot作品bootLoader设计_第10张图片

2.通讯协议格式

usb通信数据包为了兼容electronbot代码,在收发缓存机制保持一致,格式如下:

 基于electronbot作品bootLoader设计_第11张图片

 三、libusb开发及需要注意的事情

1、bootLoader复合设备

bootLoader复合设备为CDC+WINUSB  接口有三个,CDC占了两个,winusb占了一个

所以electronbot native interface 索引为2

基于electronbot作品bootLoader设计_第12张图片

第一次枚举后,需要用zadig-2.7.exe 软件替换驱动,才能与上位机libusb开发进行通讯

基于electronbot作品bootLoader设计_第13张图片

 2、electronbot复合设备

 electronbot复合设备为MSC+WINUSB  接口有两个,MSC占了一个,winusb占了一个

所以electronbot native interface 索引为1

基于electronbot作品bootLoader设计_第14张图片

 第一次枚举后,需要用zadig-2.7.exe 软件替换驱动,才能与上位机libusb开发进行通讯

基于electronbot作品bootLoader设计_第15张图片

3、注意的事情

由于boot区与electronbot区枚举的复合设备不相同,防止电脑识别冲突,故采用了不同的vid 和pid

所以在两区进行跳转时,pc端上位机需要重新进行连接,该过程中要作好资源回收和重建。

四、成功演示

electronbot _bootLoader演示

总结

整个过程还是比较顺利的,需要注意的就是pc端重连策略和延时处理上,以及两区跳转时遇到一个问题就是electronbot区进行jump bootloader时没有成功,可能与freertos有关系,没有进行深究,用了NVIC_SystemReset() 替代解决了。

整个代码均已上传到github:https://github.com/wenyezhong/electronbot

branch :  electronbot_bootLoader_design_branch

测试代码:
boot代码:2.Firmware/bootLoader(HS)
应用代码:2.Firmware/electronbot_testBootLoader
上位机 :  pc

你可能感兴趣的:(stm32,electronbot,bootLoader,python,gcc)