ODrive开发 #1 ODrive固件开发指南[通俗易懂]

ODrive固件开发指南本指南适用于希望修改ODrive固件的开发人员。因此,它假定您了解诸如如何使用Git,什么是编译器之类的知识。如果这听起来很陌生,以下内容对您来说可能不适合。官方发行版在master分支上。但是,由于您是开发人员,因此建议您使用devel分支,因为它包含最新功能。该项目正在积极开发中,因此请确保检查更新日志以跟踪更新动态。文章目录ODrive固件开发指南需要的开…

大家好,又见面了,我是你们的朋友全栈君。

ODrive固件开发指南

本指南适用于希望修改ODrive固件的开发人员。
因此,它假定您了解诸如如何使用Git,什么是编译器之类的知识。如果这听起来很陌生,以下内容对您来说可能不适合。
官方发行版在master分支上。 但是,由于您是开发人员,因此建议您使用devel分支,因为它包含最新功能。
该项目正在积极开发中,因此请确保检查更新日志以跟踪更新动态。

需要的开发工具

推荐使用的ODrive开发工具为:

  • make: 用于调用 tup
  • Tup: 用于调用编译命令的构建系统
  • ARM GNU Compiler: 对于交叉编译代码
  • ARM GDB: 用于调试代码并在设备上逐步执行
  • OpenOCD: 用与使用STLink / v2编程器对ODrive进行烧录
  • Python3: 用于运行Python工具,并且安装 PyYAML,Jinja2 ,jsonschema 包

有关适用于您的操作系统的特定安装说明,请参见下文。
根据您要执行的操作,可能并不需要所有组件。
一切准备就绪后,您可以运行以下命令来验证安装是否正确:

$ arm-none-eabi-gcc --version
$ arm-none-eabi-gdb --version
$ openocd --version             # should be 0.10.0 or later
$ tup --version                 # should be 0.7.5 or later
$ python --version              # should be 3.7 or later

Linux (Ubuntu)

sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-embedded
sudo apt-get install openocd
sudo add-apt-repository ppa:jonathonf/tup && sudo apt-get update && sudo apt-get install tup

Arch Linux

sudo pacman -S arm-none-eabi-gcc arm-none-eabi-binutils
sudo pacman -S arm-none-eabi-gdb
sudo pacman -S tup

Mac

首先安装Homebrew. 然后您可以在命令终端中输入以下命令:

brew install armmbed/formulae/arm-none-eabi-gcc
brew cask install osxfuse && brew install tup
brew install openocd

Windows

注意: 确保这些程序不仅已安装,而且正确添加到您的环境变量PATH中。

本文档中的某些说明可能假定您正在使用bash命令提示符,例如Windows 10内置bash或Git bash。

  • ARM compiler
    • 注意 1: 安装后需要添加 ARM_GCC_ROOT 到您的环境变量,并设置值为您的安装路径 e.g. C:\Program Files (x86)\GNU Tools Arm Embedded\7 2018-q2-update。此变量将被 Visual Studio Code 所使用。
    • 注意 2: 8-2018-q4-major 版本在Windows下存在某些bug。请在Windos下使用 7-2018-q2-update版本。
  • Tup
  • GNU MCU Eclipse’s Windows Build Tools
  • OpenOCD.
  • ST-Link/V2 Drivers

配置编译参数

要自定义编译参数,请将文件Firmware/tup.config.default复制或重命名为Firmware/tup.config,然后在该文件中编辑参数:

CONFIG_BOARD_VERSION: 您正在使用的ODrive硬件版本。 可以是v3.1,v3.2,v3.3,v3.4-24V,v3.4-48V,v3.5-24V,v3.5-48V等。检查ODrive上的丝印以找出您使用的版本。 某些ODrive版本未指定电压:在这种情况下,您可以看一下电容器的值:120uF是48V ODrive,470uF是24V ODrive。

CONFIG_USB_PROTOCOL: 定义ODrive在USB接口上使用的协议。

  • native: ODrive原生通讯协议。ODrive以USB设备被系统识别。在macOS系统下有可能无法工作。
  • native-stream: 和原生通信协议类似,只不过ODrive被系统以UART连接对待。可以在macOS系统下正常工作。
  • none: 禁用 USB通讯。虽然插入设备后仍会被现实,但它将忽略所有指令。

注意: 第二个USB接口始终是一个串行端口。

CONFIG_UART_PROTOCOL: 定义ODrive在UART接口(GPIO1和GPIO2)上应使用哪种协议。 请注意,仅ODrive v3.3和更高版本支持UART。

  • native: ODrive原生通信协议。如果要使用UART将ODrive连接到PC,并且想使用python工具来控制和设置ODrive,请使用此功能。
  • ascii: ASCII 格式通信协议。如果您想使用Arduino控制ODrive,请使用此选项。因为 ODrive Arduino库尚不支持ODrive原生通信协议。
  • none: 禁用UART。

