文章目录
前言
一、芯片程序区规划和流程
1、flash区规划
2、两区运行流程
3、bootLoader代码体现
4、electronbot代码体现:
二、bootLoader代码设计
1.下载程序步骤
2.通讯协议格式
三、libusb开发及需要注意的事情
1、bootLoader复合设备
2、electronbot复合设备
3、注意的事情
四、成功演示
总结
说到electronbot,不得不提及稚晖君,本人一直以来也想做一个能动,有声音,有显示,能遥控等功能的玩具,投入成本和懒散一直搁浅,看了稚晖君electronbot后,感觉是入手不错的选择,模具和结构也不用考虑了,同时被他这种全栈式开发精神所打动!
看了该视频演示,第一个想法就是小人装配好之后,如果有新的固件更新,再打开就显得麻烦,所以借用usb通道进行固件更新显得很必要。
boot和electronbot两个区在flash中划分如下图所示:
STM32F405RGTx_FLASH.ld 里修改:
跳转应用区代码判断:
startup_stm32f405xx.s里
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();
}
}
STM32F405RGTx_FLASH.ld 里修改:
makefile里 增加宏定义:
system_stm32f4xx.c里修改 VECT_TAB_OFFSET 为 0x8000
应用区代码标志 startup_stm32f405xx.s里 在程序收到pc上位机通知下载程序时,改写该地址的值后,再复位,即可进入bootLoader代码主流程。
至此,框架方面的事宜已经完成。
框图如下:
usb通信数据包为了兼容electronbot代码,在收发缓存机制保持一致,格式如下:
bootLoader复合设备为CDC+WINUSB 接口有三个,CDC占了两个,winusb占了一个
所以electronbot native interface 索引为2
第一次枚举后,需要用zadig-2.7.exe 软件替换驱动,才能与上位机libusb开发进行通讯
electronbot复合设备为MSC+WINUSB 接口有两个,MSC占了一个,winusb占了一个
所以electronbot native interface 索引为1
第一次枚举后,需要用zadig-2.7.exe 软件替换驱动,才能与上位机libusb开发进行通讯
由于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