【ARM】MDK-STM32g0xx.h文件与Define规则记录

1、 文档目标

记录问题STM32g0xx.h等有关ST的可读文件,尽量勿修改文件格式及对其代码进行添加和删减,记录查找问题的过程中的疑惑,并如何给予客户正确的回复,帮助销售完成验收,以便后续尾款支付。

2、 问题场景

在工程中客户移除了ST头文件的可读保护并进行了该文件的代码修改,在STM32g0xx.h中进行了函数的宏定义,但应用处并没有添加任何头文件,编译不报错。若在其他文件中添加该函数的宏定义,编译报错。

图2-1(未应用未报错,不符合语法规则)

注:绝对不建议删除对stm32gOxx.h文件的只读保护。所有来自ST的只读头文件都有很好的保护理由。

3、软硬件环境

1)、软件版本:MDK 5.38 Arm 编译器版本 6.19

2)、电脑环境:Windows 11

3)、外设硬件:无

4、解决方法

1)、宏定义的寻找模式

#define指令是C预处理器的一部分。在编译之前进行处理。一个头文件没有被你的项目使用或引用,这个头文件将不会成为你的项目构建的一部分,在项目中根本不使用由#define定义的那些参数,则它们将不会作为编译的一部分包含在内。

2)、有关ST的只读头文件。

宏定义在STM32G0xx .h中,它总是包含在基于STM32G0xx设备的项目中并使用。在后台运行的编译器工具链负责动态语法检查以及文本完成在某些情况下可能是不可靠的,所以在你的情况下,宏定义中函数等仍然是灰色,并且函数应用处没有添加头文件,但编译通过。

定义在STM32G0xx .h中的函数,它总是包含在基于STM32G0xx设备的项目中并使用。将STM32G0xx .h修改部分还原,并且将其文件格式设置为可读即可,如图4-1在Comm.h文件并进行宏定义,而后编译出现错误,符合检查动态语法规则。

图4-1(未应用报错,符合语法规则)

 

————————————————————————

​ 版权声明:本文为亿道电子技术有限公司原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

### 关于MDK-ARM中`u8`未定义的问题 在MDK-ARM开发环境中遇到`u8`未定义的错误通常是因为缺少必要的头文件或者宏定义。以下是可能的原因以及解决方案: #### 可能原因分析 1. **数据类型的自定义缺失** `u8`通常是开发者为了简化代码而自定义的数据类型,表示无符号8位整数(unsigned char)。如果项目中没有包含相应的类型定义,则会出现该错误。 2. **头文件未正确引入** 如果项目的源码依赖某些特定库或框架中的类型定义(如STM32标准外设库或其他第三方库),但这些头文件未被正确包含到当前工程中,也会引发此类问题。 3. **编译器设置不匹配** 不同版本的编译器对关键字和语法支持可能存在差异。例如,在较新版本的Keil MDK中,默认不再识别旧版代码中的一些非标准类型名称。 --- #### 解决方案 ##### 方法一:手动定义`u8` 可以在全局范围内通过添加如下代码来显式声明`u8`类型: ```c typedef unsigned char u8; ``` 将其放置在一个公共头文件中(如`common.h`),并确保此头文件在整个工程项目中都被包含。这样可以统一管理所有类似的类型定义[^1]。 ##### 方法二:检查现有头文件 确认是否已经存在一个专门用于类型定义的头文件(常见命名方式有`type_def.h`, `stdint.h` 或者其他类似名字)。如果是的话,请验证其中是否有类似于以下的内容: ```c #ifndef __TYPE_DEF_H__ #define __TYPE_DEF_H__ #include <stdint.h> typedef uint8_t u8; // 使用 C99 标准定义替代传统 typedef // ... 其他类型定义 ... #endif /* __TYPE_DEF_H__ */ ``` 如果没有找到上述内容,则需要补充进去;如果有但是仍然报错,则可能是路径配置有问题,需进一步排查 Include Path 设置是否正确指向了该头文件所在目录[^2]。 ##### 方法三:调整编译选项兼容模式 有时由于历史遗留原因,早期代码习惯采用非ANSI/ISO标准化的形式书写程序。此时可以通过修改编译参数允许更宽松的语言特性解析规则。具体操作步骤如下: - 打开UVision IDE; - 进入目标工程属性对话框 (`Options for Target`); - 切换至"C/C++"标签页下寻找"Language Settings"; - 勾选启用扩展功能开关 (Enable language extensions)[^4]. 注意这种方法虽然能够快速解决问题,但从长远来看并不推荐,因为它可能导致生成不符合现代编码规范的应用程序。 --- ### 示例修正后的代码片段 假设原始代码中有这样的变量声明: ```c u8 data_buffer[10]; ``` 经过以上任一种处理之后应该正常工作。下面是完整的测试例子供参考: ```c #include "motor.h" #include "type_def.h" int main(void){ u8 test_var = 0xA5; while(1){ // Your application logic here... } } ``` --- ### 总结 综上所述,“undefined identifier 'u8'”这一类错误主要是因为缺乏适当的数据类型映射造成的。按照前述三种途径逐一尝试总能找到合适的办法加以修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值