构建并烧录固件

  1. Firmware 目录下运行 make
  2. 通过USB连接ODrive并打开电源。
  3. 使用 odrivetool dfu命令烧录固件。

使用STLink/v2 烧录固件

  • 将烧录器连接到 J2 端子上的GND, SWD, SWC。 注意: 应当首先连接GND
  • 您仅需通过VCC(3.3v)5V、**主电源连接(DC总线)**其中一项对ODrive供电。 USB端口(J1)是无法为ODrive供电的。
  • Firmware 目录下运行 make flash
    注意: 如果出现错误类似 can't find target interface/stlink-v2.cfg ,您需要设置一个名为OPENOCD_SCRIPTS的环境变量,变量值设置为 openocd 脚本所在目录地址。

如果烧录成功,您可以使用 odrivetool和ODrive通信了。

自动化测试

tools/run_tests.py 这个测试脚本可以自动测试固件的某些特性还能够对ODrive进行老化测试。某些测试项目只需要一个电机加上编码器就可以,还有一些测试需要特定的测试台才可以。要进行任何测试都需要一个YAML文件,在YAML中编写测试参数,例如tools/test-rig-parallel.yaml。其中YAML中烧录器的序列号可以通过运行Firmware/find_programmer.sh脚本来得到(确保烧录器中的固件为STM的最新固件)。
测试脚本会使ODrive以高电流和高转速运行,因此,如果测试台不合适或者不够坚固(或电机空载),则可能会损坏机器。
用法示例:./run_tests.py --test-rig-yaml ../tools/test-rig-parallel.yaml

代码调试

如果您使用的是VSCode,请确保您具有Cortex Debug扩展插件,OpenOCD和STLink。 您可以通过烧录代码来验证OpenOCD和STLink是否正常工作。 打开ODrive_Workspace.code-workspace文件,然后启动调试(F5)。 VSCode将从工作空间中获取正确的设置并自动连接ODrive。 可以在VSCode中以图形方式添加断点。

  • 运行 make gdb。 这将重置并在程序启动并暂停。 现在,您可以设置断点并运行程序。 如果您知道如何使用gdb,那就再好不过了。

配置集成开发环境

开发ODrive代码,不需要IDE,但是建议使用开源IDE VSCode。 也可以使用Eclipse。 如果您想使用IDE,请参阅相应的配置文档:

STM32CubeMX

该项目使用 STM32CubeMX 来生成启动代码和外设配置代码。您可以从这里下载CubeMX。所有 CubeMX 相关的文件都在 Firmware/Board/v3文件夹下。

维护修改后生成的代码

STM32CubeMX 生成代码时,会剔除它们提供的某些特殊部分之外的所有内容。 特殊部分标记为“ USER CODE BEGIN” …“ USER CODE END”。
曾经,我们试图确保对生成的代码所做的所有编辑仅会出现在这些部分中,从某些代码结构就可以看出来。
但是随着时间的流逝,我们意识到这将很难实现,因此,当需要重新生成代码时,我们利用git来进行管理。我们使用两个特殊的git分支来实现。它们是 STM32CubeMX-startSTM32CubeMX-end
下例显示了如何使用它们。
注意: 由于使用git rebase方式,所有更改生成代码的开发都应直接在STM32CubeMX-end上进行,而不是基于devel进行,然后按照下面的步骤4进行操作,以将其转移到新的功能分支中。 如果您对基于devel生成的代码进行了一些更改,则只需挑选那些更改到STM32CubeMX-end中即可。

1. 准备更改

  • 我们对STM32CubeMX配置进行的所有更改,并重新生成代码都应该在STM32CubeMX-start分支上。所以我们使用下面的命令切换到STM32CubeMX-start分支上。
    • git checkout STM32CubeMX-start
  • 运行stm32cubeMX 然后载入Firmware/Board/v3/Odrive.ioc 工程文件。
    • 如果载入过程中询问您是否要迁移到新版本,请选择下载旧的固件包(除非您要使用最新的库)。
  • 在不更改任何设置的情况下,点击 Project -> Generate code
  • 您可能需要让它下载一些驱动程序等。
  • STM32CubeMX现在可能具有某些库已经更新,因此即使我们未更改任何设置,生成的代码也可能有所更改。 我们需要检查一切是否仍在工作,并检查更改:
  • git config --local core.autocrlf input 这会告诉git的所有文件应与LF结尾(CubeMX产生CRLF结尾)进行检查。
  • git diff 忽略一堆行结束警告。
  • 如果您觉得可以: 您现在可以检查CubeMX是否引入了一些愚蠢的方法。 如果有任何更改,并且看起来可以接受,我们应该提交它们:
    • git commit -am "Run STM32CubeMX v1.21" 替换为实际版本的CubeMX。

2. 更改STM32CubeMX配置

  • 完成上述步骤后,请确保工作目录是干净的:
    • git status 应该会显示 “nothing to commit, working tree clean”
  • 使用STM32CubeMX进行配置,保存,然后重新生成代码 (Project -> Generate code)。
  • git diff 检查引入的更改是否符合预期
  • 如果一切正常,则可以提交更改。

