STM32CubeIDE

01、前言

某客户在使用 TouchGFX Designer 4.22 创建 TouchGFX GUI 应用时,使用 STM32U599 开发某款 GUI 产品,用 STM32CubeIDE 作为 IDE 发现无法下载成功,每下载到 93% 时就停滞并且报错。然而,如果选择 IAR 作为 IDE 则可以成功下载和仿真。客户表示当前使用的 STM32CubeIDE 已经是最新版本,同时也尝试过使用更老的版本或创建其 他的 demo 应用均是同样的结果。

02、现场调研与问题复现

经现场询问,客户板子外扩了 NorFlash,怀疑可能是 Flash loader 或 NorFlash 硬件存在问题。首先通过 OSPI 裸机程序对 NorFlash 进行读写访问均正常,排除硬件故障。进一步询问客户表示 NorFlash 硬件采用了与 STM32U599J_DK 一样的接法。因此,采用 STM32U599J_DK 板子的 Flash loader 肯定是可以的,现场使用 STM32Cubeprogrammer 选择 STM32U599J_DK 板的 flashloader,对客户板子外部 NorFlash 进行读写操作均能操 作成功,说明 NorFlash 确实与 STM32U599J_DK 接法一样。

STM32CubeIDE 下载错误提示如下图所示:

1.png

2.png

03、问题分析与解决

既然使用 STM32Cubeprogrammer 都能够正常下载,那么 STM32CubeIDE 按道理肯定也是可以的。经过跟踪编译过程发现,STM32CubeIDE 与 STM32Cubeprogrammer 使用的下载文件是各自独立的。也就是说 CubeIDE 并没有使用 STM32Cubeprogrammer 安装路径下的 bin 目录下的 STM32_Programmer_CLI 和相关资源文件。CubeIDE 下载使用的 bin 路径为:STM32CubeIDE_1.14.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.1.100.202311100844\tools\bin\STM32_Programmer_C LI.exe

找到 CubeIDE 安装路径下的 Flash loader 目录:

3.png

在 ExternalLoader 目录下只发现了一个 STM32U599J_DK 相关的 Flashloader, STM32U599J_DK 应该就是使用的这个 Flashloader 文件。

再次比对核实用户所创建的 CubeIDE 工程所用的 Flashloader:

4.png

原来 TouchGFX designer 所创建的 project 所使用的 Flashloader 名称为 MX25LM51245G_STM32U599J-DK.stldr,而在 CubeIDE 安装路径下 ExternalLoader 里面的名称则为 MX25UM51245G_STM32U5x9J-DK.stldr,二者名称不一致,使 CubeIDE 无法成功加载 FlashLoader,导致下载出错。问题原因已经找到,通过修改 CubeIDE 中 FlashLoader 的配置即可解决此问题,具体修改方式如下:

5.png

修改后,测试下载与仿真均正常。

04、总结

由于在 MCU 上运行的应用程序越来越复杂,因此,对于在片外 Flash 运行代码的需求越来越多,特别是针对 Flashless 形态的 MCU 都需要用户自己开发 Flashloader,建议用户使用与开发板一样的硬件接法。这样,就不必自己去重新开发 Flashloader 了。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 26

1. 前言 

很多工程师可能都有这样的困扰,项目工程在切换到不同 IDE 的时候,原本的中文注 释,却显示成了乱码,如果文件比较多,也不太可能重新备注这些注释。

大家在将工程移植到 STM32CubeIDE 时,同样会面临这样的困境,这里告诉大家如何在文件中正确显示中文注释。

2. 文件的配置 

对于 IDE 来说,中文注释之所以会显示为乱码,是因为被错误的解析了,或者说被错误的“协议”所解析而导致显示错乱,那么我们只要按照正确的或者兼容的“协议”解析中文字符即可。

我准备了这样的一个测试例子,测试文件分别由 IAR 和 KEIL 创建,并被编辑和保存过,然后加载到 STM32CubeIDE 中,通过调整文件的编码方式来正确显示中文注释。

2.1. KEIL 中文件的编码方式 

在 KEIL 中,通过菜单栏 Edit -> Configuration,进入配置界面,可以查看到文件的默认编码方式是 ANSI,见图 1,当然大家也可以更改为其他的编码方式。

1.png

▲ 图1. KEIL 中的文件编码方式

检查完编码方式后,我们在 KEIL 中新增了一个文件,里面使用中文进行注释了,见图 2。

