你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | 基于STM32CubeIDE移植ClassB 4.0

[复制链接]
STMCU-管管 发布时间:2024-5-10 13:37
01 简介 ) u. p3 `7 c+ i  W( X* o
ST 推出了最新版本的 ClassB4.0 功能安全库,与之前版本相比,ClassB 4.0 主要有如下较大的变化。 1 e/ e0 h, F/ U6 i* d  S. }' ^
1)核心库不再提供源码,而是提供库文件,用户集成更加方便。
/ M! U5 D' U1 Q7 b2)启动自检与运行期自检统一接口,简化了用户函数调用。
8 F. @1 j+ v* w/ l8 P  x3)函数接口与 SIL 兼容,方便客户在 SIL 与 ClassB 共享代码。
& ?5 n+ H  X( h- d本文以 NUCLEO-G031K8 为参考板,在 STM32CubeIDE 编译器环境下,介绍如何一步步移植 ClassB 4.0,移植 ClassB 4.0,你需要具备 STM32 开发的基本知识,这些基本知识包含但不限于这些,如 STM32CubeMX 的使用,STM32CubeProgrammer 的使用,编译器 STM32CubeIDE 的使用,熟悉 STM32 MCU,熟悉 STM32 软件开发等。如 果对上述基本知识不了解,请在 STM32中文官方网站 https://www.stmcu.com.cn 获取相应培训资料。
, l) J# ^3 z$ {, Q
, l; C1 f9 l( P7 D
6 M2 I, V% P1 [) v
02环境搭建
& Z8 s' V' L8 o" |9 k/ l: C- n移植 ClassB 4.0 之前,用户需要安装必备的工具软件以及下载程序包。
% k% J0 _  e$ x* o9 \1)安装 STM32CubeMX,可从ST官方网站https://www.st.com/en/development-tools/stm32cubemx.html 免费下载安装,安装完成之后,运行 STM32CubeMX 可见下面界面。. B7 B0 {5 M% B% G5 v. r: Q1 J

STM32CubeMX 初始界面

STM32CubeMX 初始界面
▲ 图1. STM32CubeMX 初始界面
2)安装STM32CuebProgrammer,可从ST官方网站https://www.st.com/en/development-tools/stm32cubeprog.html 免费下载安装下, 安装完成之后,运行 STM32CubeProgrammer 可见下面界面。
2 f3 b4 l! C2 H. o8 J' n

STM32CubeProgrammer 初始界面

STM32CubeProgrammer 初始界面
▲ 图2. STM32CubeProgrammer 初始界面
3)安装STM32CubeIDE,可从ST官方网站 https://www.st.com/en/development-tools/stm32cubeide.html 免费下载安装,安装 完成之后,运行 STM32CubeIDE 可见下面界面。
, c; U5 S( r9 Z& l9 U, J

STM32CubeIDE 初始界面

STM32CubeIDE 初始界面
▲ 图3. STM32CubeIDE 初始界面
4)下载 X-CUBE-CLASSB 软件包,用户需要下载自己项目 MCU 型号对应的软件包, 可从ST官方网站上 https://www.st.com/en/embedded-software/x-cube-classb.html选择对应软件包免费下载。解压 X-CUBE-CLASSB 软件包,得到下图所示目录结构。 ; u- y2 R7 Y( D3 e1 g  y

X-CUBE-CLASSB 4.0 目录结构

X-CUBE-CLASSB 4.0 目录结构
▲ 图4. X-CUBE-CLASSB 4.0 目录结构
5)设置环境变量,因为编译过程中需要使用 STM32CubeProgrammer 工具下的 STM32_Programmer_CLI.exe 命令生成 CRC,所以需要在系统环境变量 Path 中加入 STM32_Programmer_CLI.exe 的路径。否则编译过程中会出现找不到命令的错误。
1 C$ u4 M* U" h% s/ C; z3 h

环境变量设置

环境变量设置
▲ 图5. 环境变量设置
2.1. 使用 STM32CubeMX 创建工程 8 w% [: }' q) |' H( j0 t& |
完成上述环境搭建之后,接下来就可以使用 STM32CubeMX 工具生成项目了,本案例中以 STM32G031 为例子,创建基于 NUCLEO-G031K8 的工程。
0 y3 W4 |& r. K& t5 o5 a使用 STM32CubeMX 创建工程的具体步骤这里不作详细描述,用户需要根据自己的应用使能和配置需要用到的外设,ClassB 的时钟检测需要使用定时器的捕获功能,为了确 保定时器的 HAL 驱动代码添加进工程项目,在工程配置中,使能定时器外设,否则生成 的工程需要手动拷贝定时器的 HAL 驱动代码,如下图所示。9 b" T2 T' C5 u9 M

STM32CubeMX 工程配置

STM32CubeMX 工程配置
▲ 图6. STM32CubeMX 工程配置
在工程管理界面,设置使用的IDE为CubeIDE,然后生成代码即可。如下图所示。
/ B3 V) E3 G1 p8 j' N3 ^7 B

STM32CubeMX 生成代码

STM32CubeMX 生成代码
▲ 图7. STM32CubeMX 生成代码
接着生成工程代码即可,同时拷贝 X-CUBE-CLASSB-G 0_4.0.0 目录下的 Middlewares 到 STM32CubeMX 生成的工程目中,最终的目录文件如下所示。
9 R/ ]" ]* e9 B4 \

工程目录

工程目录
▲ 图8. 工程目录
2.2. STM32CubeIDE 工程设置 4 c9 ^' V- q; d3 n/ T: v
双击 cubeide 工程文件.project,即可打开 STM32CubeIDE 的工程,拷贝过来的 Middlewares 自动导入到工程中,如下图所示。   B8 o& a9 ?/ n" ^- C' e; h, T# q, n

STM32CubeIDE 工程

STM32CubeIDE 工程
▲ 图9. STM32CubeIDE 工程
接下来需要设置工程需要包含 ClassB 软件包的头文件路径,源文件以及库文件,如下图所示。 " [3 ?: O  j" g  ]+ R

添加头文件路径和源文件

添加头文件路径和源文件
▲ 图10. 添加头文件路径和源文件

添加 ClassB 库文件

添加 ClassB 库文件
▲ 图11. 添加 ClassB 库文件
如果路径都添加正确,这时候是可以成功的编译工程的,如果编译有误,请检查上述步骤是否正确,尤其检查路径设置是否有误。
$ {8 f; o' e0 W5 D% V

编译成功结果

编译成功结果
▲ 图12. 编译成功结果
完成上述步骤之后,我们完成了基本的 ClassB 项目搭建,接下来根据自己的项目配置,更新链接脚本,添加代码调用 ClassB API 来实现测试功能。
5 K# o( W/ l2 H" s  ~  _
, {8 c- e: T+ K7 X! p  f! C+ U
0 g4 [0 H; t3 ]& _
2.3. STM32CubeIDE 工程代码编辑
4 ^/ ~9 k5 K+ N) g# m, @- ~6 i2.3.1. 链接脚本更改
. |* R/ r8 X+ w/ ^8 L# |& T; W打开工程目录下的链接脚本文件,本示例工程中的链接脚本文件名为 STM32G031K8TX_FLASH.ld,用文本编辑器打开文件,添加下图红色标记的语句,第一 个更新的地方是定义 RAM 测试的备份区,RAM 测试会用到。第二个更新的地方是定位 ROM 段的结束地址,在 Flash 测试中,会使用到该地址。
0 f3 A8 r  L. U9 M2 b; \

更新链接脚本

更新链接脚本
▲ 图13. 更新链接脚本
2.3.2. 实现 Flash 测试! }) G% f' N: B; k9 e. I) d
1)在项目文件中,找到文件 stl_user_param_template.c 文件,根据实际项目 MCU 型号,找到 STL_ROM_END_ADDR 宏定义,更新其值为对于 MCU 的 Flash 结束地址,在本示例工程中,STM32G031K8 Flash Size 为 64K,所以宏定义为 0x0800FFFFUL。
9 }3 j& u5 e6 V0 k: x$ s

更新 Flash Size 宏

更新 Flash Size 宏
▲ 图14. 更新 Flash Size 宏
2)实现调用 Flash 测试的代码,ClassB4.0 库与 Flash 测试相关的有三个数据结构以 及 5 个 API 函数,初始化三个数据结构变量以及调用对应的 API 函数即可完成 Flash 的测试,非常之简单,通过 Flash 测试配置的参数,可以设定 Flash 测试的范围以及每次函数调用测试的大小。示例工程中,给出了每次测试一个 Section 的参考函数以及一次性测试 所有 Flash 的参考函数,如下图所示。' a4 K  I6 b3 ]# r: j0 x

Flash 测试参考代码

Flash 测试参考代码
▲ 图15. Flash 测试参考代码
上述代码中,FLASH_SECTION_SIZE 固定为1024,TEST_ROM_START_ADDR 为 Flash 测试的起始地址,TEST_ROM_END_ADDR 为 ROM 的结束地址,由编译器自动计算,所以在链接脚本修改中,需要添加_edata_load 变量。3)计算 CRC 值,Flash 测试的基本原理是编译阶段计算 Flash 存储区每个逻辑 Section 的 CRC 值,存放在 CRC 区域,程序运行阶段,ClassB 库函数动态计算 CRC 的值与编译阶段计算的值进行比较,如果一致,则测试通过,否则测试不通过。所以在编译 阶段,需要添加生成 CRC 值的脚本。
9 Y3 b0 H) k/ H. d6 W$ f4 S

添加生成 CRC 脚本

添加生成 CRC 脚本
▲ 图16. 添加生成 CRC 脚本
两个命令分别如下。
8 p4 `8 h8 F! E& {, |" k1 w删除当前可执行文件命令。
' E  Z2 N* ~* L9 ~rm -f "${BuildArtifactFileBaseName}.elf"
3 }& \" [" U. _2 y7 Y6 A4 T插入 CRC 值命令。: R) {7 r. E' p& P& ?5 U
arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin" && arm-none-eabi-size "${BuildArtifactFileName}" && echo " \"STM32_Programmer_CLI.exe\" -sl \"${CWD}\\${BuildArtifactFileName}\" 0x8000000 0x08010000 0x400" > call_prg.bat && "${CWD}\call_prg.bat"
0 \/ r( F- Q; o4 S, n: }2 e上述命令需要注意的地方有两点,第一,确保系统安装了 STM32CubeProgrammer,同时确保在环境变量中添加了 STM32CubeProgrammer 的路径,否则会出错。第二,命令行中 STM32_Programmer_CLI.exe 后面带的参数 0x8000000 0x08010000 0x400 分别为 Flash 起始地址,Flash 结束地址,以及 Section 的大小,其中 Section 的大小固定为 0x400,Flash 结束地址需要根据实际项目 MCU 的 Flash 大小决定,本示例工程 STM32G031K8 的 Flash 大小为 64K,所以这里设置的值为 0x08010000。
0 y0 U( `0 q, c0 ~, a这样,Flash 测试的准备工作就完成了,如果之前步骤无误,编译代码可以正常通过。
) ]& M) C# X9 V, {, ~2.3.3. 实现 RAM 测试
6 Q4 W' @5 d$ q  o4 J2 u$ R" O- M1)ClassB4.0 库与 RAM 测试相关的有三个数据结构以及 5 个 API 函数,其中三个数 据结构与 Flash 测试用到的数据结构一样。API 函数调用也和 Flash 测试类似,非常之简 单,测试也分为单块测试和整个 RAM 区域测试。示例工程中,也给出了单块测试以及全 部测试的参考代码,如下图所示。$ r) N( @3 Y6 J( r1 C/ U" h# y

RAM 测试参考代码

RAM 测试参考代码
▲ 图17. RAM 测试参考代码
$ i% K- i, m5 c' i2 x

0 B. t' P5 Q+ P% F$ x' I上述代码中,RAM_SECTION_SIZE 固定为 238,TEST_RAM_START_ADDR 为为用户指定地址,通常为 RAM 起始地址偏移 32 字节的 RAM 备份区域,RAM 备份区域是用 于测试过程中备份被测试 RAM 的数据,避免测试过程中破坏 RAM 中的数据,TEST_RAM_END_ADDR 为 RAM 测试的结束地址,用户自己设定测试的范围,示例工程 中,设定了 8 个 RAM Section 的测试范围。( Y, E5 l& Y  T9 U% X6 W9 K
2.3.4. 实现 CPU 测试
! F1 [' R3 ]# t0 t2 @4 K1)ClassB4.0 库 CPU 的测试很简单,一共包含了三个函数,用户程序也无需配置参 数,启动时测试和运行时测试函数调用方法完全一致,如下图参考代码所示。
4 I( Z. Y9 W8 B" P/ T! Z1 y  q$ O+ H+ G

CPU 测试参考代码

CPU 测试参考代码
▲ 图18. CPU 测试参考代码
2.3.5. 调用模块测试
2 o, I( J0 e5 ?1 B2 {5 F1)在主函数中,实现 FailSafe_Handler 函数,该函数是在测试出错的时候调用,参考工程中,在 While 循环中闪烁 LED 灯给出出错指示,实际应用中,用户需要实际要求来 实现该函数,同时在 main 函数中依次调用上述模块函数。 + q, y# W7 _0 ^, s

调用模块测试参考代码

调用模块测试参考代码
▲ 图19. 调用模块测试参考代码

/ q. X2 d6 }+ H

4 x5 G# k6 _. Z. m03执行测试
: u% [+ e7 e4 r* j$ q8 h6 V安装上述步骤添加完代码之后,检测代码书写无误,即可编译工程,如果编译过程中 提示错误,需要检查代码书写是否有误。 - W2 r/ {) b- t3 v/ S% s5 j0 m

编译成功

编译成功
▲ 图20. 编译成功
下载程序到目标板 NUCLEO-G031K8 上运行,观察 LED 灯是否闪烁或者通过在线调 试可以证明程序成功执行。 ( k9 V7 i# X4 }3 m) n

& L+ `/ U1 |9 Z2 S/ v2 @
7 V* R% w$ u5 Q6 n, a, K7 J  u
04注意事项
9 ~* M) q7 ^) K, ?  M) g; C' f5 l! |ClassB 4.0 以库的形式发布之后,移植 ClassB 4.0 不再那么复杂,在移植过程中,注 意以下几点,就可以顺利的移植成功了。+ b9 E6 h5 E' q# O' u; I8 G$ D/ E
1)必要的工具必须安装,这些工具包括 STM32CubeMX, STM32CubeProgrammer,STM32CubeIDE 4 R6 a+ S- l3 K8 N# g
2)STM32CubeIDE 中相关路径需要设置正确,这些路径包括头文件路径,库文件路 径,源文件路径,库文件。 5 w# y5 V: V' K" p
3)链接脚本需要更改正确,否则会导致错误。
" w' T% `/ X/ M1 J* c4)插入 CRC 的脚本命令必须正确,否则 Flash 测试会失败。 * W- l# Y$ o$ V2 u( `- D% H: h
5)与 MCU RAM、Flash 大小相关的宏定义必须设置正确,否则也会失败。
0 i0 {4 z+ f- F9 E! Q8 C4 k4 \) A6 p* m, Z* g' m* [
9 z+ t8 U* r6 L: ?' G1 s0 K4 U) Y
05小结
& ^( A) R7 T2 m$ ?" M+ c" v本文一步步介绍了在 STM32CubeIDE 环境下移植 ClassB 4.0 的过程,供客户参考,在移植的过程中,同时阅读用户手册,移植就是非常简单的事情。7 M# i2 I9 }  y, Y. J4 D0 {- Z
( f1 Z0 b' |6 q7 n
赞 收藏 评论0 发布时间:2024-5-10 13:37

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版