测试日期:2023年11月28日
工具链:STM32CubeIDE++GCC
参考资料:micro_ros_stm32cubemx_utils
注:本文内容仅用于学习参考,不适用于生产环境。
1、准备工作
1.1、安装STM32CubeIDE和STM32CubeMX
1.2、准备mirco_ros 支持cortex-m4的静态库,生成方法可参考我的一篇博文,或者直接下载地址
1.3、下载 micro_ros_stm32cubemx_utils
2、移植过程
2.1、创建STM32CubeMX项目选择芯片为STM32F405RGT6
2.2、工程配置
2.2.1、填写工程名称的路径
2.2.2、Toolchain/IDE配置:STM32CubeIDE
2.3、基本配置
2.3.1、时钟配置,根据开发板配置时钟源为外部8MHZ,系统时钟168M。
2.3.2、开启SW调试功能
2.3.3、调整堆栈大小

2.4、配置外设
2.4.1、配置USART1 异步模式,波特率921600bps 8N1 用于printf输出
2.4.2、配置USART2 异步模式,波特率115200bps 8N1 使能DMA收发和全局中断 用于mirco_ros 通讯接口
2.4.3、根据开发板配置PD2和PA15为输出,对应LED3和LED2
2.4.4、配置TIM13定时1ms并开启更新中断,用于mirco_ros计时

2.5、生成代码,并使用CubeIDE打开工程

2.6、复制文件
2.6.1、复制extra_sources文件夹工作空间
复制micro_ros_stm32cubemx_utils\extra_sources文件夹到CubeIDE工作空间的Core文件夹。我们只使用USART2的DMA传输方式作为mirco_ros接口,因此需要禁用或者删除it_transport.c和usb_cdc_transport.c文件
custom_memory_manager.c文件在freertos上实现了内存分配,因为要改成裸机所以先禁用编译或者直接删除

extra_sources目录下文件说明:
(1)、microros_transports文件夹:与硬件相关的通讯接口实现,3个C文件分别提供了串口中断、串口DMA和USB虚拟串口传输案列,这里我们只用到串口DMA传输,即dma_transport.c
(2)、custom_memory_manager.c和microros_allocators.c 提供了microros的内寸分配接口实现
(3)、microros_time.c 提供了microros的时间相关接口实现
2.6.2、将静态库文件和头文件复制到工作空间
这里直接把M4lib文件夹直接复制到Core目录,然后禁用编译它们。这一步主要是方便后续引用,不一定要复制进来。

2.6.3、添加头文件路径
右键项目->Properties->C/C++Build->Setings->MCU GCC Compiler->include paths 点击右边的+图标选择工作空间下的/Core/M4lib/include 文件夹添加头文件路径。

2.6.4、添加静态库文件和路径
右键项目->Properties->C/C++Build->Setings->MCU GCC linker->Library search path(-L) 点击右边的+图标选择工作空间下的/Core/M4lib 文件夹添加库文件路径,在Libraries(-l) 下添加库文件名microros,注意库文件名在文件夹下为libmicroros.a,GCC连接器-l选项自动添加前面的lib字符和后缀名,因此只需要填写microros

2.7、修改文件
2.7.1、删除dma_transport.c文件中与freertos相关的无用到代码,然后在DMA接收完成中断回调中重新启动接收,否则程序运行一段时间后打印Error publishing (line xxx)\n。修改后内容如下
#include <uxr/client/transport.h>
#include <rmw_microxrcedds_c/config.h>
#include "main.h"
#include "usart.h"
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#ifdef RMW_UXRCE_TRANSPORT_CUSTOM
// --- micro-ROS Transports ---
#define UART_DMA_BUFFER_SIZE 2048
static uint8_t dma_buffer[UART_DMA_BUFFER_SIZE];
static size_t dma_head = 0, dma_tail = 0;
bool cubemx_transport_open(struct uxrCustomTransport * transport){
UART_HandleTypeDef * uart = (UART_HandleTypeDef*) transport->args;
HAL_UART_Receive_DMA(uart, dma_buffer, UART_DMA_BUFFER_SIZE);
return true;
}
bool cubemx_transport_close(struct uxrCustomTransport * transport){
UART_HandleTypeDef * uart = (UART_HandleTypeDef*) transport->args;
HAL_UART_DMAStop(uart);
return true;
}
size_t cubemx_transport_write(struct uxrCustomTransport* transport, uint8_t * buf, size_t len, uint8_t * err){
UART_HandleTypeDef * uart = (UART_HandleTypeDef*) transport->args;
HAL_StatusTypeDef ret;
if (uart->gState == HAL_UART_STATE_READY){
ret = HAL_UART_Transmit_DMA(uart, buf, len);
while (ret

本文详细介绍了如何在STM32F405RGT6开发板上使用STM32CubeIDE和GCC进行micro_ros移植,包括安装配置、移植过程、代码修改和测试等内容。
最低0.47元/天 解锁文章
662

被折叠的 条评论
为什么被折叠?