3. 将重新配置生成的代码rebase到STM32CubeMX-end分支

  • git checkout STM32CubeMX-end
  • git rebase STM32CubeMX-start
  • 确保完成rebase,并修复可能出现的任何冲突。

4. 将新的STM32CubeMX代码合并到功能分支中

只需将STM32CubeMX-end分支合并到新功能分支中。

  • git checkout your-feature
  • git merge STM32CubeMX-end

5. 将您的新特性分支提交到原作者

  • 为您的新功能生成正常的pull,request。
  • 确保已将提交STM32CubeMX-startSTM32CubeMX-end分支,到您的分支。
  • 并在提交记录中说明需要更新STM32CubeMX分支。

故障排除

使用 STLink/v2烧录提示LIBUSB_ERROR_IO

问题描述: 当我使用STLink对ODrive进行烧录时提示如下错误:

Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Error: libusb_open() failed with LIBUSB_ERROR_IO
Error: open failed
in procedure 'init' 
in procedure 'ocd_bouncer'

解决方案:
这种情况时有发生。可以按照下列步骤来操作:

  1. 从电脑拔出 STLink 和 ODrive
  2. 断开 ODrive 的供电
  3. 将STLink插入电脑
  4. ODrive上电
  5. 再次尝试执行 make flash

发布

我们使用GitHub Releases发布固件。

  1. 查看changelog以了解新固件的新特性。
  2. 将其他特性分支合并到master支。
  3. 将(轻量级)标签推送到master分支。 请遵循现有的命名约定。
  4. 将python工具推送到PyPI。
  5. 在GitHub上发布该版本以添加标题和描述(从changelog复制并粘贴)。

其他代码维护说明

cortex M4F处理器具有硬件单精度浮点单元。 但是,双精度运算并没有被加速,因此应该避免。 以下正则表达式会清除双精度运算:
find: ([-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?)([^f0-9e])
replace: \1f\2

代码提交须知

一般而言,该项目使用 Google C++ Style Guide,不同之处在于默认指示符为4个空格,并且对80个字符的限制不是非常严格的。

如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125781.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 树的叶子结点与完全二叉树结点计算方法[通俗易懂]

    树的叶子结点与完全二叉树结点计算方法[通俗易懂]一:完全二叉树中结点问题分析:设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2侧有n0+n1+n2=n(1)对于二叉树有:n0=n2+1(2)由(1)(…

  • itextpdf设置页码_word页码相同怎么改

    itextpdf设置页码_word页码相同怎么改项目需要样式比较复杂,刚开始因为时间比较紧所以采用了Itextpdf插件代码生成pdf,实话说过程十分繁琐,因为pdf文件样式比较多,表格也比较多,各种的表格,还有就是页眉页脚页码都要自己找页面位置坐标但是又不能像html那样方便更改查看样式,只能改一点导出来看看合适不,然后再改再导出来看。私下调研了很多,现在罗列一下我所用到的一些样式处理,希望可以帮助需要做这个功能的朋友少踩坑,少尝试,直接出完美pdf报告。封面首页封面右上角那个图片可以换成logo,我做的大概是这样的一个样子,上代码/

  • flash8中文版从入门到精通_重发:6月23日福利丨PROE教学视频零基础入门到精通实用视频教程自学全套…「建议收藏」

    flash8中文版从入门到精通_重发:6月23日福利丨PROE教学视频零基础入门到精通实用视频教程自学全套…「建议收藏」点击上方蓝色字关注我们!小伙伴们,大家好,今天来给小伙伴们分享我们的新一期的视频教程,本期的视频教程我们主要分享的是PROE的自学视频,什么是PROE呢?下面我们进入今天的主题吧什么是PROE?proe是美国PTC公司旗下的产品baiPro/Engineer软件的简称。duPro/E(Pro/Engineer操作软件)是美国参数技术zhi公司(ParametricTechnology…

  • VS中添加lib与dll

    VS中添加lib与dll参考与拓展阅读:https://blog.csdn.net/u012043391/article/details/54972127lib:1.附加包含目录—添加工程的头文件目录:项目->属性->配置属性->C/C++->常规->附加包含目录:加上头文件的存放目录;2.附加库目录—添加文件引用的lib静态库路径:项目->属…

  • 高性能集群软件keepalived

    高性能集群软件keepalived高性能集群软件keepalived背景网络的飞速发展,给网络带宽和服务器性能带来了巨大的挑战,基于互联网的应用系统越来越多地瓶颈出现在服务器端,这就对服务器提出了更高的要求,来保证服务的持续性。

  • 约瑟夫环问题递归解法的一点理解

    约瑟夫环问题递归解法的一点理解约瑟夫环递归解法代码的一点理解。约瑟夫生者死者游戏约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载,加上风浪大作,危险万分。因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号