CubeIDE使用技巧记录

​ 创建此集的目的为记录下遇到的CubeIDE的各种使用技巧和报错并进行解决的方案,以便以后再次遇到时可复查

Failed to start GDB server报错解决方案

​ 在使用CubeIDE下载程序时,有时会在下载到79%的时候弹窗报错,报错警告为

1
Failed to start GDB server

​ 报错的意思是启动GDB服务器失败

​ 这个报错很奇怪,偶尔会出现,哪怕是重启IDE、重启电脑也无法解决,就一直存在着,无法进行代码下载和调试。网上查了很多方法也是无法解决,在比电赛省赛的时候我的队友也出现过这样子的问题,十分令人头疼。

​ 在后续查找资料并询问毅子哥后,终于得到了完美的解决方案。

解决方案

点击运行或调试旁边的倒三角号,进入运行配置

选择调试器选项,在GDB连接设置里面,一般默认端口号码是6xxxx,以6开头的五位数,将其随机改为4xxxx,以4开头的五位数,点击右下角应用,运行,报错解决。

报错原因

​ 应该是端口被某一个进程给占用了,其实应该早点发现的,在弹窗报错的同时,在控制台窗口也有6xxxx端口被占用的英文,但并未注意到,原来是端口占用的问题。

根据毅子哥的经验说,以6、5开头的五位数端口经常容易被其他进程占用,最好是设置一个以4开头的端口,至于为什么纠结与五位数,只是因为默认是五位数所以沿袭而已。实际上根据端口设置的原理,设一个随机数,只要该数字端口没有被占用,其实都是可用的。

CubeIDE使用串口

​ CubeIDE其实也集成了串口的使用,方便我们不用切窗口调试和一个一个文件夹去找串口助手。

​ 食用方法:

如图选择进入选项3

选择Serial Port

选择New新建

设置名字、端口、波特率、数据量、校检位、停止位,实际上,基本都是用的默认设置,只需要设置名字和端口号波特率即可

因为我工程设置用的GB2312,所以打印类型也选择GBK,这样串口打印出来也可以打印中文打印。

如图示,已经作为串口窗口打印了,关闭则点击右上角叉号即可,需要提醒的一点是,选中命令窗口后直接敲入键盘即可完成发送,这些可用于FreeRTOS cil串口命令调试。

CubeIDE使用德古拉主题和一些小调节

​ 软件自带了几个主题,具体可以点击菜单栏 Windows-> preference,搜索 theme并尝试。但官方主题不太好用,而且长时间使用,尤其是夜晚使用对眼睛十分不友好,我个人不是很喜欢,个人更加偏好于Dark的代码工作区主题,好看,代码各种颜色区分开显眼易读,而且看久了眼睛不会累。

​ 代码编辑界面默认颜色为白色。对于长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以改变workspace的背景色,可以使眼睛舒服一些。

​ 德古拉主题是VScode上十分受欢迎的主题,是有史以来最流行的VS代码主题之一,我自己也在VScode上使用这一代码主题,代码主题色调令人十分喜欢,展示一下的话是如下

VScode主题展示

​ 话不多说,首先我们需要先安装外部主题,菜单栏 Help,在下拉栏中双击 Eclipse Marketplace打开。选择Popular如图示安装。之后按照软件提示,一路默认安装即可。最后重启软件,选择主题。

打开位置

选择

​ 如果后面还想更改,点击菜单栏 Windows-> preference,搜索 theme并尝试。

change_theme

​ 如果电脑里有安装git,接下来使用git clone德古拉的主题文件,选一个存放目录,打开CMD命令窗,输入

1
git clone https://github.com/dracula/eclipse.git

​ 如果没有的话,可以打开以下网址,下载压缩包

1
https://github.com/dracula/eclipse.git

下载主题文件

​ 点击菜单栏 Windows-> preference,搜索 theme,如图改好第一步后,选择Import,单击导入并dracula-theme.xml从下载的存储库中选择,在Editor theme内修改为Dracula Theme,勾选下面两项,点击应用并关闭,设置完成

image-20220816011054744

中文注释字体显示问题解决

​ 当我们尝试中文注释和英文注释混编的时候,会出现中文注释突然变小的问题

中文注释变小

解决办法: 菜单栏 Windows-> preference

解决办法

使用printf函数

​ 感谢毅子哥一直以来的教学,源地址

1
https://blog.9cats.link/posts/1002/

printf函数重定向

​ printf 函数极为重要,利用好可以极大帮助分析单片机运行状态。以下是将 printf 重定向到串口的方法,任选一种即可生效。

1
2
3
4
5
6
#include "stdio.h"
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdio.h"
int _write(int file, char *ptr, int len)
{
int count = len;
if (file == 1) { // stdout
while (count > 0) {
if(*ptr == '\n')
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 0xFFFFFFFF);
else
HAL_UART_Transmit(&huart1, (uint8_t *)ptr , 1, 0xFFFFFFFF);
++ptr;--count;
}
}
return len;
}

printf输出小数

​ 有的时候发现,printf可以输出整数和字符串,但是不能输出小数,这个时候需要配置以下内容:

​ 在项目管理窗口,右键项目,选择底部的 Properties,再点击 C/C++ Build > MCU Settings 选项卡中,勾选 Use float with printf from newlib-nano (-u _printf_float)

