STM32CubeIDE

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)。

围观 29

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)。

围观 71

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)。

围观 56

问题描述

近日接到一客户需求,其欲在 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)。

围观 313

页面

订阅 RSS - STM32CubeIDE