2.png

▲ 图2. 中文注释在 KEIL 中的显示效果 

2.2. IAR 中文件的编码方式 

IAR 中,我们可以通过鼠标右击工程名称,进入“options”菜单栏,可以显示配置界面,可以查看到文件的默认编码方式是 C locale,见图 3,同时,修改文件的编码方式也是在这里。

3.png

▲ 图3. IAR 中的文件编码方式

我们同样也通过 IAR 新增了一个文件,在里面编写了中文的注释,见图 4。

4.png

▲ 图4. 中文注释在 IAR 中的显示效果 

2.3. STM32CubeIDE 中设置文件的编码方式 

我们将上述使用 KEIL 和 IAR 创建的文件,同时导入到了 STM32CubeIDE 中,会发现 中文显示乱码。通过修改文件的编码方式发现,对于 IAR 的默认编码方式所作的中文注释,需要使用 GBK 的方式进行显示,见图 5。而对于 KEIL 的 ANSI 编码方式所作的中文注释,可以使用 UTF-8 进行解析,见图 6。这样就可以正确的显示中文,不会出现乱码, 见图 7。

5.png

▲ 图5. 在 STM32CubeIDE 中的修改文件编码方式为 GBK

小技巧:如果你的上述界面中没有 GBK 选项,可以直接输入 GBK,并回车即可。

6.png

▲ 图6. 在 STM32CubeIDE 中的修改文件编码方式为 UTF-8 

7.png

▲ 图7. 中文注释在 STM32CubeIDE 中的显示效果

实际上,我们在移植过程中,有时候是不会注意之前的文件是用的哪种编码方式的, 我们可以用 UTF-8 和 GBK 分别尝试一下即可,因为大部分情况下,都能被这两者格式解析。

当然,大家也可以在开发工程之初,将工程的文件编码方式设置为最常见的 UTF-8, 这样中文就可以很好的被其他 IDE 所解析啦。

3. 小结 

以上通过一个简洁的方式向大家展示了,如何在 STM32CubeIDE 中显示中文注释,希望对大家有所帮助。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 65

01、前言

很多人以为使用STM32CubeIDE的时候就不能同时使用 STM32CubeProgrammer ,其实不然。ST-LINK 共享模式功能很早就已经具备,但是很多人并没有在意。

STM32CubeProgrammer 和 STM32CubeIDE 都能够使用ST-LINK共享模式。使用ST-LINK 共享模式,在使用 STM32CubeIDE 单步调试时,也可以使用 STM32CubeProgrammer 查看寄存器、内存以及选项字节。 

02、ST-LINK 共享模式

想要发掘工具的所有潜力,一种方法是仔细阅读工具的文档。对于使用 STM32CubeProgrammer 的用户,我推荐大家将【UM2237 STM32CubeProgrammer 用户手册】通读一遍。对于使用 STM32CubeIDE 的用户,我推荐大家将【UM2609 STM32CubeIDE 用户指南】通读一遍。在读的过程中,我们能够发现这两个文档里提到 了一个 ST-LINK 共享模式。

STM32CubeProgrammer 

我们可以看到 UM2237 如下所示提到了 STM32CubeProgrammer 支持 Shared 配置,意思是使能 shared 模式可以允许 2 个或者多个 STM32CubeProgrammer 或者其他调试工具连接同一个 ST-LINK。这里的其他调试工具可以是 STM32CubeIDE。 

1.png

STM32CubeIDE 

我们可以看到 UM2609 中说得更加详细。如下所示,它提到了,ST-LINK 共享模式的原理是使用ST-LINK Server;在共享模式下,STM32CubeIDE 和 STM32CubeProgrammer 可以同时使用;ST-LINK Server 的共享模式的端口默认是 7184 而且不能修改。
2.png

03、STM32CubeIDE 和 STM32CubeProgrammer 的协同调试的配置

我们先来找个简单的例子看下如何使用 ST-LINK 共享模式来进行协同调试。我们选取STM32H563的GPIO_IOToggle例程,它位于STM32Cube\Repository\STM32Cube_FW_H5_V1.0.0\Projects\NUCLEOH563ZI\Examples\GPIO\GPIO_IOToggle。请各位读者注意,你可以选择任何例程,不限于新发布的产品 STM32H5,也不限于简单的例程 GPIO_IOToggle。而且,即使你使用的 STM32CubeIDE 和 STM32CubeProgrammer 版本比我使用的要旧,这个功能大概率已经在哪里。当然我们总是推荐你保持 STM32Cube 工具为最新的稳定版本。对于 STM32CubeIDE,我们需要在调试配置里多进行一项配置。我们可以看到如下图所示蓝色选中的[Shared ST-LINK]。默认这一项是不选中的,我们需要这项功能就去打个勾。

