STM32F401RE HAL I2C编程报错:int与uint8_t*类型不兼容,求转换方法
解决STM32 HAL库I2C写函数的类型不兼容问题
我来帮你搞定这个报错!你遇到的问题是因为HAL_I2C_Mem_Write的pData参数要求的是指向uint8_t类型的指针,但你直接传入了整数0x01(也就是int类型的数值),两者类型完全不匹配,所以编译器抛出了错误。下面给你几种正确的解决方式:
方法1:定义变量传地址(最安全规范)
这是最推荐的做法,清晰易懂且没有风险:
// 先定义一个uint8_t类型的变量,存储要写入的数据 uint8_t write_data = 0x01; // 传入变量的地址(&write_data会自动转成uint8_t*类型) HAL_I2C_Mem_Write(hi2c, MPU9250_ADDRESS, PWR_MGMT_1, 0x01, &write_data, 1, 100);
这样函数就能正确读取到你要写入的0x01,完全符合参数要求。
方法2:使用复合字面量(适合临时写单个数据)
如果不想单独定义变量,C99及以上标准支持的复合字面量可以帮你快速创建一个临时的uint8_t数组,数组名会自动转为指针:
HAL_I2C_Mem_Write(hi2c, MPU9250_ADDRESS, PWR_MGMT_1, 0x01, (uint8_t[]){0x01}, 1, 100);
STM32常用的GCC编译器默认支持C99,所以这个写法没问题,代码更紧凑。
❌ 绝对要避免的错误写法
不要直接把整数强制转成指针,比如:
// 严重错误!会导致未定义行为(大概率触发硬件错误) HAL_I2C_Mem_Write(hi2c, MPU9250_ADDRESS, PWR_MGMT_1, 0x01, (uint8_t*)0x01, 1, 100);
这种写法把0x01当成了内存地址,函数会尝试去读取这个地址的内容,但STM32的0x01地址属于无效内存区域,执行后会直接触发HardFault,绝对不能这么做!
内容的提问来源于stack exchange,提问作者Furkan Mola




