STM32CubeMX常见Bug及解决指南
摘要:使用STM32CubeMX生成程序时常见三个Bug及解决方法:1)编译器报错"expected a filename",原因是缺少宏定义,需在FreeRTOSConfig.h中添加#define CMSIS_device_header "stm32f1xx.h";2)报错"Definition INCLUDE_xTaskGetCurrentT
1.直接用stm32cubemx 生成程序时出现的bug
(1) 为什么会报这个错?
原因分析: 编译器在编译 freertos_os2.h 文件的第 31 行时卡住了,报错提示 error: #13: expected a file name(需要一个文件名)。
罪魁祸首: 紧接着报错信息的下一行显示了出问题的代码是 #include CMSIS_device_header。
底层逻辑: 在 C 语言里,#include 后面必须跟着带双引号 "" 或尖括号 <> 的文件名。CMSIS_device_header 本质上应该是一个宏定义,它在编译时应该自动被替换成具体的芯片头文件(例如 "stm32f1xx.h")。但是,CubeMX 生成代码时“忘了”在工程里定义这个宏!导致编译器傻乎乎地直接去寻找一个名叫 CMSIS_device_header 的文件,自然就找不到了。

解决方法:
在 Keil 左侧的工程目录树中,点开 Application/User/Core 这个文件夹,在里面找到并双击打开 FreeRTOSConfig.h 文件。
添加宏定义代码: 在这个文件的开头部分,找到系统为你预留的注释块。
在 /* USER CODE BEGIN Includes */ 和 /* USER CODE END Includes */ 之间,
敲入代码:#define CMSIS_device_header "stm32f1xx.h"
2.#error directive: "Definition INCLUDE_xTaskGetCurrentTaskHandle must equal 1..."。
原因: 你之前选择了使用较新的 CMSIS_V2 接口。这个 V2 版本的接口在底层需要调用 FreeRTOS 的一个特定函数(用来获取当前任务的句柄)。但是,CubeMX 在生成配置文件时,默认把这个功能**关闭(设为 0)**了,导致两边不匹配,编译器只能报错罢工。

解决方法:直接在 stm32cubemx 中修改,打开获取当前句柄的函数
1. 左侧点击 Middleware -> FREERTOS。
2.在中间偏下的配置框里,点击 Include parameters 这个标签页。
3.找到 vTaskGetCurrentTaskHandle (或者叫 xTaskGetCurrentTaskHandle)。
4.把它的状态从 Disabled 改成 Enabled。
5.重新点击右上角的 GENERATE CODE。
3.两个systick_Handler 函数起冲突
根本原因:你选择了高级的 CMSIS_V2 接口,ST 官方的 cmsis_os2.c 文件里已经极其贴心地帮你写好了一个 SysTick_Handler 函数来给系统提供心跳。
但是!CubeMX 的代码生成器有点“蠢”,它在生成 FreeRTOSConfig.h 时,忘了把默认的宏替换给删掉。导致 FreeRTOS 的 port.c 文件也强制生成了一个 SysTick_Handler。俗话说“一山不容二虎”,链接器只能报错罢工。

解决方法:注释掉一个systick_Handler
1.保持 FreeRTOSConfig.h 文件打开。
2.一直往下拉,拉到文件的最底部(大约在 140 行左右)。
3.你会看到类似下面这三行负责“中断重定向”的宏定义:
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
4.找到 xPortSysTickHandler 这一行,在它最前面加上 //,把它注释掉。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)