3.png

接下来就是正常的编译,启动调试界面,让它在调试界面正常运行。我们不需要挂起 它。你看到的应该是下图这个样子。

4.png

然后我们转向 STM32CubeProgrammer 窗口。如果我们不用 ST-LINK 共享模式,我们这个时候是不能使用 STM32CubeProgrammer 进行连接,因为 ST-LINK 已经被占用。如下图所示。

5.png

同样共享模式不是 STM32CubeProgrammer 的默认配置。我们需要将 STM32CubeProgrammer 改成支持 ST-LINK 共享。

6.png

我们不想让程序从头开始,所以这里我们使用 “Hot plug”Mode。这样配置就完成了。我们可以得到如下图所示连接成功的样子:

7.png

04、几个调试案例

这里举出几个协同调试案例,供大家参考。STM32 用户若遇见 STM32CubeProgrammer 支持得更好的功能,就可以考虑协同调试的方法。

4.1. 寄存器抓取与保存

寄存器抓取与保存是早期 STM32CubeIDE 和 STM32CubeProgrammer 协同调试的一个典型场景。早期的 STM32CubeIDE 并不支持寄存器保存,虽然能查看寄存器,但是不能将寄存器的内容保存下来进行比较。当然现在 STM32CubeIDE 已经支持寄存器内容的保存, 并且支持运行时动态刷新。不过在文本格式上,STM32CubeProgrammer 依然更加的清晰。所以我们在使用 STM32CubeIDE 进行调试的同时,仍然有使用 STM32CubeProgrammer 来抓取寄存器和进行保存的需求。

寄存器的保存使用的菜单时高亮的[REG](Registers – BETA)。当我们点击[Read],然后 点击[Save to file]选择[All peripherals]或者[Currently displayed peripherals],就可以保存所 有的寄存器内容。保存的寄存器格式易于查看,带有相应的寄存器地址。

8.png

4.2. 查看选项字节 

查看选项字节是 STM32CubeProgrammer 的优势。当 STM32CubeIDE 正在调试应用时,若我们怀疑某个选项字节设置不对,我们可以不必关闭 STM32CubeIDE,而直接使用 STM32CubeProgrammer 进行查看。

9.png

4.3. 文件比较 

如果我们怀疑 Flash 的内容与需要下载的程序不同,同样我们在不关闭 STM32CubeIDE 的调试界面就可以使用 STM32CubeProgrammer 检查 Flash。例如:

10.png

05、小结

ST-LINK 共享模式是一种很有用的功能,可以让 STM32Cube 多个工具发挥各自的特长,对同一设备在同一时间进行协同调试,可以极大的提高 STM32 开发效率。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 95

01、前言

大家都知道ST的ClassB功能安全软件设计包是免费的,也有众多客户基于STM32CubeIDE免费的IDE进行开发,本文档将展示如何轻松地实现ClassB在STM32CubeIDE上的移植。

02、准备

硬件:NUCLEO-G070

软件:X-CUBE-CLASSB version 2.3.0

03、创建CubeMX工程


在CubeMX中创建闪灯和串口打印的基础工程,并在实验板上验证工程的正确性。

然后继续配置IWDG、WWDG、CRC外设。为了避免程序在移植和调试时产生复位,可以在CubeMX中配置为不调用。

1.png

将X-CUBE-CLASSB V2.3.0中整个Middleware文件夹复制到目标工程目录下:

2.png

复制ClassB相关的3个汇编文件,如下图所示:

3.png

复制“crc_gen_gcc.bat”脚本(注意要修改bat中的工程名称):

4.png

修改bat文件中的名称为对应工程的名称:

5.png

修改id链接文件,添加ClassB相关的section信息:

6.png

添加ClassB文件的路径和文件夹:


7.png

复制“stm32xx_STLparam.h”到目标工程的inc文件夹下:

8.png

在main.h中添加必要的宏定义

#define USARTx USART1

#define MAX_FLASH_LATENCY FLASH_LATENCY_1

