Maple arduino bootloader 编译及修改

最近一个项目使用一块 stm32的IO板,于是便一直用去年自己做的一块兼容maple arduino 的IO板,只是项目进行了一半IO板忽然坏掉了, 没办法只能换了STM32,由于当初做板的时候IO定义和官方的不一致,因此只能重新编译bootloader,而原来编译的环境及代码早就丢的无影无踪了,于是打算重新编译,只是高估了自己的记忆力,编译环境都不记得怎么搭建的了,而官方的是基于linux的,自己则用的win7,还好以前留了些简单文字,浪费近两天的时间才把一切恢复原状,于是充分吸取教训,特记录如下:

1 Maple bootloader 编译环境搭建

安装MinGW 下载地址:http://sourceforge.net/projects/mingw/files/ .下载后,直接安装在C盘即可。即C:/MinGW
安装Msys  下载地址http://sourceforge.net/projects/mingw/files/ 。双击安装,默认地址是C:/msys。 我使用默认安装。安装完成后,会自动运行以个后处理文件, 询问是否安装有MinGW 选择上面GW的安装地址, 一路回车下去,及安装完成。
安装sourcery G++ Lite  地址是:http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite  点的EABI 的下载链接下载安装位置任意。其中如果已经下载maple ide 可以不用下在sourcery++ lite 直接将maple 安装目录中的arm-none-eabi 地址填入Msys 的fstab即可。 我在使用时 将maple/hardware/tool/arm 下的arm目录copy 到msys 目录下然后在C:\msys\1.0\etc 的fstab中写入C:/msys/1.0/arm/bin 然后保存重启Msys让环境变量生效。 编译环境即搭建完成可以用来编译maple bootloader 或者是libmaple。

2 Maple bootloader 修改及编译

由于我的IO 板类似官方的maple native, 因此将https://github.com/leaflabs/maple-bootloader 的maple native boot分支的代码下载至本地。
cd  maple-bootloader-native-boot
make
ls –lh build/maple_boot.bin
即可生成bootloader文件。由于我的IO板和maplenative 的IO定义差异,还需要修改代码 才能工作。具体差异为 LED PIN 官方版本采用的是PC15, 而我的版本采用的是PD3,修改代码如下:

* On the Native, LED is PC15 */  //change to PD3
#define LED_BANK         GPIOD           //
#define LED              3                 //
#define LED_BANK_CR      GPIO_CRL(LED_BANK)//
#define LED_CR_MASK      0xFFFF0FFF         //
#define LED_CR_OUTPUT    0x00001000         //
#define RCC_APB2ENR_LED  0x00000020 /* enable PD */
同样修改But pin, maple native 采用的是PG15, 我们修改为PC7.
/* On the Native, BUT is PG15 */       //Change to PC7
#define BUTTON_BANK      GPIOC
#define BUTTON           7
#define BUT_BANK_CR      GPIO_CRL(BUTTON_BANK)
#define BUT_CR_MASK      0x0FFFFFFF
#define BUT_CR_OUTPUT    0x40000000
#define RCC_APB2ENR_BUT  0x00000010 /* enable PG */

这两处修改均在config.h 中,另外由于我的板子usb_disc 也由原来的PB8 更改为PB6, 也要相应的修改 ,在文件USB.h 中
/
* USB Disc Pin Setup.  On the Native, USB DISC is PB8 */
#define USB_DISC_BANK         GPIOE           //PB
#define USB_DISC              6               //8
#define USB_DISC_CR           GPIO_CRL(USB_DISC_BANK)    //PE6
#define USB_DISC_CR_MASK      0xF0FFFFFF       //PE6
#define USB_DISC_CR_OUTPUT_PP 0x01000000       //PE6
#define RCC_APB2ENR_USB       0x00000040      // for PE is bit 6 and PB is bit 3
#define RCC_APB1ENR_USB_CLK   0x00800000

该处修改中我将原来的OD输出更改为PP输出。原因是USB部分电路略有差异。重新编译即可生成相应的bootloader。

问题:1)bootloader 烧录后,可更新程序,但是,驱动不会自动切换到串口驱动。原因 libmaple 中的USB_DISC 没有修改,跳入主程序后USB的驱动不会重新加载,相应的将Core 中的USB_DISC 同样修改为PE6即可
2)烧录bootloader 后第一次烧录正确,在升级时总失败。查看PC驱动挂载为串口驱动。没有自动变为libusb。 原因复位后, DISC复位时间太短。导致系统不能重新加载驱动。解决方法:在usb.c的setupUSB 下述位置增加延时:下面的斜体部分:

setPin (USB_DISC_BANK,USB_DISC);
int delay=100;
while(delay—);
/* turn on the USB clock *'/
pRCC->APB1ENR |= RCC_APB1ENR_USB_CLK;
/* initialize the usb application */
resetPin (USB_DISC_BANK,USB_DISC);  /* present ourselves to the host */
重新编译烧录,一切工作正常。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.