项目源地址:https://github.com/cloidnerux/hoverboard-firmware-hack


翻译自诉:

悬浮板固件黑客

此存储库是 Niklas Fauths Hoverboard Hack 固件的一个分支,适用于一些带有 AT32F403RCT6 控制器的较新主板。为了保持代码大部分兼容,HAL 库进行了调整以适应 AT32 命名方案和寄存器。这是可能的,因为 AT32F403 是与旧版和其他 Hoverboard 主板上使用的 STM32F103 大部分兼容的设备。


构建说明

该代码在Windows下使用GNU arm-none-eabi-gcc 5.4.1编译,应该可以与其他版本的arm-gcc编译。

makefile 支持 STM32 和 AT32 这两种控制器。通过 makefile 的附加命令来选择控制器

make AT32

或者

make STM32

默认为 AT32。 makefile 在构建目录中创建一个文件来检测平台更改并清理所有必要的文件。


硬件

獭

AT32 板的主要区别是使用专用栅极驱动器(IR2108 克隆)并具有较少的电容器。此外,每个电机不再有电流检测电阻,但在一个 GPIO 引脚上有一些过流触发器。最后,连接器与其他版本的悬浮滑板控制器略有不同。

多年来,这些主板发生了很多小变化,以使其更便宜或实现某些功能。您的主板可能与此处显示的主板不完全相同。

主板的逆向工程原理图可以在这里找到: http://vocke.tv/lib/exe/fetch.php ?media=20150722_hoverboard_sch.pdf


闪烁

要构建固件,只需输入“make”。确保您已在 Makefile 中指定了 gcc-arm-none-eabi 二进制位置(“PREFIX = ...”)(版本 7 有效,有一个版本无效!)(如果 linux 存储库中的 ons 不有效)工作,使用官方版本:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)。 STM32 的右侧有一个带有 GND、3V3、SWDIO 和 SWCLK 的调试头。将 GND、SWDIO 和 SWCLK 连接到 SWD 编程器,就像许多 STM 开发板上的 ST-Link 一样。

请勿使用编程器的 3.3V 电源为主板供电!这已经杀死了多个主板。

确保在刷新固件时按住电源按钮或将跳线连接到电源按钮引脚,因为在刷新期间 STM 可能会释放电源闩锁并自行关闭。闪烁时必须连接电池 > 36V。

我使用 SWD 连接器将我的 AT32 与 Segger J-Link mini 进行了闪存连接。

由于无法通过 SWD 直接访问闪存,因此必须使用闪存加载程序。适当的闪存加载程序取自 Keil uVision 支持包,采用 CMSIS Pack 格式。使用 Segger OpenLoader 功能,您可以添加自己对 AT32F403 的支持。为此,将以下代码添加到您的<Segger Installation Dir>\JLinkDevices.xml

<Device>
	<ChipInfo Vendor="Artery" Name="AT32F403RCT6" WorkRAMAddr="0x20000000" WorkRAMSize="0x38000" Core="JLINK_CORE_CORTEX_M4" />
	<FlashBankInfo Name="Internal Flash Bank 1" BaseAddr="0x08000000" MaxSize="0x80000" Loader="Devices/AT32F403_1024.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" />
</Device>

并将“AT32F403_1024.FLM”从文件夹flash复制到<Segger Installation Dir>\Devices

使用 ST-Link 进行刷新需要对 OpenOCD 进行一些修补才能检测处理器,如此处所述bipropellant/bipropellant-hoverboard-firmware#67(评论)

之后应该可以使用 STM32 的 flash 命令进行刷新:要刷新 STM32,请使用 ST-Flash 实用程序 ( https://github.com/texane/stlink )。

如果您以前从未刷新过主板,则 STM 可能已锁定。要解锁闪存,请使用以下 OpenOCD 命令:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x unlock 0"

如果这不起作用:

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c "mww 0x40022010 0x220" -c "mww 0x40022010 0x260" -c "sleep 100" -c "mww 0x40022010 0x230" -c "mwh 0x1ffff800 0x5AA5" -c "sleep 1000" -c "mww 0x40022010 0x2220" -c "sleep 100" -c "mdw 0x40022010" -c "mdw 0x4002201c" -c "mdw 0x1ffff800" -c targets -c "halt" -c "stm32f1x unlock 0"
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c targets -c "halt" -c "stm32f1x unlock 0"

或者使用 Windows ST-Link 实用程序。

然后你可以简单地刷新固件:

st-flash --reset write build/hover.bin 0x8000000

故障排除

首先,检查电源是否已连接,并且闪烁时电压>36V。如果该板在空闲时消耗超过 100mA 的电流,则它可能已损坏。

如果电机执行某些操作,但旋转不平稳、安静,请尝试使用替代相位映射。通常,颜色正确的映射(蓝色到蓝色、绿色到绿色、黄色到黄色)效果很好。但是,某些悬浮滑板的布局与其他悬浮滑板不同,这可能是您的电机不旋转的原因。

双节棍不起作用:使用两种双节棍中正确的一种。使用 i2c 上拉电阻。

Nunchuck 或 PPM 工作不良:i2c 总线和 PPM 信号对电机控制器的 emv 失真非常敏感。你跑得越快,它们就越强大。保持电缆短、使用屏蔽电缆、使用铁氧体、稳定双节棍或恢复器中的电压、添加 i2c 上拉电阻。许多错误会导致非常高的加速度,从而触发电池内的保护板关闭所有功能。

最可靠的输入方法是使用 ADC 和电位器。即使在 1m 非屏蔽电缆上也能正常工作。将 ADC 输入和接地之间的约 100k 欧姆电阻直接焊接在主板上。使用 Potis 作为 3.3V 的上拉电阻。


例子

查看 Inc 目录中的 config.h。您可以在此处配置固件以匹配您的项目。目前支持:Wii Nunchuck、模拟电位计和来自 RC 遥控器的 PPM-Sum 信号。通过 UART 进行控制的一个很好的例子,例如。来自 Arduino 或 raspberryPi,可以在这里找到: https://github.com/phail/hoverboard-firmware-hack

如果您需要诸如增强按钮之类的附加功能,请查看 main.c 中的 while(1) 循环

附加硬件