Skip to main content

STM32CubeMX

note

由于目前没有找到一种优雅的方法来获取芯片对应 HAL 库的头文件具体叫什么名字,所以目前 librm 中采用了通过HAL库里的宏定义来适配不同的 STM32 芯片的方式。

目前 librm 里有以下芯片的适配:

  • STM32F407xx
  • STM32H723xx
  • STM32L412xx
  • STM32F427xx

如果你需要在其他芯片上使用 librm,只需要在 librm/src/hal/stm32/hal.h 中按照已有的格式添加一个条目即可。

配置编译环境

librm 只支持在 CubeMX 生成的 CMake 工程中编译使用。 如果你使用 Keil、IAR 等其他 IDE 开发 STM32,则不能使用 librm。

如果不熟悉配置过程,请参考我们录制的环境配置教程:

note

仅 Windows,Linux 和 macOS 后续更新

生成代码

在 CubeMX 的 Project Settings 中,选择生成 CMake项目:

在 Project Manager -> Advanced Settings 页面右侧启用 CAN、SPI、I2C、UART、USART 的 Register Callback 功能:

最后点击 Generate Code 按钮生成代码即可。

下载 librm

从 Github 上 clone librm:

git clone --recursive https://github.com/XDU-IRobot/librm.git
warning

我们在开发时大量使用了 git submodule 来存储第三方库,在 Clone 时,一定一定记得要加 --recursive 参数!

另外,也不要直接下载 zip 包,因为 zip 包里没有 submodule 的内容。

clone 后会得到一个名为 librm 的文件夹,把它移到刚刚生成的项目目录下。

配置 CMakeLists.txt

生成代码后,工程根目录中会出现一个内容类似以下的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.22)

#
# This file is generated only once,
# and is not re-generated if converter is called multiple times.
#
# User is free to modify the file as much as necessary
#

# Setup compiler settings
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)


### ...


# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
stm32cubemx

# Add user defined libraries
)

找到文件中的这一行:

add_subdirectory(cmake/stm32cubemx)

在这一行的下一行,添加:

add_subdirectory(librm)

然后,再找到这一块代码:

# Add linked libraries
target_link_libraries(${CMAKE_PROJECT_NAME}
stm32cubemx

# Add user defined libraries
)

# Add user defined libraries 之后另起一行,添加rm

HAL 时基配置

librm 内部补充了一个基于 SysTick 或 TIM 的 gettimeofday 实现来提供亚毫秒级的时间基准。该函数的精度取决于 CubeMX 中设置的 Timebase Source:

若这里设置为 SysTick,则什么都不用配置,放心使用即可;

若你把 Timebase Source 改为了某个 TIM,则务必按照下面的说明进行配置,否则系统时钟将退化为毫秒级精度,导致 librm 的一些时间相关功能出现异常。

通过编译宏告诉 librm 使用哪个定时器作为 Timebase Source:

# 例如,在 CubeMX 中设置了 TIM7 作为 Timebase Source,则添加以下行
add_definitions(-DLIBRM_STM32_TIMEBASE_SOURCE=TIM7)
note

librm 通过读取该 TIM 的计数值来实现微秒级的 gettimeofday()。CubeMX 在生成 HAL Tick 时基代码时会自动将对应 TIM 配置为:递增计数、计数频率 1 MHz(每 count = 1 µs)、ARR = 999(每 1 ms 溢出一次),因此只要保持 LIBRM_STM32_TIMEBASE_SOURCE 与 CubeMX 中的 Timebase Source 设置一致即可,无需额外配置定时器。

开始使用

之后,在你的项目代码里 #include <librm.hpp> 即可开始使用 librm。