#define _HAL_RCC_CLEAR_FLAG_HAL_RCC_CLEAR_RE SET_FLAGS

#define USART_Configuration MX_USART1_UART_Init

根据编译提示,消除编译错误

在工程选项中添加编译步骤(添加“.bat”):

9.png


arm-none-eabi-objcopy-O binary"${BuildArtifactFile BaseName}.elf"

"${BuildArtifactFileBaseName}.bin"&&arm-none-eabi-size"${BuildArtifactFileName}"&&..\crc_gen_gcc. bat

在排除基本的编译错误后,可以得到如下编译通过的信息:

10.png

然后我们可以通过配置下载选项,将带有CRC校验值的工程下载到板子上:

11.png


在串口视图中可以看到ClassB工程运行的状态信息:

12.png

04、移植过程中可能遇到的问题

问题1:编译通过,无错误,但是发现hex文件只有132B。

方法:通过map文件,发现source包含的一些文件夹不见了,在工程选项中添加对应的文件即可。

问题2:#define ALLOC_GLOBALS这个宏定义是为了防止变量的多次重复定义。

方法:需要检查其应当放在对应的相关变量的头文件之前。

问题3:初始化时,在CubeIDE中出现了各种startup阶段的失败。

方法:需要将Class B lib的优化等级设置为-O1才可以。

问题4:Runtime时出现“Run-time Flash CRC Error”的错误。

方法:原因在于为了方便调试,下载了没有带CRC的hex文件,改成带CRC的hex文件后就没问题了。

问题5:时钟检测不过,测试时,发现工程为F030,但实际芯片是F042,二者存在时钟配置上的差异,主要是SystemInit和SystemCoreClockUpdate函数中的差异。

方法:按照实际芯片正确配置时钟即可。

05、小结

在移植ClassB的过程中,难免会出现各种各样的编译错误,我们要有耐心,根据工具的提示,逐个消除错误即可。本文档提供了对应的例程,用户可以对比参考使用。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 154

1. 前言

编译警告对于工程师们来说,是再常见不过的东西了。对于严谨的工程师们,任何 warning 都是不会忽视的。

2. 巧妙使用 warning

在 STM32CubeIDE 中可以通过warning(甚至 error)的方式来通知工程师,使得一些容易遗漏的配置得到重视。

例如,在释放参考代码给客户时,希望客户注意到里面的项目名称和项目版本,那么我们可以在代码中,通过“#error ”来强调必须要修改的信息,通过“#warning”来备注需要注意的信息。具体代码如图 1:

1.png

这样,当客户编译工程时,会出现 error 和 warning,见图 2,只有将“#error”和 “#warning”两行分别注释掉,才会分别消除这两项编译信息,以此达到警示客户的目的。

2.png

2.1. 主动屏蔽特定的 warning

在有些场景,我们还可以在特定的代码或者文件作用域内,主动屏蔽特定的 warning。

例如,工程中写了一个测试函数“void MyTestFunction(void)”,但是在工程中暂时没有被调用,直接编译会得到“Wunused-function”的 warning。

但是如果在代码中添加这样的语句: 

#pragma GCC diagnostic ignored "-Wunused-function"。 

/*此区间内,如果出现函数仅申明,但是没有被调用时,编译不产生warning*/ void MyTestFunction(void){…} 

#pragma GCC diagnostic pop 

因为我们配置了“-Wunused-function”,那么在编译时,即使 MyTestFunction 没有 被调用,编译也不产生 warning。

我们还可以在 STM32CubeIDE 中,通过“Help”->“Information Center”->“Read STM32CubeIDE Documentation”->“C/C++ Compiler”,找到 GCC 编译器文档,从而发现更多的 warning 选项,根据需要主动屏蔽更多的 warning。见图 3 :

3.png

3. 小结

事实上,在编译项目时,warning 和 error 同样重要,部分隐蔽的问题可能就和 warning 相关。当我们对工程代码和编译器有了更深层次的了解后,可以巧妙地使用和屏蔽 warning,帮我们更好地管理项目。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 83

问题描述

近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。

问题分析

STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:

“STM32CubeIDE

解决方法

通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的

__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。

例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做:

“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”

注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义的堆和栈空间存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。

验证

在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的__sbrk_heap_end 参数。

“STM32CubeIDE

“STM32CubeIDE

可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。

注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。

来源:STM32单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 375

页面

订阅 RSS - STM32CubeIDE