目的
本文主要记录了STM32CubeIDE使用中的一些要点、方法、技巧等等。
添加引用自己的文件
新建文件/文件夹:
- 在IDE左侧项目资源管理器(Project Explorer)中选择对应目录,然后右键
New
子菜单中可以选择新建源码文件、头文件、文件夹、源码文件夹等(如果没有请选择Other,在弹出窗口的C/C++中查找);
导入文件/文件夹:
- 方式一:在IDE左侧项目资源管理器(Project Explorer)中选择对应目录,然后右键
import...
,选择弹出窗口的General > File System 然后 Next>
,在新窗口中浏览选择要导入的目录/文件,然后导入; - 方式二:直接将要添加的文件/文件夹拖入到项目资源管理器(Project Explorer)中对应目录(要添加的文件/文件夹不要提交放在该目录中,拖动添加时会询问是否复制到该目录中或是仅仅链接);
将头文件和源码添加到项目中:
添加文件和文件夹后在使用时可能会提示找不到,需要将头文件和源码路径添加到项目中, 在IDE左侧项目资源管理器(Project Explorer)中选择项目右键 Prorerties
在弹出窗口的 C/C++ General > Paths and Symbols
中的 Includes
、 Source Location
分页下分别添加对应路径:
另外在多说一句:默认情况下自己的文件中只要引用 main.h
就可以调用STM32CubeMX配置导入的各种库了。
编译生成 bin / hex 文件
默认情况下STM32CubeIDE编译生成的是elf格式的固件,如果想要bin或hex格式的固件可以在IDE左侧项目资源管理器(Project Explorer)中选择项目右键 Prorerties
在弹出窗口的 C/C++ Build > Settings > Tool Settings > MCU Postbuild outputs
中选中生成bin和hex文件即可:
编译优化等级设置
在IDE左侧项目资源管理器(Project Explorer)中选择项目右键 Prorerties
在弹出窗口的 C/C++ Build > Settings > Tool Settings > MCU xxx Compiler > Optimization
中可以设置编译优化等级。优化等级会影响编译生成固件占用Flash、RAM大小,影响运行效率,优化设置有可能会导致代码运行异常,需要根据实际情况设置:
全局宏定义
在IDE左侧项目资源管理器(Project Explorer)中选择项目右键 Prorerties
在弹出窗口的 C/C++ General > Paths and Symbols > Symbols
中可以添加全局宏定义:
assert_param函数使用
STM32 HAL库中的函数大多内部都有assert_param函数,该函数用来检查用户输入参数是否正确,默认情况下在stm32fxxx_hal_conf.h文件中可以找到如下定义:
/* ########################## Assert Selection ############################## */
/**
* @brief Uncomment the line below to expanse the "assert_param" macro in the
* HAL drivers code
*/
/* #define USE_FULL_ASSERT 1U */
/* Exported macro ------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */
在main.c中可以找到下面语句:
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
可以看到默认情况下assert_param是没有启用的,可以通过下面几种方式之一启用:
- 在STM32CubeMX生成代码时勾选
Project Manager > Code Generator > HAL Settings > Enable Full Assert
; - 在项目全局宏定义中添加
USE_FULL_ASSERT
(方式见上节,推荐); - 手动将stm32fxxx_hal_conf.h文件中
/* #define USE_FULL_ASSERT 1U */
取消注释(不推荐);
启用assert_param后可以在main.c的 void assert_failed(uint8_t *file, uint32_t line){}
函数中添加语句,比如通过串口或SWV打印输出相关信息,该函数会在你使用HAL库函数输入参数错误的时候运行。
正式发布版的程序中建议关闭该功能,因为该功能对性能和固件体积影响比较大。
调试异常
STM32CubeIDE有时会出现启动调试报错或是调试无数据上传等异常,排除硬件和调试配置等原因后还是异常的话,可以尝试重启STM32CubeIDE,若还是不行尝试重启电脑。
使用C++
STM32CubeIDE可以在新建项目时选择建立为C++项目,或是在已有的C项目中右击选择 Convert to C++
将项目转为C++项目。但是目前版本中(1.0.2)如果你在该C++项目中使用.cpp文件然后编译会报错。原因是该C++项目的main()函数存在于mian.c中,导致至少有一个.c文件会引用到某个.cpp文件中的内容,最终编译时报错。解决方法很简单,将mian.c重命名为mian.cpp就成。
注意事项:
- 当你用STM32CubeMX重新生成代码后项目中就会有一个main.c和一个main.cpp,你需要根据实际情况整合代码,保留一份main.cpp;
- 根据使用情况可能需要将main.h中以下几行代码注释掉:
#ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif
STM32CubeMX代码生成异常
偶尔会碰到在STM32CubeMX中配置了资源生成代码,但代码并未正确配置生成的情况,尝试重新在STM32CubeMX中动一动相关资源选项,然后重新生成代码,一般重复之后就可以正确生成代码了。
总结
要点、方法、技巧等没法一下子全部描述全面,本文将依据个人使用情况持续更新。