2022-03-05_00-07-32

对代码块进行折叠

​ 对应很长的函数、if嵌套等等,为了方便我们拖到较下面的代码,我们可以将其折叠起来,但是CubeIDE这个功能是默认关闭的,对于以前用Keil时,经常使用折叠功能的我来说还是比较喜欢这个功能的。

​ 点击菜单栏 Windows-> preference,如果已经安装中文插件,那就是窗口->首选项

设置项

​ 展开如图示的选项框,如图勾选两个后面带括号的Enable,就能折叠它所枚举的选项了,点击右下角应用或应用并关闭保存设置。

工程复制

​ 开发过程中经常需要复制一个已有的项目,亦或是导入外部的工程,STM32CubeIDE不允许同一个工作空间中出现同名项目,这是就需要修改名称了

方法一:

​ 直接在工作区内选中要复制的项目,Ctrl+C复制,Ctrl+v粘贴,工作区会提示你给复制出的新项目重命名,命名一个不同的名字即可。这种方法复制过来的工程,与原工程完全一致,不需要再重新设置头文件路径。

方法二:

在资源管理器中复制粘贴项目

  1. 复制已有工程,并重命名

  2. 在资源管理器中,删除新工程下的 .mxproject 文件!删除新工程下的 .mxproject 文件!删除新工程下的 .mxproject 文件!

  3. 双击新项目名并重新打开,在IDE中,右键项目名,选择 Rename 重命名

  4. 删除新项目下原来项目命名的 .launch和.cfg 文件。

  5. 现在可以自由编辑新工程了

这种方法有时需要对头文件路径、FPU启用与否进行重新设置。

导入外部工程

​ 外部工程没有与工作区内名称相同的项目时,可直接从文件->从文件系统中打开项目选择项目Cubemx文件所在地即可导入。

导入工程

​ 外部工程与工作区内名称相同时,需更改文件夹名称,将Cubemx文件重命名至与文件夹名称一致,再进行导入

内部FLASH或SDRAM开辟空间

​ 有的时候,我们需要存储大数组,或者说在使用H7等一类高级的STM32,驱动RGB屏时,需要使用SDRAM,这个时候就需要使用这种方法。

​ 先选中存储区,格式是<你的单片机型号>_FLASH.ld,当然同样的设置可以去 _RAM里面实现,但要注意RAM的大小

选择内存区

​ 可以看到第一个就是内部FLASH区,我选择把数据放在FLASH区内,可以看到FLASH区的起始位置是0x08000000,用8位的16进制数表示,大小为2048KB,也就是内部FLASH有2MB,可以说是很大了

MEMORY

​ 然后我设置我自己的区,随意命名为MYRAM,这里的起始地址是有讲究的,我们看看CubeIDE默认布局的右下角,这里显示了起始地址、结束地址、尺寸大小、剩余空间、已使用大小、使用率,这里我们注意看已使用大小,这里已经使用了39.21KB,我们设置的空间不要与使用空间重叠,要保证其一开始就是空的,这样我们才能使用

MEMORY

内存使用

​ 那么要怎么设置呢?这里以FLASH的起始地址为零点,从039.21KB是已经被使用的状况,我们保守预测一下总使用量是不会超过100KB的,所以我们从FLASH的100KB的位置挖出来一个空间,使用大小就是我们上面设置的LENGTH = 20K,也就是从FLASH区将100KB100KB+20KB的空间挖出来供我们使用。我们知道,1KB=1024bit,打开电脑自带的计算器,切换到程序员模式,1024*100DEC是十进制,HEX是十六进制,所以我们得到100KB代表的十六进制为**0x00019000,加上FLASH的起始地址0x08000000,就是我们设置的起始位置0x08019000**

​ 切记,这里设置的空间绝对不可以无中生有,要根据自己STM32的硬件资源来设置,凭空设置一个实际没有的起始地址或是将原有的LENGTH改大,这相当于掩耳盗铃,多设置的空间是完全用不了的。只有几种情况下才需要更改默认的LENGTH大小,一种是板子外设支持,板子上的硬件就是有更大空间,这个就需要自己翻手册,例如这里的SDRAM生成默认是没有的,但实际上我的板子上有32M,所以可以更改;另一种是程序设计过程中设置的数组过大超空间报错了,在这里强行改大到不显示报错,然后上图内存使用旁边的Memory Details逐个查看是哪个数组太占空间了。

计算

​ 保存,编译,往下滑就能发现内存区多了我们设置的新区域

新区域

​ 创建新空间是完成了,接下来还需要指定数组保存至该空间

​ 往下翻,直到找到**. = ALIGN(4)**,在其下面,增加如下的代码

设置保存位置

1
2
3
4
5
6
/* MYRAM */
._myram(NOLOAD) :
{
. = ALIGN(4);
. = ALIGN(4);
} >MYRAM

​ 保存,然后在主程序里使用就是

使用

1
__attribute__((section("._myram"))) uint32_t ad_dr[2048];

​ 前面的前缀指定了这个数组保存的地址,uint32_t的大小是4个字节,2048=2k,所以使用空间是8k,只是声明不使用是不会占用空间的,编译器会直接滤掉不编译,这里为了展示加了串没什么用的代码

展示

END